diff --git a/.agent/AGENT.md b/.agent/AGENT.md index 0f732ba..deaf3c4 100644 --- a/.agent/AGENT.md +++ b/.agent/AGENT.md @@ -11,7 +11,7 @@ You are working on **La Fabrik**, an interactive 3D web experience built with Re ## Current Implementation - Stack: React 19, Three.js, `@react-three/fiber`, `@react-three/drei`, `@react-three/rapier`, TypeScript, Vite -- No external global state library is used. +- Zustand is used for shared game progression state. - Current singleton-style services are limited to: - `InteractionManager` - `AudioManager` @@ -24,7 +24,8 @@ You are working on **La Fabrik**, an interactive 3D web experience built with Re ## Current Architecture Rules -- Scene objects live in `src/world/` and `src/components/3d/`. +- Scene objects live in `src/world/` and `src/components/three/`. +- Shared 3D components are grouped by domain under `src/components/three/models/`, `src/components/three/interaction/`, `src/components/three/gameplay/`, and `src/components/three/world/`. - HTML overlays live in `src/components/ui/`. - Shared static config lives in `src/data/`. - Debug tooling lives in `src/utils/debug/` and `src/hooks/debug/`. diff --git a/.agent/skills/debug.md b/.agent/skills/debug.md index 94ae992..7a0cd78 100644 --- a/.agent/skills/debug.md +++ b/.agent/skills/debug.md @@ -58,19 +58,18 @@ if (debug.active) { r3f-perf is loaded only in debug mode to avoid dependency issues in production: ```tsx -// src/utils/debug/DebugPerf.tsx import { Suspense, lazy } from "react"; -import { Debug } from "@/utils/debug/Debug"; +import { useShowDebugPerf } from "@/hooks/debug/useShowDebugPerf"; const Perf = lazy(() => import("r3f-perf").then((m) => ({ default: m.Perf }))); export function DebugPerf() { - const debug = Debug.getInstance(); - if (!debug.active) return null; + const showDebugPerf = useShowDebugPerf(); + if (!showDebugPerf) return null; return ( - + ); } @@ -89,6 +88,9 @@ Usage in Canvas: - All debug UI goes through `Debug.getInstance()` — never inline `if (isDev)` checks - r3f-perf is always lazy-imported, never a hard dependency in scene components -- Debug folders should be organized by domain (Lighting, PostFX, Player, Zone) +- Debug folders should be organized by domain (Lighting, Player, Zone, Interaction) +- Global debug controls include camera mode, scene mode, `R3F Perf`, and `Debug Overlay` +- Interaction-specific controls such as interaction spheres belong in the `Interaction` folder +- HTML debug panels should be grouped under `src/components/ui/debug/DebugOverlayLayout.tsx` - Debug panel must not affect production builds — it simply doesn't mount when `?debug` is absent - Clean up debug folders in `destroy()` when relevant diff --git a/.agent/skills/managers.md b/.agent/skills/managers.md index 3fea605..37c004c 100644 --- a/.agent/skills/managers.md +++ b/.agent/skills/managers.md @@ -28,14 +28,17 @@ export class SomeManager { ## Managers in this project -| Manager | File | Role | -| ------------------ | -------------------------------------- | ---------------------------------------------------------------------------------------------------------- | -| `GameManager` | `src/stateManager/GameManager.ts` | Single source of truth. Owns phase, zone, mission, input lock, dialogue. Has `subscribe()` + `getState()`. | -| `CinematicManager` | `src/stateManager/CinematicManager.ts` | GSAP timelines. Locks/unlocks input via GameManager. | -| `AudioManager` | `src/stateManager/AudioManager.ts` | Music, SFX, spatial audio. Reads phase from GameManager. | -| `ZoneManager` | `src/stateManager/ZoneManager.ts` | Zone entry/exit detection, LOD triggers. Notifies GameManager of zone changes. | +| Manager | File | Role | +| -------------------- | ------------------------------------ | ----------------------------------------------------------------------------- | +| `AudioManager` | `src/managers/AudioManager.ts` | Music and SFX playback. | +| `InteractionManager` | `src/managers/InteractionManager.ts` | Focus, nearby, trigger, grab, and hand-grab interaction state. | +| `GameManager` | target-state only | Future single source of truth for phase, zone, mission, input lock, dialogue. | +| `CinematicManager` | target-state only | Future GSAP timeline orchestrator. | +| `ZoneManager` | target-state only | Future zone entry/exit detection and LOD triggers. | -## GameManager is the orchestrator +## Target-State GameManager + +`GameManager` does not exist in the current implementation. The following pattern is target-state guidance only and should not be applied until the manager exists in code. ```ts export class GameManager { @@ -51,7 +54,7 @@ export class GameManager { } ``` -Components and hooks access other managers **through GameManager only**: +When a `GameManager` exists, components and hooks should access other managers through it: ```ts // Correct @@ -61,7 +64,7 @@ GameManager.getInstance().cinematic.play("intro"); CinematicManager.getInstance().play("intro"); ``` -## Subscribe pattern (GameManager only) +## Target-State Subscribe Pattern ```ts private listeners = new Set<() => void>() @@ -76,9 +79,9 @@ private emit(): void { } ``` -Every `set*()` method calls `this.emit()` to notify subscribers. +In that target-state manager, every `set*()` method calls `this.emit()` to notify subscribers. -## React bridge hook +## Target-State React Bridge Hook ```ts // hooks/useGameState.ts @@ -96,8 +99,8 @@ export function useGameState() { ## Rules -- Max 4 managers total -- Only `GameManager` holds durable state with `subscribe()` -- Other managers are side-effect handlers — they do not store persistent state -- Always call `destroy()` on cleanup (App unmount) -- Never create manager instances with `new` — always use `.getInstance()` +- Do not add a `GameManager` unless the feature requires a real shared gameplay state owner. +- Current managers may be imported directly until the target-state orchestrator exists. +- Keep singleton managers limited to side-effect services or shared interaction state. +- Always call `destroy()` on cleanup when a manager owns external resources. +- Never create manager instances with `new` — always use `.getInstance()`. diff --git a/.agent/skills/r3f.md b/.agent/skills/r3f.md index 50352a8..e278670 100644 --- a/.agent/skills/r3f.md +++ b/.agent/skills/r3f.md @@ -66,21 +66,6 @@ import { RigidBody, CuboidCollider } from "@react-three/rapier"; - `type="dynamic"` for movable objects - Player uses `type="dynamic"` with `lockRotations` -## Postprocessing - -```tsx -import { EffectComposer, Bloom, Vignette } from "@react-three/postprocessing"; - - - - -; -``` - -- Always wrap in `` -- Keep effects minimal for performance -- Disable heavy effects on low-end devices via Debug panel - ## What NOT to do - Do not use `new THREE.Scene()` or `new THREE.WebGLRenderer()` — R3F handles this diff --git a/.gitattributes b/.gitattributes index 5c48165..3ae4da4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -3,6 +3,7 @@ *.glb filter=lfs diff=lfs merge=lfs -text *.gltf filter=lfs diff=lfs merge=lfs -text +*.bin filter=lfs diff=lfs merge=lfs -text # Textures *.png filter=lfs diff=lfs merge=lfs -text @@ -21,4 +22,4 @@ # Video (cinematics) *.mp4 filter=lfs diff=lfs merge=lfs -text -*.webm filter=lfs diff=lfs merge=lfs -text \ No newline at end of file +*.webm filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/quality.yml b/.github/workflows/quality.yml index c787ccb..6759cea 100644 --- a/.github/workflows/quality.yml +++ b/.github/workflows/quality.yml @@ -74,12 +74,12 @@ jobs: - name: 📏 Check bundle size run: | - # Get bundle size in KB - SIZE=$(du -k dist | cut -f1) + # Check generated app assets only; public/ model files are runtime assets copied to dist. + SIZE=$(du -k dist/assets | cut -f1) echo "Bundle size: ${SIZE}KB" - # Threshold: 1000KB (configurable) - THRESHOLD=1000 + # Threshold: 5000KB (configurable) + THRESHOLD=5000 if [ "$SIZE" -gt "$THRESHOLD" ]; then echo "❌ Bundle size ${SIZE}KB exceeds threshold ${THRESHOLD}KB" diff --git a/.gitignore b/.gitignore index d6b00ff..6786024 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,14 @@ # Dependencies node_modules/ +.venv/ +backend/.venv/ +__pycache__/ +*.pyc # Build dist/ dist-ssr/ +.vite/ *.local # Environment @@ -37,4 +42,4 @@ Thumbs.db # 3D Assets Cache (drei, GLTFJSX) .drei/ -.glitchdrei-cache/ \ No newline at end of file +.glitchdrei-cache/ diff --git a/README.md b/README.md index b7acd20..71b71d0 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,6 @@ Built with React, Three.js, and Vite. Runs in the browser, no installation requi | [@react-three/fiber](https://docs.pmnd.rs/react-three-fiber/getting-started/introduction) | | [@react-three/drei](https://pmndrs.github.io/drei) | | [@react-three/rapier](https://rapier.rs/docs/) | -| [@react-three/postprocessing](https://github.com/pmndrs/postprocessing) | | [GSAP](https://gsap.com/docs/v3/Installation/) | ### Performance & Effects @@ -48,75 +47,63 @@ la-fabrik/ │ └── sounds/ │ └── src/ - ├── world/ # Single persistent 3D world - │ ├── World.tsx # Main scene composition - │ ├── Map.tsx # Base map, always mounted + ├── world/ # Persistent 3D world composition + │ ├── World.tsx # Active scene composition + │ ├── GameMap.tsx # Map loading and progressive rendering + │ ├── GameMapCollision.tsx # Collision-only octree source │ ├── Lighting.tsx # Ambient, directional, point lights - │ ├── Environment.tsx # HDRI, fog, sky - │ ├── PostFX.tsx # Bloom, SSAO, chromatic aberration - │ ├── zones/ # Spatial zones — LOD per zone - │ │ ├── WorkshopZone.tsx - │ │ ├── PowerGridZone.tsx - │ │ ├── FarmZone.tsx - │ │ ├── SchoolZone.tsx - │ │ └── ResidentialZone.tsx + │ ├── Environment.tsx # Scene background / sky model + │ ├── GameMusic.tsx # Game scene music lifecycle + │ ├── debug/ # Debug-only test scene + │ │ └── TestMap.tsx │ └── player/ - │ ├── FPSController.tsx # PointerLockControls + Rapier movement - │ └── Crosshair.tsx + │ ├── Player.tsx # Player rig composition + │ ├── PlayerCamera.tsx # Player camera mount + │ └── PlayerController.tsx # Pointer lock movement and inputs │ ├── components/ - │ ├── 3d/ # Shared reusable 3D elements - │ │ └── InteractiveObject.tsx # Raycasting + outline wrapper + │ ├── three/ # Shared R3F components by domain + │ │ ├── gameplay/ # Core repair gameplay prototype + │ │ ├── handTracking/ # R3F hand tracking debug models + │ │ ├── interaction/ # Trigger, grab, focus wrappers + │ │ ├── models/ # GLTF model components + │ │ └── world/ # Environment-specific 3D objects │ └── ui/ # HTML overlays — outside Canvas - │ ├── NarrativeOverlay.tsx # Floating dialogues - │ ├── MissionHUD.tsx # Current objective - │ ├── MapHUD.tsx # Minimap - │ ├── CinematicBars.tsx # GSAP black bars - │ └── LoadingScreen.tsx # Asset progress + │ ├── Crosshair.tsx + │ ├── debug/ # Debug-only HTML overlay panels + │ │ ├── DebugOverlayLayout.tsx + │ │ ├── GameStateDebugPanel.tsx + │ │ └── HandTrackingDebugPanel.tsx + │ ├── HandTrackingVisualizer.tsx + │ └── InteractPrompt.tsx │ - ├── stateManager/ # All logic, state, orchestration - │ ├── GameManager.ts # Single source of truth: phase, zone, mission - │ ├── CinematicManager.ts # GSAP timelines, camera lock/unlock - │ ├── AudioManager.ts # Music, SFX, spatial audio - │ └── ZoneManager.ts # Zone detection, LOD triggers + ├── managers/ # Current singleton-style services + │ ├── AudioManager.ts # Music and SFX playback + │ └── InteractionManager.ts # Focus, nearby, grab state │ - ├── hooks/ # React hooks — thin wrappers on managers - │ ├── useGameState.ts # Subscribes to GameManager - │ ├── useZoneDetection.ts - │ ├── useInteraction.ts - │ ├── useCinematic.ts - │ ├── useAudio.ts - │ └── useLOD.ts + ├── hooks/ # React hooks by domain + │ ├── debug/ # Debug state and GUI folders + │ ├── docs/ # Docs language context access + │ ├── editor/ # Editor loading and history + │ ├── gameplay/ # Repair gameplay helpers + │ ├── handTracking/ # Webcam/WebSocket hand tracking + │ ├── interaction/ # Interaction manager subscriptions + │ └── three/ # Three.js/R3F helpers │ ├── data/ - │ ├── zones.ts # { id, position, radius, missionId } - │ ├── dialogues.ts # Narrative scripts, PNJ states - │ └── missions.ts # Mission definitions, steps - │ - ├── shaders/ - │ └── hologram/ - │ ├── vertex.glsl - │ └── fragment.glsl + │ ├── interaction/ # Interaction tuning + │ ├── player/ # Player tuning + │ ├── gameplay/ # Repair gameplay static config + │ └── world/ # Environment and lighting config │ ├── utils/ - │ ├── EventEmitter.ts # Simple typed pub/sub utility - │ ├── Sizes.ts # Viewport size tracking - │ ├── Time.ts # Animation frame timing utility - │ └── debug/ # Dev-only tools and scene inspection - │ ├── Debug.ts # Global lil-gui manager - │ ├── DebugPerf.tsx # r3f-perf overlay mounted in Canvas - │ ├── isDebugEnabled.ts # Debug query-string helper - │ └── scene/ - │ ├── DebugHelpers.tsx # Grid + axes helpers shown in debug mode - │ └── DebugCameraControls.tsx # Free debug camera for map inspection - ├── hooks/ - │ └── debug/ - │ ├── useCameraMode.ts - │ ├── useDebugFolder.ts - │ ├── useDebugStore.ts - │ └── useSceneMode.ts - │ - ├── App.tsx # Canvas bootstrap + │ ├── core/ # Logger and generic utilities + │ ├── debug/ # Dev-only tools and scene inspection + │ ├── editor/ # Editor-only parsing utilities + │ ├── map/ # Map loading and validation + │ └── three/ # Three.js helpers + ├── types/ # Shared TypeScript domain types + ├── App.tsx # App bootstrap and route switch └── main.tsx ``` diff --git a/backend/README.md b/backend/README.md new file mode 100644 index 0000000..18607aa --- /dev/null +++ b/backend/README.md @@ -0,0 +1,91 @@ +# Hand Tracking Backend + +Remote-compatible Python backend for La-Fabrik hand tracking. + +The browser captures webcam frames, downsizes them, sends JPEG frames to this backend over WebSocket, and receives hand landmarks plus closed-fist state. + +## Setup + +```bash +python3.11 -m venv backend/.venv +source backend/.venv/bin/activate +python -m pip install --upgrade pip +python -m pip install -r backend/requirements.txt +python backend/download_model.py +``` + +## Run + +Run the Vite frontend and the Python backend in two separate terminals. + +Terminal 1: + +```bash +npm run dev +``` + +Terminal 2: + +```bash +source backend/.venv/bin/activate +python -m backend.main +``` + +The WebSocket endpoint is: + +```txt +ws://localhost:8000/ws +``` + +## Health Check + +```txt +http://localhost:8000/health +``` + +## Message Flow + +Client sends a compressed frame: + +```json +{ + "type": "frame", + "timestamp": 1234567890, + "width": 320, + "height": 240, + "image": "base64-jpeg" +} +``` + +Server responds with detected hands: + +```json +{ + "type": "hands", + "timestamp": 1234567890, + "hands": [ + { + "x": 0.5, + "y": 0.3, + "z": 0.1, + "landmarks": [ + { + "x": 0.48, + "y": 0.32, + "z": 0.02 + } + ], + "handedness": "Right", + "isFist": true, + "score": 0.92 + } + ] +} +``` + +## Notes + +- The backend does not read `cv2.VideoCapture(0)`. +- This keeps local development and production behavior aligned. +- Each browser connection sends its own webcam frames. +- The backend rate-limits frames per connection and drops work when a client is already being processed. diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/connection_manager.py b/backend/connection_manager.py new file mode 100644 index 0000000..db62611 --- /dev/null +++ b/backend/connection_manager.py @@ -0,0 +1,37 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from typing import Any +from uuid import uuid4 + +from fastapi import WebSocket + + +@dataclass +class ClientConnection: + id: str + websocket: WebSocket + is_processing: bool = False + last_frame_at: float = 0.0 + metadata: dict[str, Any] = field(default_factory=dict) + + +class ConnectionManager: + def __init__(self) -> None: + self._connections: dict[str, ClientConnection] = {} + + @property + def count(self) -> int: + return len(self._connections) + + async def connect(self, websocket: WebSocket) -> ClientConnection: + await websocket.accept() + connection = ClientConnection(id=str(uuid4()), websocket=websocket) + self._connections[connection.id] = connection + return connection + + def disconnect(self, connection: ClientConnection) -> None: + self._connections.pop(connection.id, None) + + async def send(self, connection: ClientConnection, payload: dict[str, Any]) -> None: + await connection.websocket.send_json(payload) diff --git a/backend/download_model.py b/backend/download_model.py new file mode 100644 index 0000000..75d7353 --- /dev/null +++ b/backend/download_model.py @@ -0,0 +1,22 @@ +from __future__ import annotations + +from pathlib import Path +from urllib.request import urlretrieve + + +MODEL_URL = "https://storage.googleapis.com/mediapipe-models/hand_landmarker/hand_landmarker/float16/1/hand_landmarker.task" +MODEL_PATH = Path(__file__).with_name("hand_landmarker.task") + + +def download_model() -> None: + if MODEL_PATH.exists(): + print(f"Model already exists at {MODEL_PATH}") + return + + print("Downloading MediaPipe Hand Landmarker model...") + urlretrieve(MODEL_URL, MODEL_PATH) + print(f"Model downloaded to {MODEL_PATH}") + + +if __name__ == "__main__": + download_model() diff --git a/backend/hand_landmarker.task b/backend/hand_landmarker.task new file mode 100644 index 0000000..0d53faf Binary files /dev/null and b/backend/hand_landmarker.task differ diff --git a/backend/hand_tracker.py b/backend/hand_tracker.py new file mode 100644 index 0000000..71fac5a --- /dev/null +++ b/backend/hand_tracker.py @@ -0,0 +1,142 @@ +from __future__ import annotations + +import base64 +import math +import time +from dataclasses import dataclass +from pathlib import Path +from typing import Any + +import cv2 +import mediapipe as mp +import numpy as np +from mediapipe.tasks import python +from mediapipe.tasks.python import vision + + +@dataclass(frozen=True) +class HandData: + x: float + y: float + z: float + landmarks: list[dict[str, float]] + handedness: str + is_fist: bool + score: float + + def to_payload(self) -> dict[str, float | str | bool | list[dict[str, float]]]: + return { + "x": self.x, + "y": self.y, + "z": self.z, + "landmarks": self.landmarks, + "handedness": self.handedness, + "isFist": self.is_fist, + "score": self.score, + } + + +class HandTracker: + def __init__(self, max_hands: int = 2) -> None: + model_path = Path(__file__).with_name("hand_landmarker.task") + if not model_path.exists(): + raise FileNotFoundError( + "Missing hand_landmarker.task. Run `python backend/download_model.py`.", + ) + + base_options = python.BaseOptions(model_asset_path=str(model_path)) + options = vision.HandLandmarkerOptions( + base_options=base_options, + running_mode=vision.RunningMode.IMAGE, + num_hands=max_hands, + ) + self._detector = vision.HandLandmarker.create_from_options(options) + + def detect_from_base64_jpeg(self, image_base64: str) -> list[HandData]: + image_data = base64.b64decode(image_base64, validate=True) + image_buffer = np.frombuffer(image_data, dtype=np.uint8) + frame = cv2.imdecode(image_buffer, cv2.IMREAD_COLOR) + if frame is None: + raise ValueError("Invalid JPEG frame") + + rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) + mp_image = mp.Image(image_format=mp.ImageFormat.SRGB, data=rgb_frame) + result = self._detector.detect(mp_image) + return self._to_hands(result) + + def close(self) -> None: + self._detector.close() + + def _to_hands(self, result: vision.HandLandmarkerResult) -> list[HandData]: + hands: list[HandData] = [] + if not result.hand_landmarks or not result.handedness: + return hands + + for landmarks, handedness_categories in zip( + result.hand_landmarks, + result.handedness, + ): + palm_center = self._average_points( + [landmarks[0], landmarks[5], landmarks[9], landmarks[13], landmarks[17]], + ) + is_fist = self._is_fist(landmarks) + handedness = handedness_categories[0] + + hands.append( + HandData( + x=palm_center["x"], + y=palm_center["y"], + z=palm_center["z"], + landmarks=[ + {"x": point.x, "y": point.y, "z": point.z} + for point in landmarks + ], + handedness=handedness.category_name, + is_fist=is_fist, + score=handedness.score, + ), + ) + + return hands + + def _is_fist(self, landmarks: list[Any]) -> bool: + palm_center = self._average_points( + [landmarks[0], landmarks[5], landmarks[9], landmarks[13], landmarks[17]], + ) + palm_size = self._calculate_distance(landmarks[0], landmarks[9]) + if palm_size <= 0: + return False + + folded_finger_count = sum( + self._calculate_distance(landmarks[index], palm_center) / palm_size < 1.05 + for index in (8, 12, 16, 20) + ) + + return folded_finger_count >= 4 + + def _average_points(self, points: list[Any]) -> dict[str, float]: + return { + "x": sum(point.x for point in points) / len(points), + "y": sum(point.y for point in points) / len(points), + "z": sum(point.z for point in points) / len(points), + } + + def _calculate_distance(self, point_a: Any, point_b: Any) -> float: + return math.sqrt( + (self._get_coordinate(point_a, "x") - self._get_coordinate(point_b, "x")) + ** 2 + + (self._get_coordinate(point_a, "y") - self._get_coordinate(point_b, "y")) + ** 2 + + (self._get_coordinate(point_a, "z") - self._get_coordinate(point_b, "z")) + ** 2, + ) + + def _get_coordinate(self, point: Any, axis: str) -> float: + if isinstance(point, dict): + return point[axis] + + return getattr(point, axis) + + +def now_ms() -> int: + return time.monotonic_ns() // 1_000_000 diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..e5f26f3 --- /dev/null +++ b/backend/main.py @@ -0,0 +1,122 @@ +from __future__ import annotations + +import asyncio +from contextlib import asynccontextmanager +from typing import Any + +from fastapi import FastAPI, WebSocket, WebSocketDisconnect +from fastapi.responses import JSONResponse + +from backend.connection_manager import ClientConnection, ConnectionManager +from backend.hand_tracker import HandTracker, now_ms + + +MAX_FRAME_BYTES = 220_000 +MIN_FRAME_INTERVAL_SECONDS = 0.08 + +manager = ConnectionManager() +tracker: HandTracker | None = None +detection_lock = asyncio.Lock() + + +@asynccontextmanager +async def lifespan(app: FastAPI): + global tracker + tracker = HandTracker(max_hands=2) + yield + if tracker: + tracker.close() + + +app = FastAPI(title="La-Fabrik Hand Tracking", lifespan=lifespan) + + +@app.get("/health") +async def health() -> JSONResponse: + return JSONResponse( + { + "status": "ok", + "connections": manager.count, + }, + ) + + +@app.websocket("/ws") +async def websocket_endpoint(websocket: WebSocket) -> None: + connection = await manager.connect(websocket) + await manager.send(connection, status_payload("connected")) + + try: + while True: + message = await websocket.receive_json() + response = await handle_message(connection, message) + await manager.send(connection, response) + except WebSocketDisconnect: + manager.disconnect(connection) + except Exception as error: + await manager.send(connection, error_payload(str(error))) + manager.disconnect(connection) + + +async def handle_message( + connection: ClientConnection, + message: dict[str, Any], +) -> dict[str, Any]: + if message.get("type") != "frame": + return error_payload("Unsupported message type") + + current_time = asyncio.get_running_loop().time() + if current_time - connection.last_frame_at < MIN_FRAME_INTERVAL_SECONDS: + return status_payload("rate_limited") + + if connection.is_processing: + return status_payload("busy") + + image = message.get("image") + if not isinstance(image, str): + return error_payload("Missing image payload") + + if len(image) > MAX_FRAME_BYTES: + return error_payload("Frame payload too large") + + if tracker is None: + return error_payload("Hand tracker is not ready") + + if detection_lock.locked(): + return status_payload("busy") + + connection.last_frame_at = current_time + connection.is_processing = True + try: + async with detection_lock: + hands = await asyncio.to_thread(tracker.detect_from_base64_jpeg, image) + return { + "type": "hands", + "timestamp": now_ms(), + "hands": [hand.to_payload() for hand in hands], + } + finally: + connection.is_processing = False + + +def status_payload(status: str) -> dict[str, str | int]: + return { + "type": "status", + "timestamp": now_ms(), + "status": status, + } + + +def error_payload(message: str) -> dict[str, str | int | list[Any]]: + return { + "type": "error", + "timestamp": now_ms(), + "hands": [], + "message": message, + } + + +if __name__ == "__main__": + import uvicorn + + uvicorn.run(app, host="0.0.0.0", port=8000) diff --git a/backend/requirements.txt b/backend/requirements.txt new file mode 100644 index 0000000..347181a --- /dev/null +++ b/backend/requirements.txt @@ -0,0 +1,5 @@ +fastapi==0.115.0 +uvicorn[standard]==0.30.6 +opencv-python-headless==4.10.0.84 +mediapipe==0.10.20 +numpy==1.26.4 diff --git a/docs/technical/animation.md b/docs/technical/animation.md new file mode 100644 index 0000000..f2cff1d --- /dev/null +++ b/docs/technical/animation.md @@ -0,0 +1,50 @@ +# Animation & 3D Components + +This document describes the 3D components that are currently used in the runtime. + +## Runtime Components + +| Domain | Component | Role | +| ----------- | -------------------- | --------------------------------------------------------------------- | +| Interaction | `InteractableObject` | Focus detection through distance and raycasting | +| Interaction | `TriggerObject` | Press-to-trigger interactions, optional sound, optional spawned model | +| Interaction | `GrabbableObject` | Physics grab and hand-tracking grab behavior | +| Model | `ExplodableModel` | Split/reassemble a GLTF model into separated parts | +| Gameplay | `RepairCaseModel` | Repair case lid animation, proximity float, and wobble | + +## Continuous Animation + +Use `useFrame` for per-frame 3D behavior. Current examples: + +- `GrabbableObject` updates held object velocity every frame. +- `ExplodableModel` updates split part positions every frame. +- `RepairCaseModel` updates proximity float and rotation wobble every frame. +- `SkyModel` follows the camera position every frame. + +## Timeline Animation + +Use GSAP only for discrete timeline-style transitions. Current example: + +- `RepairCaseModel` animates the case lid between open and closed rotations. + +## GLTF Reuse + +Use `useClonedObject` when a GLTF scene is reused by a component instance. It memoizes `scene.clone(true)` and keeps clone creation out of render churn. + +## File Structure + +```txt +src/components/three/ +├── gameplay/ +│ ├── RepairCaseModel.tsx +│ ├── RepairGame.tsx +│ └── RepairRepairingStep.tsx +├── interaction/ +│ ├── GrabbableObject.tsx +│ ├── InteractableObject.tsx +│ └── TriggerObject.tsx +├── models/ +│ └── ExplodableModel.tsx +└── world/ + └── SkyModel.tsx +``` diff --git a/docs/technical/architecture.md b/docs/technical/architecture.md index 769575d..b9c508c 100644 --- a/docs/technical/architecture.md +++ b/docs/technical/architecture.md @@ -4,44 +4,139 @@ This document describes the code that exists today in the repository. ## Runtime Structure -- `src/App.tsx` mounts the `Canvas`, the 3D `World`, the debug perf overlay, and the HTML overlays. +- `src/main.tsx` mounts React. +- `src/App.tsx` mounts the TanStack `RouterProvider`. +- `src/router.tsx` declares the top-level routes: + - `/` mounts the playable 3D scene, debug perf overlay, and HTML overlays. + - `/editor` mounts the map editor page. - `src/world/World.tsx` composes the active scene, including: - environment and lighting - debug helpers and debug camera mode - either the map scene or the debug physics test scene - the player rig when the active camera mode is `player` -- `src/world/Map.tsx` loads the main map model and builds the collision octree. -- `src/world/debug/TestScene.tsx` provides a debug-oriented interaction and physics scene. -- `src/world/player/PlayerComponent.tsx` mounts the camera and controller. -- `src/world/player/PlayerController.tsx` owns pointer lock movement, jump handling, and interaction input. +- `src/hooks/world/useWorldSceneLoading.ts` owns the production scene loading state shared by `World`, `GameMap`, and the player octree readiness. +- `src/world/GameMap.tsx` loads map nodes from `public/map.json`, resolves available models, renders them progressively, and shows fallback cubes for missing models. +- `src/world/GameMapCollision.tsx` builds the player collision octree from dedicated collision nodes only. +- `src/world/GameStageContent.tsx` is wrapped in Rapier `Physics` in the production game scene so stage gameplay objects can use physics without moving the map or player to Rapier. It now mounts reusable `RepairGame` instances for `bike`, `pylone`, and `ferme` mission states. +- `src/world/debug/TestMap.tsx` provides a debug-oriented interaction and physics map with the existing grab/trigger/model-preview objects plus separate `Bike`, `Pylone`, and `Farm` repair playground zones. +- `src/world/player/Player.tsx` mounts the camera and controller. +- `src/world/player/PlayerController.tsx` owns pointer lock movement, jump handling, repair-step movement locking, and interaction input. + +## Physics Boundaries + +The project currently uses two collision layers with separate responsibilities: + +- `GameMapCollision` builds an octree used by the player controller for map collision. +- The player octree must be built from a small collision-only subset of map nodes. It currently uses the `terrain` node only instead of traversing the full visible map, because building an octree from all rendered props can overload the browser renderer. +- `GameStageContent` is wrapped in Rapier `Physics` for gameplay objects such as repair triggers, cases, grabbables, and future mission-specific objects. +- `TestMap` owns its own Rapier `Physics` playground so repair gameplay can be tuned per mission state without depending on the production map layout. + +Keep the player and map octree outside the Rapier provider until there is a deliberate migration plan. This avoids mixing player movement rules with object physics before the gameplay systems need it. ## Interaction Model -- `src/stateManager/InteractionManager.ts` is the current interaction state source. -- `src/components/3d/InteractableObject.tsx` handles focus detection through distance and raycasting. -- `src/components/3d/TriggerObject.tsx` implements trigger-style interactions. -- `src/components/3d/GrabbableObject.tsx` implements hold-and-release interactions. -- `src/hooks/useInteraction.ts` exposes the interaction snapshot to React UI. +- `src/managers/InteractionManager.ts` is the current interaction state source. +- `src/components/three/interaction/InteractableObject.tsx` handles focus detection through distance and raycasting. +- `src/components/three/interaction/TriggerObject.tsx` implements trigger-style interactions. +- `src/components/three/interaction/GrabbableObject.tsx` implements hold-and-release interactions. +- `src/hooks/interaction/useInteraction.ts` exposes the interaction snapshot to React UI. - `src/components/ui/InteractPrompt.tsx` shows the `E` prompt for trigger interactions. ## Audio -- `src/stateManager/AudioManager.ts` currently provides pooled one-shot sound playback. -- Trigger interactions may play audio directly through `AudioManager`. +- `src/managers/AudioManager.ts` provides pooled one-shot playback, looped music playback, category volumes, and optional stereo pan for one-shot sounds. +- Supported audio categories are `music`, `sfx`, and `dialogue`. +- Trigger interactions may play SFX directly through `AudioManager`. + +## Settings Menu + +- `src/managers/stores/useSettingsStore.ts` stores settings for music volume, SFX volume, dialogue volume, subtitle visibility, subtitle language, repair runtime, and menu visibility. +- `src/components/ui/GameSettingsMenu.tsx` renders the in-game options menu. +- `src/components/ui/GameUI.tsx` mounts the settings menu as an HTML overlay outside the canvas. +- `Esc` opens and closes the menu, and `src/world/player/PlayerController.tsx` ignores player input while the menu is open. +- Volume changes are forwarded to `AudioManager` by category. + +## Dialogues And Subtitles + +- `public/sounds/dialogue/dialogues.json` is the runtime dialogue manifest. +- Dialogue audio files live under `public/sounds/dialogue/`. +- Subtitle files live under `public/sounds/dialogue/subtitles/{fr|en}/`. +- The current subtitle model is one SRT file per voice and language. +- `src/types/dialogues/dialogues.ts` contains the dialogue manifest types. +- `src/utils/dialogues/dialogueManifestValidation.ts` validates manifest shape at runtime. +- `src/utils/dialogues/loadDialogueManifest.ts` loads the manifest and SRT cues, with French fallback when the selected language is missing. +- `src/utils/subtitles/parseSrt.ts` parses SRT blocks and timecodes. +- `src/utils/dialogues/playDialogue.ts` plays dialogue audio and synchronizes the active subtitle against the audio element time. +- `src/managers/stores/useSubtitleStore.ts` stores the currently displayed subtitle cue. +- `src/components/ui/Subtitles.tsx` renders the subtitle overlay. +- `src/world/GameDialogues.tsx` currently triggers dialogue entries that define a `timecode`. +- Dialogue playback is queued so multiple dialogue requests do not overlap. + +## Cinematics + +- `public/cinematics.json` is the runtime cinematic manifest. +- `src/types/cinematics/cinematics.ts` contains cinematic manifest types. +- `src/utils/cinematics/cinematicManifestValidation.ts` validates manifest shape at runtime. +- `src/utils/cinematics/loadCinematicManifest.ts` loads `/cinematics.json`. +- `src/world/GameCinematics.tsx` triggers cinematics that define a global `timecode`. +- Cinematics use GSAP timelines to animate the active camera position and look target. +- `dialogueCues` on a cinematic trigger dialogue IDs at times relative to the cinematic start. +- `src/managers/stores/useGameStore.ts` exposes `isCinematicPlaying`, used to lock player input during cinematics. ## Debug System - Debug mode is enabled with `?debug`. - `src/utils/debug/Debug.ts` owns the `lil-gui` instance and debug controls. - `src/hooks/debug/useCameraMode.ts` and `src/hooks/debug/useSceneMode.ts` subscribe to debug state. -- `src/utils/debug/DebugPerf.tsx` lazily mounts `r3f-perf` in debug mode. -- `src/utils/debug/scene/DebugHelpers.tsx` mounts debug helpers. -- `src/utils/debug/scene/DebugCameraControls.tsx` mounts the free debug camera. +- `src/components/debug/DebugPerf.tsx` lazily mounts `r3f-perf` in debug mode. +- `src/components/ui/debug/DebugOverlayLayout.tsx` mounts the compact HTML debug overlay when enabled from `lil-gui`. +- `src/components/ui/debug/GameStateDebugPanel.tsx` exposes current game state, main/sub-state switching, previous/next step controls, and reset. +- `src/components/ui/debug/HandTrackingDebugPanel.tsx` shows hand tracking status, usage, loaded glove model, hand count, and fist state while hand tracking is active. +- `src/components/ui/SceneLoadingOverlay.tsx` displays the fullscreen loading state for 3D scenes, including the production game scene, debug physics scene, and editor scene. +- `src/components/three/handTracking/HandTrackingGlove.tsx` places the rigged `gant_l` and `gant_r` models on detected hands in the debug physics scene. +- `src/components/debug/scene/DebugHelpers.tsx` mounts debug helpers. +- `src/components/debug/scene/DebugCameraControls.tsx` mounts the free debug camera. +- `lil-gui` global debug controls include camera mode, scene mode, `R3F Perf`, and `Debug Overlay`; interaction-specific controls live in the `Interaction` folder. + +## 3D Component Domains + +- `src/components/three/models/` contains reusable model helpers such as `ExplodableModel`. +- `src/components/three/interaction/` contains reusable interaction wrappers such as `InteractableObject`, `TriggerObject`, and `GrabbableObject`. +- `src/components/three/handTracking/` contains R3F hand tracking debug models such as the glove overlays. +- `src/components/three/gameplay/` contains the reusable production `RepairGame` flow, repair case, repair steps, and repair prompt components. +- `src/components/three/world/` contains reusable world/environment objects such as `SkyModel`. + +## Editor System + +- `src/pages/editor/page.tsx` is the route-level editor page for `/editor`. +- `src/components/editor/EditorControls.tsx` renders the HTML editor control panel. +- `src/components/editor/EditorDialogueManifestPanel.tsx` edits `public/sounds/dialogue/dialogues.json`. +- `src/components/editor/EditorCinematicManifestPanel.tsx` edits `public/cinematics.json`. +- `src/components/editor/EditorSrtPanel.tsx` renders the dialogue SRT editor inside the editor control panel. +- `src/components/editor/scene/EditorScene.tsx` composes the editor canvas scene, camera controls, lights, shortcuts, and map rendering. +- `src/components/editor/scene/EditorMap.tsx` renders map nodes, fallback cubes, selection highlighting, and transform controls. +- `src/controls/editor/FlyController.tsx` provides player-style editor navigation. +- `src/hooks/editor/useEditorSceneData.ts` loads scene data and handles folder upload fallback. +- `src/hooks/editor/useEditorHistory.ts` owns editor undo and redo state. +- `src/utils/editor/loadEditorScene.ts` handles editor-only folder upload parsing. +- `src/utils/map/loadMapSceneData.ts` is shared by the game scene and editor to load `public/map.json` and resolve model URLs. +- `src/types/editor/editor.ts` contains the shared `MapNode`, `SceneData`, and `TransformMode` types. +- `src/types/gameplay/repairMission.ts` contains shared repair mission ids, mission steps, and guards used across store, config, debug UI, and gameplay components. + +## Map Data + +- `public/map.json` is expected to be a `MapNode[]`. +- Each map node `name` maps to `public/models/{name}/model.glb` when available, with `public/models/{name}/model.gltf` kept as fallback. +- The editor renders a fallback cube for missing models. +- The game scene renders fallback cubes for nodes whose model cannot be resolved. +- The game scene currently uses `terrain` as the collision source for the player octree. Additional collision nodes should be explicit lightweight collision assets, not arbitrary visible decoration models. ## Current Limitations -- The repository is still a prototype, not the full intended game runtime. -- `src/world/debug/TestScene.tsx` is still part of the active scene composition. -- There is no central gameplay orchestrator such as `GameManager` yet. -- Missions, zones, cinematics, and dialogue systems are not implemented. +- The repository is a prototype, not the full intended game runtime. +- `src/world/debug/TestMap.tsx` is part of the active scene composition. +- There is no central gameplay orchestrator such as `GameManager`. +- Mission state exists in Zustand and the repair flow is implemented as a prototype for the current repair missions. +- Cinematics and dialogues exist as prototype timecode-driven systems; dialogue branching and broader gameplay orchestration are still limited. - The player uses octree collision and simple movement rules, not a complete gameplay physics stack. +- Editor save-to-server is implemented as a Vite dev-server plugin, not a production backend API. diff --git a/docs/technical/editor.md b/docs/technical/editor.md new file mode 100644 index 0000000..0e6c9b1 --- /dev/null +++ b/docs/technical/editor.md @@ -0,0 +1,234 @@ +# Editor Technical Notes + +This document describes the map editor that exists in the current codebase. + +## Purpose + +The editor is a React route used to inspect and adjust the `public/map.json` scene data from inside the La-Fabrik app. It shares the same `MapNode` data format as the game scene and uses React Three Fiber for rendering. + +## Routing + +- `/` renders the playable La-Fabrik scene. +- `/editor` renders the map editor. +- `src/App.tsx` mounts TanStack Router through `RouterProvider`. +- `src/router.tsx` defines the `/editor` route and imports `EditorPage` from `src/pages/editor/page.tsx`. + +## File Structure + +```txt +src/ +├── pages/ +│ └── editor/ +│ └── page.tsx +├── components/ +│ └── editor/ +│ ├── EditorControls.tsx +│ ├── EditorCinematicManifestPanel.tsx +│ ├── EditorDialogueManifestPanel.tsx +│ ├── EditorSrtPanel.tsx +│ └── scene/ +│ ├── EditorMap.tsx +│ └── EditorScene.tsx +├── controls/ +│ └── editor/ +│ └── FlyController.tsx +├── hooks/ +│ └── editor/ +│ ├── useEditorHistory.ts +│ └── useEditorSceneData.ts +├── types/ +│ └── editor/ +│ └── editor.ts +└── utils/ + ├── dialogues/ + │ └── loadDialogueManifest.ts + ├── editor/ + │ └── loadEditorScene.ts + ├── map/ + │ └── loadMapSceneData.ts + └── subtitles/ + └── parseSrt.ts +``` + +## Responsibilities + +`src/pages/editor/page.tsx` is the route-level composition component. It owns route-specific state such as selected object, hovered object, transform mode, and player-mode toggle. + +`src/hooks/editor/useEditorSceneData.ts` loads the default map data and handles folder uploads. + +`src/hooks/editor/useEditorHistory.ts` owns editor undo and redo history. + +`src/components/editor/scene/EditorScene.tsx` composes the editor canvas scene, camera controls, lights, keyboard shortcuts, and `EditorMap`. + +`src/components/editor/scene/EditorMap.tsx` renders map nodes, fallback cubes, selection highlighting, and transform controls. + +`src/components/editor/EditorControls.tsx` renders the HTML control panel outside the canvas. + +`src/components/editor/EditorDialogueManifestPanel.tsx` renders the dialogue manifest editor. It loads `dialogues.json`, edits dialogue entries, previews selected dialogue playback, creates missing French SRT cues, and saves the manifest through a dev-server endpoint. + +`src/components/editor/EditorCinematicManifestPanel.tsx` renders the cinematic manifest editor. It loads `cinematics.json`, edits camera keyframes and dialogue cues, previews selected cinematics in the editor canvas, and saves the manifest through a dev-server endpoint. + +`src/components/editor/EditorSrtPanel.tsx` renders the dialogue subtitle editor inside the control panel. It loads the dialogue manifest, loads one SRT file per voice/language, validates cue structure, previews dialogue audio, and can save SRT files through a dev-server endpoint. + +`src/controls/editor/FlyController.tsx` provides editor movement controls for player-style navigation. + +`src/utils/map/loadMapSceneData.ts` is shared by the game map and editor. It loads `/map.json` and resolves available `public/models/{name}/model.glb` files first, then falls back to `public/models/{name}/model.gltf`. + +`src/utils/editor/loadEditorScene.ts` contains editor-only upload handling for user-selected folders. + +## Data Format + +The shared editor type lives in `src/types/editor/editor.ts`. + +```ts +interface MapNode { + name: string; + type: string; + position: [number, number, number]; + rotation: [number, number, number]; + scale: [number, number, number]; +} +``` + +`public/map.json` is expected to be a `MapNode[]`. + +```json +[ + { + "name": "pylone", + "type": "Mesh", + "position": [0, 5, 0], + "rotation": [0, 1.57, 0], + "scale": [1, 1, 1] + } +] +``` + +Each node `name` maps to a model folder: + +```txt +public/ +├── map.json +└── models/ + └── pylone/ + └── model.glb +``` + +If `model.glb` and `model.gltf` are both missing, the editor renders a fallback cube so the node can still be selected and transformed. + +## Editor Flow + +1. `EditorPage` mounts on `/editor`. +2. `useEditorSceneData` calls `loadMapSceneData()`. +3. `loadMapSceneData()` loads `/map.json` and available model URLs. +4. If `/map.json` is missing, the page displays a folder-upload flow. +5. `EditorScene` renders the grid, lights, camera controls, and map nodes. +6. `EditorControls` exposes transform mode, history actions, export, save, and selection info. + +## Controls + +- Click: select a node. +- `Esc`: clear selection. +- `T`: translate mode. +- `R`: rotate mode. +- `S`: scale mode. +- `Ctrl+Z` or `Cmd+Z`: undo. +- `Ctrl+Y` or `Cmd+Y`: redo. +- `WASD`, `ZQSD`, or arrow keys: move in player-controller mode. +- `Space`: move upward in player-controller mode. +- `Shift`: move downward in player-controller mode. + +## Saving And Exporting + +The editor supports two output paths: + +- Export JSON downloads the current `MapNode[]` as `map.json`. +- Save to Server posts the current `MapNode[]` to `/api/save-map`. + +The dev-only `/api/save-map` endpoint is implemented by the Vite plugin in `vite.config.ts`. It writes to `public/map.json` and enforces a maximum payload size. + +## Dialogue SRT Editing + +Dialogue subtitle editing is part of the `/editor` side panel. + +Runtime dialogue files are grouped under `public/sounds/dialogue/`: + +```txt +public/ +└── sounds/ + └── dialogue/ + ├── dialogues.json + └── subtitles/ + ├── fr/ + │ ├── narrateur.srt + │ ├── fermier.srt + │ └── electricienne.srt + └── en/ + └── ... +``` + +The current model is one SRT file per voice and language. A dialogue entry references the cue it needs through `subtitleCueIndex`; it does not own a dedicated SRT file. + +`EditorSrtPanel` uses: + +- `loadDialogueManifest()` to read `/sounds/dialogue/dialogues.json` +- `parseSrt()` to validate local textarea content and find active cues during audio preview +- `/api/save-srt` to write edited SRT files during local development +- `/api/validate-dialogues` to validate the manifest, linked audio, French SRT files, and referenced cue indexes + +SRT timecodes are relative to the dialogue audio file being previewed, not to the global game timeline. + +Missing English SRT files are warnings, not errors, because runtime loading falls back to French subtitles when the selected language is not available. Keep this behavior until the English translation workflow is ready. + +## Dialogue Manifest Editing + +`EditorDialogueManifestPanel` edits `public/sounds/dialogue/dialogues.json` in memory and persists it through `/api/save-dialogues`. + +The panel supports: + +- adding a dialogue entry +- deleting a dialogue entry +- editing `id`, `voice`, `audio`, `subtitleCueIndex`, and optional `timecode` +- previewing the selected dialogue through `playDialogueById()` +- creating a missing French SRT cue through `/api/save-srt` + +When a dialogue is added, the editor computes the next `subtitleCueIndex` for the selected voice from the manifest. The generated SRT cue is a valid placeholder block and should be edited later in the SRT panel. + +`/api/save-dialogues` is implemented in `vite.config.ts`. It validates manifest shape before writing to `public/sounds/dialogue/dialogues.json`. + +## Cinematic Manifest Editing + +`EditorCinematicManifestPanel` edits `public/cinematics.json` in memory and persists it through `/api/save-cinematics`. + +The manifest shape is: + +```ts +interface CinematicDefinition { + id: string; + timecode?: number; + cameraKeyframes: CinematicCameraKeyframe[]; + dialogueCues?: CinematicDialogueCue[]; +} +``` + +`cameraKeyframes` are relative to the cinematic start. At least two keyframes are required and keyframe times must increase. + +`dialogueCues` are also relative to the cinematic start and reference dialogue IDs from `dialogues.json`. They are used by `GameCinematics` to synchronize dialogue playback with camera timelines. A dialogue synchronized this way should not also define a global `timecode` in `dialogues.json`. + +The editor preview sends the selected `CinematicDefinition` to `EditorScene`, where GSAP animates the current editor camera. Orbit and fly controls are disabled during preview. + +`/api/save-cinematics` is implemented in `vite.config.ts`. It validates manifest shape before writing to `public/cinematics.json`. + +## Styling + +Editor styles are in `src/index.css` under the `/* Editor page */` section. Classes are prefixed with `editor-` to avoid collisions with the game UI. + +## Known Limitations + +- Uploaded model object URLs are not revoked after replacement or unmount. +- Large `map.json` files are not virtualized, culled, or LOD-managed. +- There is no snap-to-grid, duplication, material editing, or object creation workflow. +- Save to Server is a Vite dev-server helper, not a production backend API. +- SRT Save is also a Vite dev-server helper, not a production backend API. +- Dialogue and cinematic manifest saves are Vite dev-server helpers, not production backend APIs. +- Dialogue creation still uses placeholder audio paths until real MP3 files are added. diff --git a/docs/technical/hand-tracking.md b/docs/technical/hand-tracking.md new file mode 100644 index 0000000..1d35b92 --- /dev/null +++ b/docs/technical/hand-tracking.md @@ -0,0 +1,138 @@ +# Hand Tracking Technical Notes + +This document describes the hand tracking system that exists in the current codebase. + +## Purpose + +Hand tracking started as a debug-stage interaction system used to test direct 3D object manipulation with a webcam. It allows a user to close their fist to grab a nearby object and move it in 3D space without relying on the center crosshair. + +It is now also available to the production repair flow when a mission reaches a hand-driven step. + +## Runtime Flow + +1. The browser captures webcam frames in `src/hooks/handTracking/useRemoteHandTracking.ts`. +2. Frames are sent to the local Python backend over WebSocket. +3. The backend runs MediaPipe hand landmark detection. +4. The backend returns hand data including landmarks, handedness, score, center point, and `isFist`. +5. React stores the latest snapshot in the hand tracking provider. +6. `GrabbableObject` reads that snapshot each frame and uses fist state plus raycasting to grab objects. +7. `HandTrackingGlove` reads the same snapshot and places the rigged `gant_l` and `gant_r` models on the detected hands when hand tracking is active. + +## Activation Rules + +Hand tracking is intentionally gated so the webcam and backend are not used all the time. + +The debug activation conditions are: + +- debug mode is active with `?debug` +- scene mode is `physics` +- the player is near an interaction, is holding an object, or is hand-holding an object + +This keeps hand tracking active while the player is inside an interaction zone, even if the camera is not aimed directly at the object. + +The production repair activation conditions are: + +- active `mainState` is `bike`, `pylone`, or `ferme` +- the active mission step is `inspected`, `repairing`, `reassembling`, or `done` + +This keeps the webcam off during `waiting`, `fragmented`, and `scanning`, then enables hand input only when the repair flow is expected to use hands. + +In the current production repair flow, `inspected` uses a two-fists hold gesture to advance to `fragmented`. The hold must last one second and is independent from local object interaction distance once the mission is in the correct state. Keyboard input for the same transition is handled separately by the repair case trigger, so pressing `E` requires the case to be focused through the shared interaction system. + +## Backend + +The backend lives in `backend/` and exposes: + +- `GET /health` for health checks +- `WS /ws` for frame input and hand tracking output + +The Python process uses MediaPipe and the local model file: + +```txt +backend/hand_landmarker.task +``` + +The backend sends normalized hand coordinates and landmarks. The frontend treats the values as screen-space inputs, then maps them into world space with the active Three.js camera. + +## Frontend Data Shape + +The shared types live in `src/types/handTracking/handTracking.ts`. + +```ts +interface HandTrackingHand { + x: number; + y: number; + z: number; + landmarks: HandTrackingLandmark[]; + handedness: string; + isFist: boolean; + score: number; +} +``` + +`x` and `y` are normalized camera coordinates. `z` is a relative depth value from MediaPipe, not an absolute world-space distance. + +## Grab Targeting + +The hand grab logic lives in `src/components/three/interaction/GrabbableObject.tsx`. + +The object is moved toward the visual center of the hand. That center is computed from the bounding box of all landmarks: + +```txt +centerX = (minX + maxX) / 2 +centerY = (minY + maxY) / 2 +``` + +Starting a grab uses a slightly wider virtual hit zone. Instead of raycasting only from one point, the code casts several rays around the hand center: + +- center +- left +- right +- up +- down + +If any ray hits the object while the object is within `INTERACTION_RADIUS`, the object enters hand-holding mode. + +## Depth Handling + +Because MediaPipe `z` is relative, the frontend captures the starting depth when the grab begins: + +```txt +initialHandZ = hand.z +initialHoldDistance = hit.distance +``` + +While holding, the object distance from the camera is adjusted by the change in hand depth: + +```txt +holdDistance = initialHoldDistance + (hand.z - initialHandZ) * sensitivity +``` + +The final hold distance is clamped between the configured grab minimum and maximum distances to avoid unstable movement. + +## UI And Debug + +The current debug UI includes: + +- `HandTrackingDebugPanel` inside `DebugOverlayLayout` for status, usage, loaded glove model, server state, hand count, and fist state +- `HandTrackingVisualizer` for the SVG landmark wireframe fallback +- `HandTrackingGlove` for the left-hand `gant_l` and right-hand `gant_r` models in the R3F scene +- `r3f-perf` for render performance +- `lil-gui` for scene, camera, lighting, interaction, and grab controls + +The hand tracking debug panel is a compact HTML grid outside the canvas. `Model loaded` displays the successfully loaded glove models. The SVG hand wireframe is only a fallback while models are loading or if a glove model fails to load. + +## Glove Models + +The current glove MVP uses `public/models/gant_l/model.gltf` and `public/models/gant_r/model.gltf`, which contain GLTF skins and armatures. Each model is positioned, oriented, and scaled from palm landmarks, then each finger bone chain is rotated toward the matching MediaPipe landmark chain. + +The glove models are intentionally smaller than the raw SVG overlay so they do not dominate the camera view. + +## Known Limitations + +- Production usage is currently limited to repair mission steps that explicitly need hands. +- MediaPipe depth is relative and can be noisy. +- The virtual hit zone is an approximation based on multiple raycasts, not a real 3D collider. +- There is no smoothing layer for hand position or depth yet. +- The SVG hand visualization is a fallback, not the primary display when glove models load correctly. +- Finger bone animation is an approximate landmark-to-bone mapping; it still needs calibration for per-model twist, offsets, and smoothing. diff --git a/docs/technical/target-architecture.md b/docs/technical/target-architecture.md index 9ad9c0e..80efa9f 100644 --- a/docs/technical/target-architecture.md +++ b/docs/technical/target-architecture.md @@ -5,7 +5,7 @@ This document describes the intended medium-term architecture for the project. ## Relationship To The Current Code - `docs/technical/architecture.md` is the source of truth for what exists now. -- This document is intentionally aspirational. +- This document describes intended direction, not implemented behavior. - If this document conflicts with the current implementation, the current implementation wins. ## Goals @@ -40,12 +40,12 @@ This document describes the intended medium-term architecture for the project. - performance overlay - scene helpers - free camera and calibration controls - - temporary test scenes used during development + - debug test scenes used during development ### UI Layer - `src/components/ui/` should contain player-facing HTML overlays. -- Expected future examples: +- Candidate examples: - crosshair - loading flow - mission HUD @@ -54,7 +54,7 @@ This document describes the intended medium-term architecture for the project. ### Gameplay Layer - As the project grows, gameplay state can move toward a clearer orchestration layer. -- Likely future concerns: +- Likely concerns: - missions - zones - cinematics @@ -67,4 +67,4 @@ This document describes the intended medium-term architecture for the project. - Prefer direct, working code over speculative scaffolding. - Shared types should stay close to their domain until they have multiple real consumers. - Avoid creating new managers or service layers without an active runtime need. -- Debug-only runtime paths should be clearly marked and easy to remove later. +- Debug-only runtime paths should be clearly marked and easy to remove when obsolete. diff --git a/docs/technical/zustand.md b/docs/technical/zustand.md new file mode 100644 index 0000000..3a20fb9 --- /dev/null +++ b/docs/technical/zustand.md @@ -0,0 +1,188 @@ +# Zustand Game State + +This document explains how Zustand is used in the current project. + +## Why Zustand Exists Here + +The project needs one shared source of truth for the player's progression through the experience. + +The current progression is split into main states: + +| Main state | Role | +| ---------- | ------------------------------- | +| `intro` | Onboarding and opening sequence | +| `bike` | E-bike repair sequence | +| `pylone` | Power grid sequence | +| `ferme` | Vertical farm sequence | +| `outro` | Ending sequence | + +Each main state can also own smaller sub state, such as the current mission step, dialogue audio, or completion flags. + +Zustand is useful because React and React Three Fiber components can subscribe only to the state slice they need. When that slice changes, only the subscribed components re-render. + +## Store Location + +The game progression store lives here: + +```txt +src/managers/stores/useGameStore.ts +``` + +The store is placed under `src/managers/stores/` because it belongs to the gameplay orchestration layer, not to a specific visual component. + +## Managers vs Store + +Managers are responsible for local runtime objects and imperative behavior. + +Examples: + +- `AudioManager` owns audio elements and sound pools. +- `InteractionManager` owns transient interaction handles and input-oriented behavior. + +Managers can read from or write to the Zustand store when their local behavior needs to affect global gameplay progression. + +The Zustand store is responsible for durable global state: + +- current main state +- mission sub state +- progression flags +- dialogue/audio references +- state transitions + +Rule of thumb: + +- manager = runtime objects, side effects, and local imperative logic +- store = global gameplay state that UI or world components can subscribe to + +## Current Shape + +The store exposes: + +- `mainState`: the active game phase +- `intro`: intro-specific state +- `bike`: e-bike mission state +- `pylone`: power grid mission state +- `ferme`: farm mission state +- `outro`: ending state +- actions for direct updates and progression updates + +The mission steps currently use this sequence: + +```ts +"locked" | + "waiting" | + "inspected" | + "fragmented" | + "scanning" | + "repairing" | + "reassembling" | + "done"; +``` + +## Reading State In Components + +Use selectors to read only what the component needs. + +```tsx +import { useGameStore } from "@/managers/stores/useGameStore"; + +export function Example(): React.JSX.Element { + const mainState = useGameStore((state) => state.mainState); + + return

Current state: {mainState}

; +} +``` + +This is better than reading the whole store, because the component re-renders only when `mainState` changes. + +## Updating State + +Prefer explicit actions from the store. + +```ts +const advanceGameState = useGameStore((state) => state.advanceGameState); + +advanceGameState(); +``` + +For development and debug tooling, direct setters also exist: + +```ts +const setMainState = useGameStore((state) => state.setMainState); + +setMainState("bike"); +``` + +Direct setters are useful for debug panels, but production gameplay should prefer business actions such as `advanceGameState`, `completeBike`, or `completePylone`. + +Mission gameplay that can target `bike`, `pylone`, or `ferme` should prefer the generic mission actions: + +```ts +const setMissionStep = useGameStore((state) => state.setMissionStep); +const completeMission = useGameStore((state) => state.completeMission); + +setMissionStep("bike", "inspected"); +completeMission("bike"); +``` + +This keeps reusable gameplay components such as repair flows from duplicating mission-specific branches like `setBikeState`, `setPyloneState`, and `setFermeState`. + +## World Integration + +`src/world/GameStageContent.tsx` subscribes to `mainState` and mounts stage-specific content. + +For repair missions, it mounts the reusable `RepairGame` component with a mission id: + +```tsx + +``` + +`RepairGame` reads the active mission step from the store and writes transitions through generic actions such as `setMissionStep` and `completeMission`. Shared repair ids, mission steps, and runtime guards live in `src/types/gameplay/repairMission.ts` so static mission config does not depend on the Zustand store. The production repair flow currently supports `waiting -> inspected -> fragmented -> scanning -> repairing -> reassembling -> done -> next mission` state transitions. + +Mission-specific behavior stays in `src/data/gameplay/repairMissions.ts`: each mission can define its broken nodes, placeholder targets, scan duration, and reassembly duration without adding mission branches to `RepairGame`. + +That means the scene can progressively move toward this pattern: + +```tsx +switch (mainState) { + case "intro": + return ; + case "bike": + return ; + case "pylone": + return ; + case "ferme": + return ; + case "outro": + return ; +} +``` + +In React Three Fiber, mounting and unmounting JSX controls what appears in the Three.js scene. When a state-specific component disappears from JSX, React removes it from the scene. + +## UI Integration + +`src/components/ui/GameUI.tsx` groups the HTML overlays used by the playable route. + +Current overlays: + +- `DebugOverlayLayout`: debug-only overlay shown with `?debug`, including the `GameStateDebugPanel` progression panel +- `GameStateDebugPanel`: compact debug UI for viewing and switching main/sub states, stepping backward or forward, and resetting the store +- `Crosshair`: player aiming helper +- `InteractPrompt`: interaction prompt +- `RepairMovementLockIndicator`: player-facing indicator shown while repair steps temporarily disable movement + +`src/pages/page.tsx` should stay thin and mount only the canvas and `GameUI`. + +## Regression Rules + +- Do not store per-frame values in Zustand. +- Use `useRef` for high-frequency mutable values such as player velocity, temporary vectors, or animation-loop data. +- Use selectors instead of reading the whole store in components. +- Keep gameplay transitions inside store actions when possible. +- Keep debug-only controls behind `?debug`. +- Add new state only when a real runtime feature needs it. + +## Next Steps + +Move repair validation into mission data once each mission has distinct broken module nodes, replacement assets, and completion events. diff --git a/docs/user/editor.md b/docs/user/editor.md new file mode 100644 index 0000000..af2dd5c --- /dev/null +++ b/docs/user/editor.md @@ -0,0 +1,166 @@ +# Editor User Guide + +The map editor is available at `/editor`. It is a browser-based tool for inspecting and adjusting the objects listed in `public/map.json`. + +## Purpose + +Use the editor when you need to move, rotate, or scale existing map objects without editing JSON by hand. + +The editor reads the same map data as the runtime scene: + +- `public/map.json` contains the object list. +- `public/models/{name}/model.glb` contains the matching 3D model for each object name. `model.gltf` is still supported as a fallback during migration. +- Missing models are displayed as gray fallback cubes, so incomplete maps remain editable. + +## Map Node Format + +Each entry in `public/map.json` represents one object: + +| Field | Description | +| ---------- | ------------------------------------------------- | +| `name` | Model folder name in `public/models/{name}` | +| `type` | Object category | +| `position` | Object position as `[x, y, z]` | +| `rotation` | Object rotation as `[x, y, z]`, expressed radians | +| `scale` | Object scale as `[x, y, z]` | + +## Editing Workflow + +1. Open `/editor` in the local app. +2. Click an object in the scene to select it. +3. Choose a transform mode: translate, rotate, or scale. +4. Drag the transform gizmo in the 3D view. +5. Check the JSON inspector if you need exact values. +6. Use undo or redo if the transform is not correct. +7. Export the JSON or save it to the dev server. + +## Controls + +| Action | Input | +| -------------------- | -------------------------- | +| Select object | Click object | +| Deselect | `Esc` or click empty space | +| Translate mode | `T` | +| Rotate mode | `R` | +| Scale mode | `S` | +| Undo | `Ctrl+Z` | +| Redo | `Ctrl+Y` | +| Locked view movement | `WASD`, `ZQSD`, arrows | +| Move up | `Space` | +| Move down | `Shift` | + +## View Mode + +The `Lock view` action switches the editor into a movement mode closer to the runtime player camera. Use it to navigate larger scenes while keeping the transform tools available. + +## JSON Inspector + +The side panel includes a raw JSON inspector: + +- When no object is selected, it shows the full map node list. +- When an object is selected, it highlights the JSON lines for that object. + +This is useful for checking numeric transform values before saving or exporting. + +## Saving Changes + +### Export JSON + +`Export JSON` downloads the current map node list as `map.json`. Use this when you want to manually replace `public/map.json`. + +### Save To Server + +`Save to server` is available only during local development. It writes the edited map back to `public/map.json` through the Vite dev-server endpoint. + +The button is hidden in production builds because production persistence is not implemented. + +## Editing Dialogue Subtitles + +The side panel also includes dialogue tools for the dialogue manifest and SRT subtitles. + +### Dialogue Manifest + +Use the `Dialogues` panel to edit `public/sounds/dialogue/dialogues.json` without opening the JSON file manually. + +Available actions: + +- `Reload` reloads the manifest from disk. +- `Add` creates a local dialogue entry for the current voice and assigns the next available SRT cue index. +- `Save` writes the manifest through the local Vite dev server. +- `Preview dialogue` plays the selected dialogue and shows subtitles in the editor overlay. +- `Create FR SRT cue` creates the matching French SRT cue if it is missing. +- `Delete dialogue` removes the selected entry locally. + +After using `Add`, save the manifest to keep the new dialogue entry. The generated SRT cue is written immediately to the French SRT file, but the dialogue manifest is still only local until `Save` is clicked. + +New dialogue audio paths start as placeholders such as `/sounds/dialogue/new_dialogue_24.mp3`. Replace them with real MP3 paths before validating the final asset set. + +### SRT Editor + +Use the `SRT` panel to edit one subtitle file at a time. + +1. Choose a voice: `narrateur`, `fermier`, or `electricienne`. +2. Choose a language: `FR` or `EN`. +3. Edit the SRT text directly in the textarea. +4. Use the audio preview to check the selected dialogue. +5. Use `Set start`, `Set end`, `-100ms`, and `+100ms` to adjust the selected cue timing against the audio. +6. Use `Save SRT` during local development, or `Export SRT` to download the file manually. + +Each SRT file belongs to one voice, not one dialogue. Cue indexes must match the `subtitleCueIndex` values referenced by the dialogue manifest. + +## Validating Dialogue Assets + +Use `Validate` in the SRT panel to check the dialogue manifest and linked assets. + +The validation checks: + +- `public/sounds/dialogue/dialogues.json` +- referenced dialogue audio files +- French SRT files +- subtitle cue indexes referenced by the manifest + +Missing English SRT files are warnings, not errors, because the runtime falls back to French subtitles. This is intentional until the English translation workflow is ready. + +## Editing Cinematics + +Use the `Cinematics` panel to edit `public/cinematics.json`. + +Each cinematic contains: + +- an `id` +- an optional global `timecode` +- two or more camera keyframes +- optional dialogue cues synchronized to the cinematic timeline + +Camera keyframes define: + +- `time`: seconds relative to the cinematic start +- `position`: camera position `[x, y, z]` +- `target`: point the camera looks at `[x, y, z]` + +Dialogue cues define: + +- `time`: seconds relative to the cinematic start +- `dialogueId`: an entry from `public/sounds/dialogue/dialogues.json` + +Available actions: + +- `Reload` reloads the cinematic manifest from disk. +- `Add` creates a new local cinematic with two camera keyframes. +- `Save` writes `public/cinematics.json` through the local Vite dev server. +- `Preview cinematic` plays the selected camera animation in the editor canvas. +- `Add keyframe` and `Remove` edit the camera path. +- `Add dialogue` and `Remove` edit dialogue cues linked to the cinematic. +- `Delete cinematic` removes the selected cinematic locally. + +Cinematic dialogue cues are the preferred way to synchronize a dialogue with a cinematic. Avoid also giving the same dialogue a global `timecode`, or it can be triggered twice. + +## Current Limitations + +- The editor only modifies existing nodes. +- It does not create or delete objects. +- It does not edit model files or textures. +- It does not provide production persistence. +- Fallback cubes indicate missing models; they are editor placeholders, not exported assets. +- SRT saving is a local Vite dev-server helper, not a production backend feature. +- Dialogue and cinematic saves are local Vite dev-server helpers, not production backend features. diff --git a/docs/user/features.md b/docs/user/features.md index 133c126..ed7b982 100644 --- a/docs/user/features.md +++ b/docs/user/features.md @@ -5,8 +5,10 @@ This document lists features that are implemented in the current codebase. ## Scene - Fullscreen React Three Fiber scene -- Main map scene loaded from `public/models/map/model.gltf` -- Debug physics test scene selectable from the debug panel +- Main map scene loaded from `public/map.json` and matching `public/models/{name}/model.glb` or `model.gltf` assets +- Minimal fullscreen scene loading overlay for 3D scenes, with a global progress bar used by the production map, debug physics scene, and editor scene +- Debug physics test scene selectable from the debug panel, including grab/trigger tests, an animated model preview, and separate repair playground zones for `bike`, `pylone`, and `ferme` +- Rapier physics context available for production stage gameplay objects - Ambient and directional lighting - Environment background setup @@ -16,34 +18,95 @@ This document lists features that are implemented in the current codebase. - Pointer lock mouse look - Movement with `ZQSD` - Jumping -- Octree-based collision against the loaded map +- Movement lock during active repair steps, with an on-screen indicator while keeping trigger interactions available +- Octree-based collision against dedicated map collision nodes, currently scoped to `terrain` ## Interactions - Focus detection by distance and raycast - Trigger interactions activated with `E` - Grab interactions activated with the primary mouse button +- Physics-backed gameplay objects can be mounted inside stage content without replacing player octree collision - Interaction prompt shown for trigger interactions +## Repair Gameplay + +- Reusable production `RepairGame` mounted for `bike`, `pylone`, and `ferme` mission states +- Debug physics playground mounts the same reusable `RepairGame` in `Bike`, `Pylone`, and `Farm` zones so each state can be tuned with isolated positioning before moving placement into the production map +- Repair mission config shared through `src/data/gameplay/repairMissions.ts`, including per-mission broken nodes, placeholder targets, scan timing, and reassembly timing +- Repair-game flow supports `waiting -> inspected -> fragmented -> scanning -> repairing -> reassembling -> done -> next mission` with `.webm` prompts, repair case spawn/opening/exit, focused repair-case view, movement lock indicator during active repair, repair-case trigger interaction, case placeholder traversal, snap-to-placeholder placement, broken-part deposit feedback, `E`, two-fists hold input, exploded and inverse reassembly transitions, completion particles, per-part scan visuals, persistent red broken-part markers, centered broken-part UI videos, multiple grabbable replacement choices, correct-part install validation feedback, and mission completion + ## Audio -- One-shot sound playback for trigger interactions -- Simple per-sound pooling through `AudioManager` +- Category-based volumes for music, SFX, and dialogue +- Looped background music playback through `AudioManager` +- One-shot sound playback for SFX and dialogue, with simple per-sound pooling +- Optional stereo pan for one-shot sounds + +## Dialogue And Subtitles + +- Dialogue manifest in `public/sounds/dialogue/dialogues.json` +- Dialogue audio loaded from `public/sounds/dialogue/` +- One SRT subtitle file per voice and language +- French subtitle fallback when the selected language file is missing +- Runtime subtitle overlay with speaker-specific colors +- Timecoded dialogue trigger support for dialogue entries that define `timecode` +- Dialogue queueing to avoid overlapping dialogue playback + +## Cinematics + +- Cinematic manifest in `public/cinematics.json` +- Timecoded cinematic trigger support +- GSAP camera keyframe playback +- Optional dialogue cues synchronized to cinematic timelines +- Player input lock while a cinematic is active + +## Game Options Menu + +- `Esc` opens and closes the in-game options menu +- Music, SFX, and dialogue volume sliders +- Subtitle visibility toggle +- Subtitle language choice between French and English +- Repair runtime choice between local JavaScript and Python server mode +- Quit action that clears browser-accessible cookies and returns to `/` ## Debug Tooling - `?debug` query param enables the debug panel -- `lil-gui` controls for camera mode, scene mode, and interaction spheres +- `lil-gui` controls for camera mode, scene mode, `R3F Perf`, `Debug Overlay`, and interaction tuning +- Compact debug overlay for game state controls and hand tracking status +- Debug game-state mission switching unlocks locked repair missions at `waiting` for faster testing - Debug scene helpers - Free debug camera - `r3f-perf` overlay +## Map Editor + +- `/editor` route for inspecting and editing `public/map.json` +- Automatic loading of `public/map.json` when available +- Folder upload fallback when `map.json` is missing +- Rendering of available `public/models/{name}/model.glb` or `model.gltf` assets +- Fallback cubes for nodes whose model is missing +- Object selection by click +- Transform modes for translate, rotate, and scale +- Keyboard shortcuts for `T`, `R`, `S`, `Esc`, undo, and redo +- Player-style navigation mode with `WASD`, `ZQSD`, arrow keys, `Space`, and `Shift` +- JSON export for downloading the edited map +- Dev-server save endpoint for writing changes back to `public/map.json` +- SRT editor for dialogue subtitles +- Audio preview and timing helpers for SRT cues +- Dev-server save endpoint for SRT files +- Dialogue manifest editor with preview and assisted French SRT cue creation +- Cinematic manifest editor with camera keyframes, dialogue cues, and canvas preview +- Dialogue manifest validation from the editor UI + ## Not Implemented Yet -- mission system +- complete mission system - zone system -- cinematic system -- dialogue system +- full cinematic system beyond current timecode prototype +- gameplay-triggered dialogue branches beyond current prototype triggers - loading flow - minimap and mission HUD - full production separation between gameplay and debug scenes +- production backend persistence for editor saves diff --git a/docs/user/main-feature.md b/docs/user/main-feature.md new file mode 100644 index 0000000..3f590a3 --- /dev/null +++ b/docs/user/main-feature.md @@ -0,0 +1,110 @@ +# Main Feature + +This document explains the current repair-game flow in La-Fabrik. + +## What It Does + +The main feature is a reusable repair flow mounted in the production game scene. It lets the player approach the active mission object, inspect it, fragment it, scan the broken part, install the correct replacement, validate completion, and move to the next mission state. + +The current user flow is: + +1. Enter a mission state such as `bike`, `pylone`, or `ferme`. +2. Move close to the active repair object in the game scene. +3. Aim at the object and press the interaction key when prompted. +4. The mission step moves from `waiting` to `inspected`. +5. The repair case appears near the mission object, the player movement controls are locked, and the case can float when the player approaches it. +6. Aim at the repair case and press `E`, or hold both fists closed for one second, to move from `inspected` to `fragmented`. +7. The mission object uses an exploded-model transition, then moves to `scanning`. +8. The scan visual moves across the fragmented model one part at a time and keeps a red marker plus the `cassé.webm` prompt centered on any configured broken part once it has been found. +9. In `repairing`, the case opens in a larger focused view and several grabbable replacement parts appear on the case placeholders. +10. Move the correct replacement part close to a placeholder. When released near a placeholder, it snaps into place with a short animation. +11. Move each scanned broken part into a compatible placeholder so the damaged parts are stored in the case. +12. Press `E` on the green install target to move to `reassembling`. Wrong parts turn the target red and cannot finish the repair. +13. The exploded object animates back into its assembled form with completion particles, then moves to `done` and restores player movement controls. +14. Press `E` on the completion target. The repair case closes, returns to the ground, disappears, then `completeMission` moves to the next mission or to `outro` after `ferme`. + +## Why It Matters + +This feature validates the repair loop before a full mission system exists. It tests whether repair objects, physical proximity, model selection, audio feedback, and exploded model visualization can work together in the 3D scene. + +## Current Behavior + +In `waiting`, the active mission renders its repair object and the `interagir.webm` prompt in the game scene. The interaction uses the shared focus/raycast interaction system, so the player still gets the normal `E` prompt. + +When the player inspects the object, `RepairGame` writes `inspected` through the generic mission store action. The repair case then appears from the mission config with a small pop animation, player movement is locked while the repair sequence is active, and a small HTML indicator confirms that movement is temporarily unavailable. When the player is close enough, the existing case model floats upward and rotates gently to signal interactivity. + +In `inspected`, `RepairGame` can also move to `fragmented`. Keyboard input goes through the shared focus/raycast interaction system on the repair case, so the player must be close enough and aim at the case before pressing `E`. The hand-tracking path still uses a two-fists hold gesture and is state-based, so it does not depend on being inside a local object interaction radius. + +In `fragmented`, the repair object is rendered with `ExplodableModel`, then automatically advances to `scanning`. In `scanning`, the exploded model remains visible, a blue scan visual moves from part to part, and a red halo/wire marker plus the configured broken UI video stay attached to configured broken parts after the scanner reaches them. The scan can match a specific `nodeName` when mission data provides one, otherwise it falls back to the first scanned parts as placeholder broken parts. In `repairing`, the case opens in a larger focused transform, `RepairCaseModel` traverses the case GLTF for empty nodes named `placeholder_*`, several grabbable replacement parts appear on those placeholder positions, and releasing a part near a placeholder snaps it into place with a short GSAP animation. Scanned broken parts are also rendered as grabbable objects and must be deposited into a compatible placeholder before the final install target validates. If `brokenParts[].placeholderName` is configured, that broken part snaps only to the matching placeholder; otherwise it can use any available placeholder. If the current case asset has no placeholder nodes, the flow keeps using fallback focus positions. Replacement parts show green or red placement feedback after snapping, broken parts show stored feedback after deposit, and the install target gives a short blocked feedback if the player tries to validate too early. The install target only validates when the configured correct replacement part is placed and all scanned broken parts have been deposited. Player movement stays locked through `inspected`, `fragmented`, `scanning`, `repairing`, and `reassembling`, while trigger interactions remain available. In `reassembling`, the exploded model animates back into its assembled position with green completion particles before the flow moves to `done`. In `done`, player movement is available again and the repaired object remains visible with a completion target; validating closes the repair case first, then plays the case exit animation before advancing the global mission progression. + +The mission config now carries the mission-specific variations. `bike` repairs one cooling core, `pylone` scans and stores both the lamp relay and a damaged panel with slower scan/reassembly timing, and `ferme` scans and stores an irrigation pump plus humidity sensor with faster scan/reassembly timing. + +## Key Files + +- `src/world/GameStageContent.tsx` mounts production `RepairGame` instances for `bike`, `pylone`, and `ferme`. +- `src/components/three/gameplay/RepairCompletionStep.tsx` renders the final repaired object, completion target, case exit animation, and mission UI prompt. +- `src/components/three/gameplay/RepairGame.tsx` composes the reusable production repair flow. +- `src/components/three/gameplay/RepairBrokenPartHighlight.tsx` renders the red halo and wire marker around detected broken parts during scanning. +- `src/components/three/gameplay/RepairBrokenPartPrompt.tsx` centers the configured broken UI video on detected broken parts during scanning. +- `src/components/three/gameplay/RepairInspectionObject.tsx` handles the `waiting` inspection interaction. +- `src/components/three/gameplay/RepairMissionCase.tsx` renders the mission repair case after inspection. +- `src/components/three/gameplay/RepairRepairingStep.tsx` renders grabbable replacement choices, grabbable scanned broken parts, placeholder placement markers, snap placement behavior, correct-part and broken-part placement validation, and the install trigger in `repairing`. +- `src/components/three/gameplay/RepairReassemblyStep.tsx` renders the inverse fragmentation animation before the final completion step. +- `src/components/three/gameplay/RepairCompletionParticles.tsx` renders the green completion particles during reassembly. +- `src/components/three/gameplay/RepairPromptVideo.tsx` renders `.webm` prompts inside the 3D scene. +- `src/components/three/gameplay/RepairScanSequence.tsx` keeps the exploded model visible and advances the scan from part to part. +- `src/components/three/gameplay/RepairScanVisual.tsx` renders the scan halo and scan line around the active part. +- `src/components/ui/RepairMovementLockIndicator.tsx` renders the HTML indicator shown while repair movement is locked. +- `src/hooks/gameplay/useRepairFragmentationInput.ts` handles the `inspected -> fragmented` two-fists input and can optionally bind keyboard input for non-trigger flows. +- `src/hooks/gameplay/useRepairMissionStep.ts` reads the active mission step from the game store. +- `src/hooks/gameplay/useRepairMovementLocked.ts` exposes the shared repair movement-lock rule used by the player controller and UI indicator. +- `src/hooks/handTracking/useBothFistsHold.ts` detects the reusable two-fists hold gesture. +- `src/components/three/gameplay/RepairCaseModel.tsx` renders and animates the case model, and exposes `placeholder_*` transforms when the GLTF provides them. +- `src/components/three/models/ExplodableModel.tsx` renders selectable models with split/exploded visualization. +- `src/data/gameplay/repairCaseConfig.ts` stores repair case model, sound, and animation constants. +- `src/data/gameplay/repairGameConfig.ts` stores repair flow timing constants. +- `src/data/gameplay/repairMissions.ts` stores reusable repair mission config for `bike`, `pylone`, and `ferme`. +- `src/managers/stores/useGameStore.ts` stores mission progression state and generic mission step helpers. +- `src/types/gameplay/repairMission.ts` contains shared repair mission ids, mission steps, and guards used by the store, data config, debug UI, and gameplay components. + +## Runtime Requirements + +The production repair flow currently requires: + +- the active `mainState` to be one of `bike`, `pylone`, or `ferme` +- `GameStageContent` mounted inside the game scene Rapier `Physics` boundary +- model assets available under `public/models/` +- sound assets available under `public/sounds/` + +Frontend command: + +```bash +npm run dev +``` + +Debug URL for state switching and inspection: + +```txt +http://localhost:5173/?debug +``` + +The debug physics scene keeps the existing grab, trigger, and animated model tests, and also exposes separate `Bike`, `Pylone`, and `Farm` repair playground zones. Use the debug game-state panel to switch `mainState`; selecting a locked repair mission in that panel opens it at `waiting`, and the matching repair zone mounts the same reusable `RepairGame` flow with that mission's model, broken parts, replacement parts, prompts, and timings. + +## Related Hand Tracking + +Hand tracking can move grabbable physics objects with webcam input in debug scenes. In the production repair flow, it is also used for the `inspected -> fragmented` transition through the two-fists hold gesture. + +For hand tracking, run the Python backend separately: + +```bash +source backend/.venv/bin/activate +python -m backend.main +``` + +## Current Limitations + +- The reusable production `RepairGame` currently covers `waiting -> inspected -> fragmented -> scanning -> repairing -> reassembling -> done -> next mission`. +- Mission progression is wired through Zustand using `completeMission` at the end of each repair. +- There is no central `GameManager` in this branch. +- Hand tracking is available for the two-fists input and grabbable repair parts; case interaction and final installation still use the shared `E` trigger path. +- The repair-game content is configured statically in `src/data/gameplay/`. diff --git a/eslint.config.js b/eslint.config.js index 75d3c46..aef40fc 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -2,6 +2,7 @@ import js from "@eslint/js"; import globals from "globals"; import reactHooks from "eslint-plugin-react-hooks"; import reactRefresh from "eslint-plugin-react-refresh"; +import prettierRecommended from "eslint-plugin-prettier/recommended"; import tseslint from "typescript-eslint"; import { defineConfig, globalIgnores } from "eslint/config"; @@ -20,4 +21,5 @@ export default defineConfig([ globals: globals.browser, }, }, + prettierRecommended, ]); diff --git a/package-lock.json b/package-lock.json index fa74fed..3a4a64a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,17 +8,21 @@ "name": "la-fabrik", "version": "0.0.1", "dependencies": { + "@mediapipe/tasks-vision": "^0.10.35", "@react-three/drei": "^10.7.7", - "@react-three/fiber": "^9.6.0", - "@react-three/postprocessing": "^3.0.4", + "@react-three/fiber": "^9.6.1", "@react-three/rapier": "^2.2.0", + "@tanstack/react-router": "^1.168.25", "gsap": "^3.15.0", "lil-gui": "^0.21.0", + "lucide-react": "^1.11.0", "r3f-perf": "^7.2.3", "react": "^19.2.4", "react-dom": "^19.2.4", - "three": "^0.183.2", - "zustand": "^5.0.13" + "react-markdown": "^10.1.0", + "remark-gfm": "^4.0.1", + "three": "0.182.0", + "zustand": "^5.0.12" }, "devDependencies": { "@eslint/js": "^9.39.4", @@ -36,6 +40,9 @@ "typescript": "~6.0.2", "typescript-eslint": "^8.58.0", "vite": "^8.0.4" + }, + "engines": { + "node": ">=20.19.0 || >=22.12.0" } }, "node_modules/@babel/code-frame": { @@ -287,12 +294,6 @@ "node": ">=6.9.0" } }, - "node_modules/@dimforge/rapier3d-compat": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.19.2.tgz", - "integrity": "sha512-AZHL1jqUF55QJkJyU1yKeh4ImX2J93bVLIezT1+o0FZqTix6O06MOaqpKoJ4MmbDCsoZmwO+qc471/SDMDm2AA==", - "license": "Apache-2.0" - }, "node_modules/@emnapi/core": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", @@ -601,9 +602,9 @@ } }, "node_modules/@mediapipe/tasks-vision": { - "version": "0.10.17", - "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", - "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", + "version": "0.10.35", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.35.tgz", + "integrity": "sha512-HOvadwVRE6JC+45nyYhmnywnr5h/J8KZvOeUNVOG9q/0875pZgItznFB9bRTvLc264YSJqiZ1NsIpCStJw/egg==", "license": "Apache-2.0" }, "node_modules/@monogrid/gainmap-js": { @@ -669,18 +670,6 @@ "react": "^16.x || ^17.x || ^18.x || ^19.0.0 || ^19.0.0-rc" } }, - "node_modules/@react-spring/rafz": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz", - "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==", - "license": "MIT" - }, - "node_modules/@react-spring/types": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz", - "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==", - "license": "MIT" - }, "node_modules/@react-three/drei": { "version": "10.7.7", "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-10.7.7.tgz", @@ -721,10 +710,16 @@ } } }, + "node_modules/@react-three/drei/node_modules/@mediapipe/tasks-vision": { + "version": "0.10.17", + "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.17.tgz", + "integrity": "sha512-CZWV/q6TTe8ta61cZXjfnnHsfWIdFhms03M9T7Cnd5y2mdpylJM0rF1qRq+wsQVRMLz1OYPVEBU9ph2Bx8cxrg==", + "license": "Apache-2.0" + }, "node_modules/@react-three/fiber": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.6.0.tgz", - "integrity": "sha512-90abYK2q5/qDM+GACs9zRvc5KhEEpEWqWlHSd64zTPNxg+9wCJvTfyD9x2so7hlQhjRYO1Fa6flR3BC/kpTFkA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-9.6.1.tgz", + "integrity": "sha512-zF0rsKcVYpcJwbFEnv2HkHX9cvOEgsfQo/X8lwmR2dn13S4qEQJXir9fxf5js2LQFoXqxOY7MDkOkYx2uZ4gSg==", "license": "MIT", "dependencies": { "@babel/runtime": "^7.17.8", @@ -769,32 +764,6 @@ } } }, - "node_modules/@react-three/postprocessing": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@react-three/postprocessing/-/postprocessing-3.0.4.tgz", - "integrity": "sha512-e4+F5xtudDYvhxx3y0NtWXpZbwvQ0x1zdOXWTbXMK6fFLVDd4qucN90YaaStanZGS4Bd5siQm0lGL/5ogf8iDQ==", - "license": "MIT", - "dependencies": { - "maath": "^0.6.0", - "n8ao": "^1.9.4", - "postprocessing": "^6.36.6" - }, - "peerDependencies": { - "@react-three/fiber": "^9.0.0", - "react": "^19.0", - "three": ">= 0.156.0" - } - }, - "node_modules/@react-three/postprocessing/node_modules/maath": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/maath/-/maath-0.6.0.tgz", - "integrity": "sha512-dSb2xQuP7vDnaYqfoKzlApeRcR2xtN8/f7WV/TMAkBC8552TwTLtOO0JTcSygkYMjNDPoo6V01jTw/aPi4JrMw==", - "license": "MIT", - "peerDependencies": { - "@types/three": ">=0.144.0", - "three": ">=0.144.0" - } - }, "node_modules/@react-three/rapier": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@react-three/rapier/-/rapier-2.2.0.tgz", @@ -810,6 +779,12 @@ "three": ">=0.159.0" } }, + "node_modules/@react-three/rapier/node_modules/@dimforge/rapier3d-compat": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@dimforge/rapier3d-compat/-/rapier3d-compat-0.19.1.tgz", + "integrity": "sha512-xvFNtb/9xILxfvdFOa7NCnYUEF6cfn51R44C1xnKXtk5DpyAARqsC4sxZwiJAHRSzYT5FFe889t36iFnzb3vxg==", + "license": "Apache-2.0" + }, "node_modules/@rolldown/binding-android-arm64": { "version": "1.0.0-rc.17", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", @@ -1083,6 +1058,92 @@ "react": ">= 16.3.0" } }, + "node_modules/@tanstack/history": { + "version": "1.161.6", + "resolved": "https://registry.npmjs.org/@tanstack/history/-/history-1.161.6.tgz", + "integrity": "sha512-NaOGLRrddszbQj9upGat6HG/4TKvXLvu+osAIgfxPYA+eIvYKv8GKDJOrY2D3/U9MRnKfMWD7bU4jeD4xmqyIg==", + "license": "MIT", + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-router": { + "version": "1.168.25", + "resolved": "https://registry.npmjs.org/@tanstack/react-router/-/react-router-1.168.25.tgz", + "integrity": "sha512-4U/E76dc+fYuLixjV1RLNfqrkQoexSL8MqGNpIHOodtvY3fMPGaALrvDVtBDQYBEU4z5r5fHaV6+kclWAVFP9A==", + "license": "MIT", + "dependencies": { + "@tanstack/history": "1.161.6", + "@tanstack/react-store": "^0.9.3", + "@tanstack/router-core": "1.168.17", + "isbot": "^5.1.22" + }, + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=18.0.0 || >=19.0.0", + "react-dom": ">=18.0.0 || >=19.0.0" + } + }, + "node_modules/@tanstack/react-store": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-store/-/react-store-0.9.3.tgz", + "integrity": "sha512-y2iHd/N9OkoQbFJLUX1T9vbc2O9tjH0pQRgTcx1/Nz4IlwLvkgpuglXUx+mXt0g5ZDFrEeDnONPqkbfxXJKwRg==", + "license": "MIT", + "dependencies": { + "@tanstack/store": "0.9.3", + "use-sync-external-store": "^1.6.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@tanstack/router-core": { + "version": "1.168.17", + "resolved": "https://registry.npmjs.org/@tanstack/router-core/-/router-core-1.168.17.tgz", + "integrity": "sha512-VDq7HCqRK3sdpxoETwYoTXTaYi+OVQC197g1fdzaiZBUmhntfjn+PQc15OzTqNNhf8Menk6r6ftmuphybMKdig==", + "license": "MIT", + "dependencies": { + "@tanstack/history": "1.161.6", + "cookie-es": "^3.0.0", + "seroval": "^1.5.0", + "seroval-plugins": "^1.5.0" + }, + "bin": { + "intent": "bin/intent.js" + }, + "engines": { + "node": ">=20.19" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/store": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/@tanstack/store/-/store-0.9.3.tgz", + "integrity": "sha512-8reSzl/qGWGGVKhBoxXPMWzATSbZLZFWhwBAFO9NAyp0TxzfBP0mIrGb8CP8KrQTmvzXlR/vFPPUrHTLBGyFyw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tweenjs/tween.js": { "version": "23.1.3", "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.3.tgz", @@ -1100,6 +1161,15 @@ "tslib": "^2.4.0" } }, + "node_modules/@types/debug": { + "version": "4.1.13", + "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", + "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, "node_modules/@types/draco3d": { "version": "1.4.10", "resolved": "https://registry.npmjs.org/@types/draco3d/-/draco3d-1.4.10.tgz", @@ -1110,9 +1180,26 @@ "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "dev": true, "license": "MIT" }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", + "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", + "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1120,6 +1207,21 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", + "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "license": "MIT" + }, "node_modules/@types/node": { "version": "24.12.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.2.tgz", @@ -1190,6 +1292,12 @@ "integrity": "sha512-uekIGetywIgopfD97oDL5PfeezkFpNhwlzlaEYNOA0N6ghdsOvh/HYjSMek5Q2O1PYvRSDFcqFVJl4r4ZBwOow==", "license": "Apache-2.0" }, + "node_modules/@types/unist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", + "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", + "license": "MIT" + }, "node_modules/@types/webxr": { "version": "0.5.24", "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.24.tgz", @@ -1197,17 +1305,17 @@ "license": "MIT" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.0.tgz", - "integrity": "sha512-HyAZtpdkgZwpq8Sz3FSUvCR4c+ScbuWa9AksK2Jweub7w4M3yTz4O11AqVJzLYjy/B9ZWPyc81I+mOdJU/bDQw==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.1.tgz", + "integrity": "sha512-BOziFIfE+6osHO9FoJG4zjoHUcvI7fTNBSpdAwrNH0/TLvzjsk2oo8XSSOT2HhqUyhZPfHv4UOffoJ9oEEQ7Ag==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", - "@typescript-eslint/scope-manager": "8.59.0", - "@typescript-eslint/type-utils": "8.59.0", - "@typescript-eslint/utils": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/type-utils": "8.59.1", + "@typescript-eslint/utils": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" @@ -1220,7 +1328,7 @@ "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^8.59.0", + "@typescript-eslint/parser": "^8.59.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } @@ -1236,16 +1344,16 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.0.tgz", - "integrity": "sha512-TI1XGwKbDpo9tRW8UDIXCOeLk55qe9ZFGs8MTKU6/M08HWTw52DD/IYhfQtOEhEdPhLMT26Ka/x7p70nd3dzDg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.59.1.tgz", + "integrity": "sha512-HDQH9O/47Dxi1ceDhBXdaldtf/WV9yRYMjbjCuNk3qnaTD564qwv61Y7+gTxwxRKzSrgO5uhtw584igXVuuZkA==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/scope-manager": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", "debug": "^4.4.3" }, "engines": { @@ -1261,14 +1369,14 @@ } }, "node_modules/@typescript-eslint/project-service": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.0.tgz", - "integrity": "sha512-Lw5ITrR5s5TbC19YSvlr63ZfLaJoU6vtKTHyB0GQOpX0W7d5/Ir6vUahWi/8Sps/nOukZQ0IB3SmlxZnjaKVnw==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.59.1.tgz", + "integrity": "sha512-+MuHQlHiEr00Of/IQbE/MmEoi44znZHbR/Pz7Opq4HryUOlRi+/44dro9Ycy8Fyo+/024IWtw8m4JUMCGTYxDg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/tsconfig-utils": "^8.59.0", - "@typescript-eslint/types": "^8.59.0", + "@typescript-eslint/tsconfig-utils": "^8.59.1", + "@typescript-eslint/types": "^8.59.1", "debug": "^4.4.3" }, "engines": { @@ -1283,14 +1391,14 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.0.tgz", - "integrity": "sha512-UzR16Ut8IpA3Mc4DbgAShlPPkVm8xXMWafXxB0BocaVRHs8ZGakAxGRskF7FId3sdk9lgGD73GSFaWmWFDE4dg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.59.1.tgz", + "integrity": "sha512-LwuHQI4pDOYVKvmH2dkaJo6YZCSgouVgnS/z7yBPKBMvgtBvyLqiLy9Z6b7+m/TRcX1NFYUqZetI5Y+aT4GEfg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0" + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1301,9 +1409,9 @@ } }, "node_modules/@typescript-eslint/tsconfig-utils": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.0.tgz", - "integrity": "sha512-91Sbl3s4Kb3SybliIY6muFBmHVv+pYXfybC4Oolp3dvk8BvIE3wOPc+403CWIT7mJNkfQRGtdqghzs2+Z91Tqg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.59.1.tgz", + "integrity": "sha512-/0nEyPbX7gRsk0Uwfe4ALwwgxuA66d/l2mhRDNlAvaj4U3juhUtJNq0DsY8M2AYwwb9rEq2hrC3IcIcEt++iJA==", "dev": true, "license": "MIT", "engines": { @@ -1318,15 +1426,15 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.0.tgz", - "integrity": "sha512-3TRiZaQSltGqGeNrJzzr1+8YcEobKH9rHnqIp/1psfKFmhRQDNMGP5hBufanYTGznwShzVLs3Mz+gDN7HkWfXg==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.59.1.tgz", + "integrity": "sha512-klWPBR2ciQHS3f++ug/mVnWKPjBUo7icEL3FAO1lhAR1Z1i5NQYZ1EannMSRYcq5qCv5wNALlXr6fksRHyYl7w==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0", - "@typescript-eslint/utils": "8.59.0", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/utils": "8.59.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, @@ -1343,9 +1451,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.0.tgz", - "integrity": "sha512-nLzdsT1gdOgFxxxwrlNVUBzSNBEEHJ86bblmk4QAS6stfig7rcJzWKqCyxFy3YRRHXDWEkb2NralA1nOYkkm/A==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.59.1.tgz", + "integrity": "sha512-ZDCjgccSdYPw5Bxh+my4Z0lJU96ZDN7jbBzvmEn0FZx3RtU1C7VWl6NbDx94bwY3V5YsgwRzJPOgeY2Q/nLG8A==", "dev": true, "license": "MIT", "engines": { @@ -1357,16 +1465,16 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.0.tgz", - "integrity": "sha512-O9Re9P1BmBLFJyikRbQpLku/QA3/AueZNO9WePLBwQrvkixTmDe8u76B6CYUAITRl/rHawggEqUGn5QIkVRLMw==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.59.1.tgz", + "integrity": "sha512-OUd+vJS05sSkOip+BkZ/2NS8RMxrAAJemsC6vU3kmfLyeaJT0TftHkV9mcx2107MmsBVXXexhVu4F0TZXyMl4g==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/project-service": "8.59.0", - "@typescript-eslint/tsconfig-utils": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/visitor-keys": "8.59.0", + "@typescript-eslint/project-service": "8.59.1", + "@typescript-eslint/tsconfig-utils": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/visitor-keys": "8.59.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", @@ -1437,16 +1545,16 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.0.tgz", - "integrity": "sha512-I1R/K7V07XsMJ12Oaxg/O9GfrysGTmCRhvZJBv0RE0NcULMzjqVpR5kRRQjHsz3J/bElU7HwCO7zkqL+MSUz+g==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.59.1.tgz", + "integrity": "sha512-3pIeoXhCeYH9FSCBI8P3iNwJlGuzPlYKkTlen2O9T1DSeeg8UG8jstq6BLk+Mda0qup7mgk4z4XL4OzRaxZ8LA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", - "@typescript-eslint/scope-manager": "8.59.0", - "@typescript-eslint/types": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0" + "@typescript-eslint/scope-manager": "8.59.1", + "@typescript-eslint/types": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -1461,13 +1569,13 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.0.tgz", - "integrity": "sha512-/uejZt4dSere1bx12WLlPfv8GktzcaDtuJ7s42/HEZ5zGj9oxRaD4bj7qwSunXkf+pbAhFt2zjpHYUiT5lHf0Q==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.59.1.tgz", + "integrity": "sha512-LdDNl6C5iJExcM0Yh0PwAIBb9PrSiCsWamF/JyEZawm3kFDnRoaq3LGE4bpyRao/fWeGKKyw7icx0YxrLFC5Cg==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/types": "8.59.0", + "@typescript-eslint/types": "8.59.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { @@ -1491,6 +1599,12 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@ungap/structured-clone": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", + "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", + "license": "ISC" + }, "node_modules/@use-gesture/core": { "version": "10.3.1", "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", @@ -1615,6 +1729,16 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/bail": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", + "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1777,6 +1901,16 @@ ], "license": "CC-BY-4.0" }, + "node_modules/ccount": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", + "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1794,6 +1928,46 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/character-entities": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", + "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", + "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", + "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", + "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1814,6 +1988,16 @@ "dev": true, "license": "MIT" }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", + "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -1828,6 +2012,12 @@ "dev": true, "license": "MIT" }, + "node_modules/cookie-es": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-3.1.1.tgz", + "integrity": "sha512-UaXxwISYJPTr9hwQxMFYZ7kNhSXboMXP+Z3TRX6f1/NyaGPfuNUZOWP1pUEb75B2HjfklIYLVRfWiFZJyC6Npg==", + "license": "MIT" + }, "node_modules/cross-env": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-7.0.3.tgz", @@ -1870,7 +2060,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -1884,6 +2073,19 @@ } } }, + "node_modules/decode-named-character-reference": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", + "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -1891,6 +2093,15 @@ "dev": true, "license": "MIT" }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/detect-gpu": { "version": "5.0.70", "resolved": "https://registry.npmjs.org/detect-gpu/-/detect-gpu-5.0.70.tgz", @@ -1910,6 +2121,19 @@ "node": ">=8" } }, + "node_modules/devlop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", + "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/draco3d": { "version": "1.5.7", "resolved": "https://registry.npmjs.org/draco3d/-/draco3d-1.5.7.tgz", @@ -2167,6 +2391,16 @@ "node": ">=4.0" } }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", + "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2183,6 +2417,12 @@ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "license": "MIT" }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "license": "MIT" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -2359,6 +2599,46 @@ "node": ">=8" } }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", + "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^7.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-js": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", + "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/hermes-estree": { "version": "0.25.1", "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz", @@ -2382,6 +2662,16 @@ "integrity": "sha512-VSIRpLfRwlAAdGL4wiTucx2ScRipo0ed1FBatWkyt832jC4CReKstga6yIhYVwGu9LOBjuX9wzmRMeQdBJtzEA==", "license": "Apache-2.0" }, + "node_modules/html-url-attributes": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-url-attributes/-/html-url-attributes-3.0.1.tgz", + "integrity": "sha512-ol6UPyBWqsrO6EJySPz2O7ZSr856WDrEzM5zMqp+FJJLGMW35cLYmmZnl0vztAZxRUoNZJFTCohfjuIJ8I4QBQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -2445,6 +2735,46 @@ "node": ">=0.8.19" } }, + "node_modules/inline-style-parser": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.7.tgz", + "integrity": "sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==", + "license": "MIT" + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", + "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", + "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", + "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", @@ -2468,12 +2798,43 @@ "node": ">=0.10.0" } }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", + "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "license": "MIT" }, + "node_modules/isbot": { + "version": "5.1.39", + "resolved": "https://registry.npmjs.org/isbot/-/isbot-5.1.39.tgz", + "integrity": "sha512-obH0yYahGXdzNxo+djmHhBYThUKDkz565cxkIlt2L9hXfv1NlaLKoDBHo6KxXsYrIXx2RK3x5vY36CfZcobxEw==", + "license": "Unlicense", + "engines": { + "node": ">=18" + } + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -2496,6 +2857,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -2881,16 +3243,14 @@ "dev": true, "license": "MIT" }, - "node_modules/loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "node_modules/longest-streak": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", + "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/lru-cache": { @@ -2903,6 +3263,15 @@ "yallist": "^3.0.2" } }, + "node_modules/lucide-react": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/lucide-react/-/lucide-react-1.11.0.tgz", + "integrity": "sha512-UOhjdztXCgdBReRcIhsvz2siIBogfv/lhJEIViCpLt924dO+GDms9T7DNoucI23s6kEPpe988m5N0D2ajnzb2g==", + "license": "ISC", + "peerDependencies": { + "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/maath": { "version": "0.10.8", "resolved": "https://registry.npmjs.org/maath/-/maath-0.10.8.tgz", @@ -2913,6 +3282,298 @@ "three": ">=0.134.0" } }, + "node_modules/markdown-table": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz", + "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mdast-util-find-and-replace/-/mdast-util-find-and-replace-3.0.2.tgz", + "integrity": "sha512-Tmd1Vg/m3Xz43afeNxDIhWRtFZgM2VLyaf4vSTYwudTyeuTneoL3qtWMA5jeLyz/O1vDJmmV4QuScFCA2tBPwg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", + "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm/-/mdast-util-gfm-3.1.0.tgz", + "integrity": "sha512-0ulfdQOM3ysHhCJ1p06l0b0VKlhU0wuQs3thxZQagjcjPrlFRqY215uZGHHJan9GEAXd9MbfPjFJz+qMkVR6zQ==", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-autolink-literal/-/mdast-util-gfm-autolink-literal-2.0.1.tgz", + "integrity": "sha512-5HVP2MKaP6L+G6YaxPNjuL0BPrq9orG3TsrZ9YXbA3vDw/ACI4MEsnoDpn6ZNm7GnZgtAcONJyPhOP8tNJQavQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz", + "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz", + "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-gfm-task-list-item/-/mdast-util-gfm-task-list-item-2.0.0.tgz", + "integrity": "sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", + "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", + "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", + "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", + "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.1", + "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", + "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", + "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", + "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/meshline": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.1.tgz", @@ -2928,6 +3589,569 @@ "integrity": "sha512-oRFNWJRDA/WTrVj7NWvqa5HqE1t9MYDj2VaWirQCzCCrAd2GHrqR/sQezCxiWATPNlKTcRaPRHPJwIRoPBAp5g==", "license": "MIT" }, + "node_modules/micromark": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", + "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", + "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm/-/micromark-extension-gfm-3.0.0.tgz", + "integrity": "sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-2.1.0.tgz", + "integrity": "sha512-oOg7knzhicgQ3t4QCjCWgTmfNhvQbDDnJeVu9v81r7NltNCVmhPy1fJRX27pISafdjL+SVc4d3l48Gb6pbRypw==", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz", + "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz", + "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz", + "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-tagfilter/-/micromark-extension-gfm-tagfilter-2.0.0.tgz", + "integrity": "sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-extension-gfm-task-list-item/-/micromark-extension-gfm-task-list-item-2.1.0.tgz", + "integrity": "sha512-qIBZhqxqI6fjLDYFTBIa4eivDMnP+OZqsNwmQ3xNLE4Cxwc+zfQEfbs6tzAo2Hjq+bh6q5F+Z8/cksrLFYWQQw==", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", + "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", + "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-space": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", + "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", + "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", + "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-character": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", + "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", + "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", + "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", + "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", + "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", + "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-encode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", + "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", + "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", + "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", + "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", + "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", + "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-symbol": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", + "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", + "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", @@ -2945,19 +4169,8 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, - "node_modules/n8ao": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/n8ao/-/n8ao-1.10.1.tgz", - "integrity": "sha512-hhI1pC+BfOZBV1KMwynBrVlIm8wqLxj/abAWhF2nZ0qQKyzTSQa1QtLVS2veRiuoBQXojxobcnp0oe+PUoxf/w==", - "license": "ISC", - "peerDependencies": { - "postprocessing": ">=6.30.0", - "three": ">=0.137" - } - }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", @@ -2991,15 +4204,6 @@ "dev": true, "license": "MIT" }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -3063,6 +4267,31 @@ "node": ">=6" } }, + "node_modules/parse-entities": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", + "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", + "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", + "license": "MIT" + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -3131,15 +4360,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postprocessing": { - "version": "6.39.1", - "resolved": "https://registry.npmjs.org/postprocessing/-/postprocessing-6.39.1.tgz", - "integrity": "sha512-R2dG2zy+BAx3USl5EHw+PvnrlbT5PKnZVp3se0HCR0pWH8WQdh742yNG4YWOsq6c0bFpffk0Gd2RqPeoP/wKng==", - "license": "Zlib", - "peerDependencies": { - "three": ">= 0.168.0 < 0.185.0" - } - }, "node_modules/potpack": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz", @@ -3195,15 +4415,14 @@ "lie": "^3.0.2" } }, - "node_modules/prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "node_modules/property-information": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.1.0.tgz", + "integrity": "sha512-TwEZ+X+yCJmYfL7TPUOcvBZ4QfoT5YenQiJuX//0th53DE6w0xxLEtfK3iyryQFddXuvkIk51EEgrJQ0WJkOmQ==", "license": "MIT", - "dependencies": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" } }, "node_modules/punycode": { @@ -3246,168 +4465,6 @@ } } }, - "node_modules/r3f-perf/node_modules/@react-three/drei": { - "version": "9.122.0", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.122.0.tgz", - "integrity": "sha512-SEO/F/rBCTjlLez7WAlpys+iGe9hty4rNgjZvgkQeXFSiwqD4Hbk/wNHMAbdd8vprO2Aj81mihv4dF5bC7D0CA==", - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.26.0", - "@mediapipe/tasks-vision": "0.10.17", - "@monogrid/gainmap-js": "^3.0.6", - "@react-spring/three": "~9.7.5", - "@use-gesture/react": "^10.3.1", - "camera-controls": "^2.9.0", - "cross-env": "^7.0.3", - "detect-gpu": "^5.0.56", - "glsl-noise": "^0.0.0", - "hls.js": "^1.5.17", - "maath": "^0.10.8", - "meshline": "^3.3.1", - "react-composer": "^5.0.3", - "stats-gl": "^2.2.8", - "stats.js": "^0.17.0", - "suspend-react": "^0.1.3", - "three-mesh-bvh": "^0.7.8", - "three-stdlib": "^2.35.6", - "troika-three-text": "^0.52.0", - "tunnel-rat": "^0.1.2", - "utility-types": "^3.11.0", - "zustand": "^5.0.1" - }, - "peerDependencies": { - "@react-three/fiber": "^8", - "react": "^18", - "react-dom": "^18", - "three": ">=0.137" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/r3f-perf/node_modules/@react-three/drei/node_modules/@react-spring/three": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/three/-/three-9.7.5.tgz", - "integrity": "sha512-RxIsCoQfUqOS3POmhVHa1wdWS0wyHAUway73uRLp3GAL5U2iYVNdnzQsep6M2NZ994BlW8TcKuMtQHUqOsy6WA==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/core": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "@react-three/fiber": ">=6.0", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "three": ">=0.126" - } - }, - "node_modules/r3f-perf/node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/animated": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz", - "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==", - "license": "MIT", - "dependencies": { - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/r3f-perf/node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/core": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz", - "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==", - "license": "MIT", - "dependencies": { - "@react-spring/animated": "~9.7.5", - "@react-spring/shared": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-spring/donate" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/r3f-perf/node_modules/@react-three/drei/node_modules/@react-spring/three/node_modules/@react-spring/shared": { - "version": "9.7.5", - "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz", - "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==", - "license": "MIT", - "dependencies": { - "@react-spring/rafz": "~9.7.5", - "@react-spring/types": "~9.7.5" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/r3f-perf/node_modules/@react-three/drei/node_modules/react-composer": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/react-composer/-/react-composer-5.0.3.tgz", - "integrity": "sha512-1uWd07EME6XZvMfapwZmc7NgCZqDemcvicRi3wMJzXsQLvZ3L7fTHVyPy1bZdnWXM4iPjYuNE+uJ41MLKeTtnA==", - "license": "MIT", - "dependencies": { - "prop-types": "^15.6.0" - }, - "peerDependencies": { - "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/r3f-perf/node_modules/@react-three/drei/node_modules/zustand": { - "version": "5.0.12", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz", - "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==", - "license": "MIT", - "engines": { - "node": ">=12.20.0" - }, - "peerDependencies": { - "@types/react": ">=18.0.0", - "immer": ">=9.0.6", - "react": ">=18.0.0", - "use-sync-external-store": ">=1.2.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "immer": { - "optional": true - }, - "react": { - "optional": true - }, - "use-sync-external-store": { - "optional": true - } - } - }, - "node_modules/r3f-perf/node_modules/camera-controls": { - "version": "2.10.1", - "resolved": "https://registry.npmjs.org/camera-controls/-/camera-controls-2.10.1.tgz", - "integrity": "sha512-KnaKdcvkBJ1Irbrzl8XD6WtZltkRjp869Jx8c0ujs9K+9WD+1D7ryBsCiVqJYUqt6i/HR5FxT7RLASieUD+Q5w==", - "license": "MIT", - "peerDependencies": { - "three": ">=0.126.1" - } - }, - "node_modules/r3f-perf/node_modules/three-mesh-bvh": { - "version": "0.7.8", - "resolved": "https://registry.npmjs.org/three-mesh-bvh/-/three-mesh-bvh-0.7.8.tgz", - "integrity": "sha512-BGEZTOIC14U0XIRw3tO4jY7IjP7n7v24nv9JXS1CyeVRWOCkcOMhRnmENUjuV39gktAw4Ofhr0OvIAiTspQrrw==", - "deprecated": "Deprecated due to three.js version incompatibility. Please use v0.8.0, instead.", - "license": "MIT", - "peerDependencies": { - "three": ">= 0.151.0" - } - }, "node_modules/r3f-perf/node_modules/zustand": { "version": "4.5.7", "resolved": "https://registry.npmjs.org/zustand/-/zustand-4.5.7.tgz", @@ -3457,11 +4514,32 @@ "react": "^19.2.5" } }, - "node_modules/react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "license": "MIT" + "node_modules/react-markdown": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/react-markdown/-/react-markdown-10.1.0.tgz", + "integrity": "sha512-qKxVopLT/TyA6BX3Ue5NwabOsAzm0Q7kAPwq6L+wWDwisYs7R8vZ0nRXqq6rkueboxpkjvLGU9fWifiX/ZZFxQ==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "html-url-attributes": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "unified": "^11.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=18", + "react": ">=18" + } }, "node_modules/react-use-measure": { "version": "2.1.7", @@ -3478,6 +4556,72 @@ } } }, + "node_modules/remark-gfm": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/remark-gfm/-/remark-gfm-4.0.1.tgz", + "integrity": "sha512-1quofZ2RQ9EWdeN34S79+KExV1764+wCUGop5CPL1WGdD0ocPpu91lzPGbwWMECpEpd42kJGQwzRfyov9j4yNg==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", + "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.2", + "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", + "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-11.0.0.tgz", + "integrity": "sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", @@ -3554,6 +4698,27 @@ "semver": "bin/semver.js" } }, + "node_modules/seroval": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/seroval/-/seroval-1.5.2.tgz", + "integrity": "sha512-xcRN39BdsnO9Tf+VzsE7b3JyTJASItIV1FVFewJKCFcW4s4haIKS3e6vj8PGB9qBwC7tnuOywQMdv5N4qkzi7Q==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/seroval-plugins": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/seroval-plugins/-/seroval-plugins-1.5.2.tgz", + "integrity": "sha512-qpY0Cl+fKYFn4GOf3cMiq6l72CpuVaawb6ILjubOQ+diJ54LfOWaSSPsaswN8DRPIPW4Yq+tE1k5aKd7ILyaFg==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "seroval": "^1.0" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3585,6 +4750,16 @@ "node": ">=0.10.0" } }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", + "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/stats-gl": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.4.2.tgz", @@ -3611,6 +4786,20 @@ "integrity": "sha512-hNKz8phvYLPEcRkeG1rsGmV5ChMjKDAWU7/OJJdDErPBNChQXxCo3WZurGpnWc6gZhAzEPFad1aVgyOANH1sMw==", "license": "MIT" }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", + "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", @@ -3624,6 +4813,24 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/style-to-js": { + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.21.tgz", + "integrity": "sha512-RjQetxJrrUJLQPHbLku6U/ocGtzyjbJMP9lCNK7Ag0CNh690nSH8woqWH9u16nMjYBAok+i7JO1NP2pOy8IsPQ==", + "license": "MIT", + "dependencies": { + "style-to-object": "1.0.14" + } + }, + "node_modules/style-to-object": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.14.tgz", + "integrity": "sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.7" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -3663,9 +4870,9 @@ } }, "node_modules/three": { - "version": "0.183.2", - "resolved": "https://registry.npmjs.org/three/-/three-0.183.2.tgz", - "integrity": "sha512-di3BsL2FEQ1PA7Hcvn4fyJOlxRRgFYBpMTcyOgkwJIaDOdJMebEFPA+t98EvjuljDx4hNulAGwF6KIjtwI5jgQ==", + "version": "0.182.0", + "resolved": "https://registry.npmjs.org/three/-/three-0.182.0.tgz", + "integrity": "sha512-GbHabT+Irv+ihI1/f5kIIsZ+Ef9Sl5A1Y7imvS5RQjWgtTPfPnZ43JmlYI7NtCRDK9zir20lQpfg8/9Yd02OvQ==", "license": "MIT" }, "node_modules/three-mesh-bvh": { @@ -3717,6 +4924,16 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/trim-lines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", + "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/troika-three-text": { "version": "0.52.4", "resolved": "https://registry.npmjs.org/troika-three-text/-/troika-three-text-0.52.4.tgz", @@ -3747,6 +4964,16 @@ "integrity": "sha512-W1CpvTHykaPH5brv5VHLfQo9D1OYuo0cSBEUQFFT/nBUzM8iD6Lq2/tgG/f1OelbAS1WtaTPQzE5uM49egnngw==", "license": "MIT" }, + "node_modules/trough": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", + "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", @@ -3833,16 +5060,16 @@ } }, "node_modules/typescript-eslint": { - "version": "8.59.0", - "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.0.tgz", - "integrity": "sha512-BU3ONW9X+v90EcCH9ZS6LMackcVtxRLlI3XrYyqZIwVSHIk7Qf7bFw1z0M9Q0IUxhTMZCf8piY9hTYaNEIASrw==", + "version": "8.59.1", + "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.59.1.tgz", + "integrity": "sha512-xqDcFVBmlrltH64lklOVp1wYxgJr6LVdg3NamBgH2OOQDLFdTKfIZXF5PfghrnXQKXZGTQs8tr1vL7fJvq8CTQ==", "dev": true, "license": "MIT", "dependencies": { - "@typescript-eslint/eslint-plugin": "8.59.0", - "@typescript-eslint/parser": "8.59.0", - "@typescript-eslint/typescript-estree": "8.59.0", - "@typescript-eslint/utils": "8.59.0" + "@typescript-eslint/eslint-plugin": "8.59.1", + "@typescript-eslint/parser": "8.59.1", + "@typescript-eslint/typescript-estree": "8.59.1", + "@typescript-eslint/utils": "8.59.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" @@ -3863,6 +5090,93 @@ "dev": true, "license": "MIT" }, + "node_modules/unified": { + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", + "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", + "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", + "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", + "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", + "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", + "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/update-browserslist-db": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", @@ -3922,6 +5236,34 @@ "node": ">= 4" } }, + "node_modules/vfile": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", + "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", + "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, "node_modules/vite": { "version": "8.0.10", "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz", @@ -4080,9 +5422,9 @@ } }, "node_modules/zustand": { - "version": "5.0.13", - "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.13.tgz", - "integrity": "sha512-efI2tVaVQPqtOh114loML/Z80Y4NP3yc+Ff0fYiZJPauNeWZeIp/bRFD7I9bfmCOYBh/PHxlglQ9+wvlwnPikQ==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/zustand/-/zustand-5.0.12.tgz", + "integrity": "sha512-i77ae3aZq4dhMlRhJVCYgMLKuSiZAaUPAct2AksxQ+gOtimhGMdXljRT21P5BNpeT4kXlLIckvkPM029OljD7g==", "license": "MIT", "engines": { "node": ">=12.20.0" @@ -4107,6 +5449,16 @@ "optional": true } } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", + "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } } } } diff --git a/package.json b/package.json index 5ae9638..3a71c82 100644 --- a/package.json +++ b/package.json @@ -3,6 +3,9 @@ "private": true, "version": "0.0.1", "type": "module", + "engines": { + "node": ">=20.19.0 || >=22.12.0" + }, "scripts": { "dev": "vite", "build": "tsc -b && vite build", @@ -11,20 +14,24 @@ "format": "prettier --write .", "format:check": "prettier --check .", "preview": "vite preview", - "typecheck": "tsc --noEmit" + "typecheck": "tsc -b" }, "dependencies": { + "@mediapipe/tasks-vision": "^0.10.35", "@react-three/drei": "^10.7.7", - "@react-three/fiber": "^9.6.0", - "@react-three/postprocessing": "^3.0.4", + "@react-three/fiber": "^9.6.1", "@react-three/rapier": "^2.2.0", + "@tanstack/react-router": "^1.168.25", "gsap": "^3.15.0", "lil-gui": "^0.21.0", + "lucide-react": "^1.11.0", "r3f-perf": "^7.2.3", "react": "^19.2.4", "react-dom": "^19.2.4", - "three": "^0.183.2", - "zustand": "^5.0.13" + "react-markdown": "^10.1.0", + "remark-gfm": "^4.0.1", + "three": "0.182.0", + "zustand": "^5.0.12" }, "devDependencies": { "@eslint/js": "^9.39.4", @@ -42,5 +49,13 @@ "typescript": "~6.0.2", "typescript-eslint": "^8.58.0", "vite": "^8.0.4" + }, + "overrides": { + "@react-three/rapier": { + "@dimforge/rapier3d-compat": "0.19.1" + }, + "r3f-perf": { + "@react-three/drei": "$@react-three/drei" + } } } diff --git a/public/assets/PDF/Gilbert Le Fermier - Doublage Altera.pdf b/public/assets/PDF/Gilbert Le Fermier - Doublage Altera.pdf new file mode 100644 index 0000000..a1a1ccc Binary files /dev/null and b/public/assets/PDF/Gilbert Le Fermier - Doublage Altera.pdf differ diff --git a/public/assets/PDF/Le Gérant - Doublage Altera.pdf b/public/assets/PDF/Le Gérant - Doublage Altera.pdf new file mode 100644 index 0000000..9ec89d7 Binary files /dev/null and b/public/assets/PDF/Le Gérant - Doublage Altera.pdf differ diff --git a/public/assets/PDF/Leonie Electricienne - Doublage Altera.pdf b/public/assets/PDF/Leonie Electricienne - Doublage Altera.pdf new file mode 100644 index 0000000..226a9bd Binary files /dev/null and b/public/assets/PDF/Leonie Electricienne - Doublage Altera.pdf differ diff --git a/public/assets/UI/cassé.webm b/public/assets/UI/cassé.webm new file mode 100644 index 0000000..bbbe317 --- /dev/null +++ b/public/assets/UI/cassé.webm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56f019508cbcb5c0c4770bdad0816c7b1d332fc809d582ee4e0d90904415c745 +size 252779 diff --git a/public/assets/UI/centrale.webm b/public/assets/UI/centrale.webm new file mode 100644 index 0000000..8287a94 --- /dev/null +++ b/public/assets/UI/centrale.webm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dd2b2be96baaab171a5f68e23c785a0ea3583c7ba71b5a9b5745213fc3b0f5f8 +size 225885 diff --git a/public/assets/UI/ebike.webm b/public/assets/UI/ebike.webm new file mode 100644 index 0000000..003fbd1 --- /dev/null +++ b/public/assets/UI/ebike.webm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07684c556587213b7deae75e153594d8299acde4d3a28bfe88cbd49abdcda880 +size 197560 diff --git a/public/assets/UI/interagir.webm b/public/assets/UI/interagir.webm new file mode 100644 index 0000000..d38a4c4 --- /dev/null +++ b/public/assets/UI/interagir.webm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1dd42a107d015aa0028823e248a3a3e32e6b8cb90173b547675145fefdba4581 +size 272167 diff --git a/public/assets/UI/laferme.webm b/public/assets/UI/laferme.webm new file mode 100644 index 0000000..4b16f79 --- /dev/null +++ b/public/assets/UI/laferme.webm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5872877c56253cb364aceb0f39551143e142150807c7e837759677b16d22741 +size 206993 diff --git a/public/assets/logo/logo.jpg b/public/assets/logo/logo.jpg new file mode 100644 index 0000000..3617df6 --- /dev/null +++ b/public/assets/logo/logo.jpg @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:814db18091a1a822dc2ebdef9f00400c4ff943e9aa1e43151e85b6ea1c4e98cc +size 149572 diff --git a/public/assets/world/dashboard.webm b/public/assets/world/dashboard.webm new file mode 100644 index 0000000..240a1e9 --- /dev/null +++ b/public/assets/world/dashboard.webm @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a66ac7a200090365d7cb2623ebf9f1dedc6e052628c15b1701086786b3772bd +size 485140 diff --git a/public/cinematics.json b/public/cinematics.json new file mode 100644 index 0000000..c05949a --- /dev/null +++ b/public/cinematics.json @@ -0,0 +1,27 @@ +{ + "version": 1, + "cinematics": [ + { + "id": "intro_overview", + "timecode": 0, + "dialogueCues": [ + { + "time": 0, + "dialogueId": "narrateur_bienvenueaaltera" + } + ], + "cameraKeyframes": [ + { + "time": 0, + "position": [8, 5, 12], + "target": [0, 2, 0] + }, + { + "time": 4, + "position": [12, 4, -6], + "target": [10, 1.4, -8] + } + ] + } + ] +} diff --git a/public/map.json b/public/map.json new file mode 100644 index 0000000..25619f0 --- /dev/null +++ b/public/map.json @@ -0,0 +1,4587 @@ +[ + { + "name": "Neutre", + "type": "Object3D", + "position": [-0.6455, 0, 5.6812], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "lac", + "type": "Mesh", + "position": [-0.6455, 0, 5.6812], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "arbres_quartier", + "type": "Object3D", + "position": [-0.699, 8.2885, 12.0707], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "arbres_quartier", + "type": "Object3D", + "position": [-0.8061, 24.8656, 24.8498], + "rotation": [0, -0.7007, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [64.2046, 1.3963, -66.2457], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-77.4301, 1.3912, -56.435], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [94.0948, 1.396, -13.7286], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [9.1941, 10.2941, 72.1876], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [85.6336, 2.3645, 16.4202], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-72.396, 5.1429, -14.0848], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [27.9832, 6.8786, -54.0086], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-8.7053, 20.947, 57.5741], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-89.8978, 1.4012, -25.8285], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [51.8989, 4.3513, -50.0921], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [33.235, 12.6737, 58.6656], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-17.6706, 6.3797, 81.7969], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [34.9999, 1.4037, 93.9609], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-61.8401, 11.0729, 13.0361], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [38.7701, 19.0344, 0.8338], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [59.3076, 6.5206, 49.1125], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-89.2687, 2.6346, 16.7745], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [17.8449, 19.0217, -19.9902], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [69.5646, 5.8304, -13.2384], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-39.7419, 20.8513, 23.7226], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [70.7249, 3.0111, -37.8449], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [38.1303, 19.7136, 34.2969], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-31.6587, 20.5164, -4.8425], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [65.6865, 1.3944, 77.4458], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [54.0114, 13.5402, 21.5344], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-49.1702, 11.9546, -18.5196], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [41.9237, 12.5818, -23.4932], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-1.7275, 1.4007, 102.2273], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [88.0982, 1.3938, 45.9656], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "mc", + "type": "Mesh", + "position": [46.9851, 3.9982, 69.8056], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeubles", + "type": "Object3D", + "position": [-62.3322, 8.2405, -10.6914], + "rotation": [-3.1416, -1.1003, -3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [-42.2765, 22.5511, 18.1635], + "rotation": [0, 1.2167, 0], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2", + "type": "Object3D", + "position": [-74.1764, 4.7725, -44.3093], + "rotation": [0, 1.0979, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble", + "type": "Mesh", + "position": [-75.8161, 3.7884, -41.1777], + "rotation": [0, 1.0979, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble", + "type": "Mesh", + "position": [-72.5368, 5.7567, -47.441], + "rotation": [0, 1.0979, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [-62.3173, 11.6774, -9.3092], + "rotation": [0, 1.0595, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [-85.6865, 4.7725, -20.4085], + "rotation": [0, 1.5621, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [-65.7762, 12.2088, 9.2812], + "rotation": [0, 0.8527, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_22", + "type": "Mesh", + "position": [-53.6087, 11.6774, -26.0884], + "rotation": [0, 0.7698, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_22", + "type": "Mesh", + "position": [-40.1599, 22.5511, 6.2908], + "rotation": [0, 1.2682, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [-34.6253, 22.5511, -4.4192], + "rotation": [0, 1.423, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [-89.7126, 5.0587, 5.8019], + "rotation": [0, 1.0307, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeubles", + "type": "Object3D", + "position": [-3.8031, 9.4131, 71.852], + "rotation": [3.1416, 0.1131, -3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2", + "type": "Object3D", + "position": [-3.8544, 22.5511, 59.6426], + "rotation": [0, 0.0613, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [-7.3845, 21.5669, 59.8259], + "rotation": [0, 0.0613, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [-0.3242, 23.5352, 59.4593], + "rotation": [0, 0.0613, 0], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2_1", + "type": "Object3D", + "position": [-7.4612, 5.0001, 95.492], + "rotation": [0, 0.0402, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [-10.9945, 4.0159, 95.6007], + "rotation": [0, 0.0402, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [-3.928, 5.9843, 95.3834], + "rotation": [0, 0.0402, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_22", + "type": "Mesh", + "position": [-5.7841, 11.9398, 75.0631], + "rotation": [0, -0.0411, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeubles", + "type": "Object3D", + "position": [58.3738, -0.4334, -15.1953], + "rotation": [-3.1416, 1.1456, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2_0", + "type": "Object3D", + "position": [93.8738, 4.1985, -8.5653], + "rotation": [-3.1416, 1.2256, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [95.0387, 3.2144, -5.2279], + "rotation": [3.1416, 1.2255, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [92.709, 5.1827, -11.9028], + "rotation": [-3.1416, 1.2256, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2_1", + "type": "Object3D", + "position": [34.1654, 9.4199, -51.5725], + "rotation": [0, 1.4871, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [33.8368, 8.4357, -48.0529], + "rotation": [0, 1.4871, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [34.4941, 10.404, -55.0921], + "rotation": [0, 1.4871, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_22_2", + "type": "Mesh", + "position": [69.7762, 9.4199, 18.3362], + "rotation": [-3.1416, 1.1906, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2", + "type": "Object3D", + "position": [41.9036, 19.8047, -4.3543], + "rotation": [0, 1.4051, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [41.2876, 18.8206, -0.8735], + "rotation": [0, 1.4051, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [42.5195, 20.7889, -7.8352], + "rotation": [0, 1.4051, 0], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1_4", + "type": "Mesh", + "position": [69.1598, 9.4199, -2.3765], + "rotation": [-3.1416, 1.4482, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [93.8789, 4.1985, 19.927], + "rotation": [3.1416, 0.3786, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [69.4247, 4.1985, -59.3345], + "rotation": [-3.1416, 1.5089, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2", + "type": "Object3D", + "position": [50.5352, 9.4199, -38.8631], + "rotation": [3.1416, 0.8956, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [52.7187, 8.4357, -36.0832], + "rotation": [3.1416, 0.8956, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [48.3518, 10.404, -41.6431], + "rotation": [3.1416, 0.8956, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1_8", + "type": "Mesh", + "position": [46.4293, 19.8047, 8.6568], + "rotation": [-3.1416, 1.3224, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2", + "type": "Object3D", + "position": [33.7611, 19.8047, -15.4911], + "rotation": [3.1416, 0.809, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [36.1767, 18.8206, -12.9102], + "rotation": [3.1416, 0.809, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [31.3456, 20.7889, -18.0719], + "rotation": [3.1416, 0.809, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2", + "type": "Object3D", + "position": [62.5434, 9.4199, -21.9889], + "rotation": [3.1416, 0.9129, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [64.6785, 8.4357, -19.1716], + "rotation": [3.1416, 0.9128, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [60.4084, 10.404, -24.8062], + "rotation": [3.1416, 0.9129, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2", + "type": "Object3D", + "position": [46.879, 19.8047, 22.4645], + "rotation": [3.1416, 0.9771, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [48.8288, 18.8206, 25.4131], + "rotation": [3.1416, 0.9771, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [44.9291, 20.7889, 19.516], + "rotation": [3.1416, 0.9771, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Groupe2", + "type": "Object3D", + "position": [22.7244, 19.8047, -23.8431], + "rotation": [3.1416, 0.6712, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [25.4717, 18.8206, -21.6186], + "rotation": [3.1416, 0.6712, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [19.9772, 20.7889, -26.0676], + "rotation": [3.1416, 0.6712, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [85.4754, 4.1985, -35.7925], + "rotation": [-3.1416, 1.3009, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "zone_domaine", + "type": "Object3D", + "position": [-16.0844, 5.1349, -46.2022], + "rotation": [0, -1.3459, 0], + "scale": [1, 1, 1] + }, + { + "name": "champ2", + "type": "Object3D", + "position": [3.4286, 16.0553, -30.2701], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [11.4121, 3.9653, -66.3569], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-70.8139, 0.3267, -62.2507], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-14.3249, 3.5365, -68.212], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [24.0599, 4.8852, -59.538], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-52.9323, 4.7206, -42.7644], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-31.704, 4.6976, -57.309], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-25.9223, 3.5026, -65.0315], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-5.4992, 4.7648, -63.6341], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-40.2304, 0.7972, -75.3914], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-38.3843, 1.4111, -71.7936], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-37.0816, 0.7509, -76.9614], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-34.1436, 0.7514, -78.1219], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-29.7402, 1.313, -75.8371], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-30.9037, 0.7698, -79.306], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-16.8479, 0.7778, -83.3324], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-16.1993, 1.345, -79.5906], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-13.4224, 0.7561, -83.8093], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-10.2307, 0.754, -84.0774], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-6.5395, 1.2827, -80.7849], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-6.5723, 0.7644, -84.3157], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-2.4983, 0.4448, -88.0723], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-2.4407, 0.7758, -84.5676], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-6.5447, 0.4457, -87.7718], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-6.6798, 0.3279, -91.2671], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-10.2825, 0.4466, -87.4858], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-10.4639, 0.328, -90.9794], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-14.1131, 0.3277, -90.6931], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-17.854, 0.3273, -90.3823], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-21.9187, 0.3273, -89.8092], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-26.0047, 0.3278, -88.6636], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-29.7266, 0.3282, -87.23], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-33.1971, 0.3284, -85.8711], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-36.5348, 0.3283, -84.5591], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-39.8565, 0.3279, -83.2413], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-43.3585, 0.3276, -81.8413], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-47.1477, 0.3277, -80.111], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-50.9789, 0.3277, -77.9043], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-54.6075, 0.3281, -75.352], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-58.015, 0.3286, -72.6911], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-61.2668, 0.3291, -70.0898], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-64.4716, 0.3293, -67.5244], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-67.6622, 0.3286, -64.9362], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-62.1519, 0.4755, -64.6412], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-65.1778, 0.4774, -62.0524], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-62.5731, 0.8884, -59.2255], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-65.2583, 0.9221, -56.6381], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-68.0021, 0.4844, -59.3904], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-62.6398, 1.5402, -53.9245], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-60.1295, 2.2225, -51.1926], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-57.6942, 2.9614, -48.4318], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-55.3051, 3.7904, -45.6226], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-55.0285, 2.9288, -50.7766], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-52.6408, 3.7656, -47.8775], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-49.9983, 3.7437, -50.0915], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-47.6432, 4.6824, -47.0805], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-50.2744, 4.6994, -44.9432], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-45.0479, 4.6733, -49.1549], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-42.5034, 4.6771, -51.1238], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-40.0021, 4.6962, -52.9499], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-37.4182, 4.7118, -54.5714], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-34.6659, 4.7103, -55.9908], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-36.3713, 3.801, -59.4048], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-39.3483, 3.7876, -57.8793], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-41.2833, 2.9441, -61.2257], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-42.1287, 3.7586, -56.1669], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-44.2741, 2.8999, -59.453], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-46.3307, 2.1209, -62.8234], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-47.0518, 2.8696, -57.4896], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-49.3098, 2.0824, -60.781], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-51.471, 1.3905, -63.9422], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-52.1045, 2.0956, -58.4714], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-54.4709, 1.4066, -61.4374], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-56.7543, 0.8449, -64.3148], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-57.2765, 1.4443, -58.9232], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-59.7579, 0.8624, -61.7795], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-54.7976, 2.1355, -56.0498], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-57.4656, 2.1801, -53.6207], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-59.9754, 1.4918, -56.428], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-55.7722, 0.4691, -69.7848], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-53.5905, 0.8371, -66.8875], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-58.9988, 0.4715, -67.199], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-52.4153, 0.467, -72.3871], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-50.2966, 0.8397, -69.3921], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-46.9317, 0.8543, -71.5878], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-45.0136, 1.4625, -68.1254], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-48.2887, 1.4158, -66.2071], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-41.7242, 1.4734, -69.9029], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-39.8703, 2.205, -66.2953], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-43.1555, 2.1795, -64.6226], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-36.5275, 2.1843, -67.9115], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-34.8539, 2.9593, -64.334], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-38.1084, 2.9689, -62.8268], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-33.248, 3.7921, -60.8149], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-43.5975, 0.8525, -73.4912], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-45.4034, 0.4645, -76.8627], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-48.9279, 0.4658, -74.8171], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-49.7218, 2.8713, -55.3626], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-52.3728, 2.8954, -53.1058], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-44.7745, 3.7336, -54.2644], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-47.382, 3.7303, -52.2273], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-41.8617, 0.4583, -78.548], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-38.4801, 0.4512, -79.9867], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-35.2796, 0.449, -81.2835], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-31.9888, 0.4499, -82.5702], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-28.5374, 0.4485, -83.9109], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-24.8823, 0.4458, -85.2594], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-23.9168, 0.7906, -81.7579], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-27.4483, 0.7856, -80.5556], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-23.0257, 1.347, -78.1146], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-26.3784, 1.3319, -77.0358], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-22.0995, 2.0236, -74.3895], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-25.2687, 2.0056, -73.3753], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-24.1384, 2.7357, -69.717], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-27.1911, 2.7231, -68.6173], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-28.4527, 1.999, -72.195], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-21.1282, 2.7564, -70.6683], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-20.1171, 3.5359, -67.0021], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-22.9884, 3.5156, -66.085], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-17.281, 3.5474, -67.7013], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-18.0783, 2.7729, -71.3947], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-15.5468, 2.0461, -75.6822], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-14.9242, 2.7669, -71.94], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-18.8661, 2.0465, -75.1275], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-19.6373, 1.3657, -78.91], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-20.3814, 0.7975, -82.654], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-21.1303, 0.4462, -86.2784], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-17.4084, 0.4483, -86.8292], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-13.7939, 0.4485, -87.1824], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [17.1237, 1.8611, -75.7969], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [23.493, 2.606, -70.255], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [19.8781, 2.545, -71.3996], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [27.0851, 2.6732, -69.0737], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [26.0441, 3.3494, -65.8794], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [22.5075, 3.284, -67.0215], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [25.0415, 4.0826, -62.7099], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [5.6979, 1.2772, -81.2456], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [1.6222, 1.2936, -81.239], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [1.597, 1.9083, -77.7099], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-2.3509, 1.9098, -77.5042], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-2.4034, 1.2957, -81.0285], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-2.2823, 2.5523, -74.0563], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-6.1525, 2.5503, -73.7771], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-6.3502, 1.9081, -77.2279], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-5.9449, 3.2322, -70.373], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-5.7289, 3.9722, -66.9965], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-2.2046, 3.2338, -70.6485], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-2.1182, 3.9748, -67.2496], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [1.3889, 3.9849, -67.383], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [1.3115, 4.7827, -63.9926], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-2.011, 4.7703, -63.8656], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [4.5112, 4.7923, -63.9186], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [7.6364, 4.787, -63.5674], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [10.7761, 4.7752, -62.9861], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [14.0162, 4.774, -62.2665], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [17.3227, 4.7909, -61.4448], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [20.6662, 4.8285, -60.5336], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [21.572, 4.0223, -63.7816], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [18.1432, 3.9811, -64.7571], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [18.9813, 3.231, -68.0901], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [14.7627, 3.9635, -65.6126], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [15.4971, 3.2048, -69.012], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [16.2679, 2.507, -72.4232], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [12.031, 3.2046, -69.7865], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [12.6499, 2.5008, -73.2628], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [13.2941, 1.85, -76.7185], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [9.003, 2.5182, -73.8935], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [9.4167, 1.8628, -77.4042], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [5.3267, 2.5415, -74.2282], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [5.5209, 1.8889, -77.7351], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [5.063, 3.2371, -70.7487], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [1.4814, 3.2376, -70.8132], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [1.5601, 2.5524, -74.247], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [8.557, 3.2215, -70.3955], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [8.0938, 3.9809, -66.947], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [4.7769, 3.9917, -67.2987], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [9.8319, 1.2611, -80.8477], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "champ1", + "type": "Object3D", + "position": [3.4286, 16.0553, -30.2701], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_0", + "type": "Mesh", + "position": [21.9129, 7.0614, -52.1148], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_1", + "type": "Mesh", + "position": [14.67, 16.8504, -24.9758], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_2", + "type": "Mesh", + "position": [-4.1759, 16.8338, -27.1377], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_3", + "type": "Mesh", + "position": [-5.6179, 7.0424, -55.3704], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_4", + "type": "Mesh", + "position": [-5.4166, 7.9551, -52.5529], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_5", + "type": "Mesh", + "position": [-5.233, 8.8832, -49.7254], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_6", + "type": "Mesh", + "position": [-5.0653, 9.8424, -46.9005], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_7", + "type": "Mesh", + "position": [-4.9172, 10.8242, -44.0908], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_8", + "type": "Mesh", + "position": [-4.7873, 11.8151, -41.2835], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_9", + "type": "Mesh", + "position": [-4.6704, 12.8175, -38.4752], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_10", + "type": "Mesh", + "position": [-4.5659, 13.8223, -35.671], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_11", + "type": "Mesh", + "position": [-4.4628, 14.8249, -32.8511], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_12", + "type": "Mesh", + "position": [-4.3386, 15.8289, -30.0009], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_13", + "type": "Mesh", + "position": [-1.8656, 14.8461, -32.9701], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_14", + "type": "Mesh", + "position": [-1.8353, 15.84, -30.1425], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_15", + "type": "Mesh", + "position": [0.652, 15.8554, -30.2211], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_16", + "type": "Mesh", + "position": [0.61, 16.8412, -27.4298], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_17", + "type": "Mesh", + "position": [-1.7309, 16.8364, -27.3029], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_18", + "type": "Mesh", + "position": [2.8703, 16.8403, -27.3634], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_19", + "type": "Mesh", + "position": [5.1088, 16.8341, -27.063], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_20", + "type": "Mesh", + "position": [7.3875, 16.8324, -26.6201], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_21", + "type": "Mesh", + "position": [9.7701, 16.8341, -26.0953], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_22", + "type": "Mesh", + "position": [12.2114, 16.839, -25.5469], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_23", + "type": "Mesh", + "position": [12.8382, 15.8459, -28.2976], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_24", + "type": "Mesh", + "position": [10.3482, 15.8312, -28.8839], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_25", + "type": "Mesh", + "position": [10.8975, 14.8278, -31.665], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_26", + "type": "Mesh", + "position": [7.9139, 15.826, -29.4276], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_27", + "type": "Mesh", + "position": [8.37, 14.8169, -32.2443], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_28", + "type": "Mesh", + "position": [8.7977, 13.7982, -35.0653], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_29", + "type": "Mesh", + "position": [5.8653, 14.8316, -32.6886], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_30", + "type": "Mesh", + "position": [6.1799, 13.8139, -35.5349], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_31", + "type": "Mesh", + "position": [6.4862, 12.7916, -38.3722], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_32", + "type": "Mesh", + "position": [3.5377, 13.864, -35.7712], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_33", + "type": "Mesh", + "position": [3.7249, 12.8501, -38.6076], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_34", + "type": "Mesh", + "position": [3.909, 11.8411, -41.4432], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_35", + "type": "Mesh", + "position": [0.9278, 12.8715, -38.657], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_36", + "type": "Mesh", + "position": [1.0171, 11.8654, -41.4879], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_37", + "type": "Mesh", + "position": [1.1031, 10.8645, -44.3329], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_38", + "type": "Mesh", + "position": [-1.8864, 11.8368, -41.4212], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_39", + "type": "Mesh", + "position": [-1.9082, 10.8411, -44.2483], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_40", + "type": "Mesh", + "position": [4.2939, 9.8522, -47.1238], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_41", + "type": "Mesh", + "position": [4.0966, 10.838, -44.2907], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_42", + "type": "Mesh", + "position": [1.1699, 9.8746, -47.185], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_43", + "type": "Mesh", + "position": [1.2294, 8.9124, -50.0335], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_44", + "type": "Mesh", + "position": [-1.9519, 9.8553, -47.0793], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_45", + "type": "Mesh", + "position": [-2.0139, 8.8935, -49.9197], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_46", + "type": "Mesh", + "position": [4.7517, 7.97, -52.7667], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_47", + "type": "Mesh", + "position": [4.5126, 8.8984, -49.938], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_48", + "type": "Mesh", + "position": [1.2983, 7.9774, -52.8974], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_49", + "type": "Mesh", + "position": [1.3272, 7.051, -55.8159], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_50", + "type": "Mesh", + "position": [-2.0914, 7.9602, -52.7724], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_51", + "type": "Mesh", + "position": [-2.2051, 7.0431, -55.616], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_52", + "type": "Mesh", + "position": [4.9794, 7.0489, -55.6562], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_53", + "type": "Mesh", + "position": [8.6356, 7.0384, -55.0814], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_54", + "type": "Mesh", + "position": [12.1483, 7.037, -54.3652], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_55", + "type": "Mesh", + "position": [11.625, 7.9392, -51.6356], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_56", + "type": "Mesh", + "position": [8.2227, 7.9454, -52.3055], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_57", + "type": "Mesh", + "position": [11.1259, 8.8565, -48.8917], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_58", + "type": "Mesh", + "position": [7.8345, 8.866, -49.5271], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_59", + "type": "Mesh", + "position": [10.6221, 9.8029, -46.154], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_60", + "type": "Mesh", + "position": [7.4572, 9.8088, -46.7716], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_61", + "type": "Mesh", + "position": [10.1298, 10.778, -43.4129], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_62", + "type": "Mesh", + "position": [7.1095, 10.7832, -44], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_63", + "type": "Mesh", + "position": [9.6719, 11.7716, -40.6454], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_64", + "type": "Mesh", + "position": [6.7926, 11.7815, -41.1878], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_65", + "type": "Mesh", + "position": [12.5261, 11.8016, -39.937], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_66", + "type": "Mesh", + "position": [11.9779, 12.8073, -37.1885], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_67", + "type": "Mesh", + "position": [9.2319, 12.7794, -37.865], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_68", + "type": "Mesh", + "position": [14.7089, 12.8482, -36.4744], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_69", + "type": "Mesh", + "position": [14.0837, 13.8538, -33.7567], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_70", + "type": "Mesh", + "position": [11.4354, 13.8193, -34.4327], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_71", + "type": "Mesh", + "position": [16.7472, 13.8935, -33.0643], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_72", + "type": "Mesh", + "position": [16.0544, 14.8874, -30.3714], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_73", + "type": "Mesh", + "position": [13.4646, 14.853, -31.0333], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_74", + "type": "Mesh", + "position": [15.3574, 15.8734, -27.6679], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_75", + "type": "Mesh", + "position": [17.4423, 12.8936, -35.747], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_76", + "type": "Mesh", + "position": [18.1474, 11.8961, -38.4316], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_77", + "type": "Mesh", + "position": [18.8646, 10.9073, -41.1207], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_78", + "type": "Mesh", + "position": [19.595, 9.9238, -43.818], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_79", + "type": "Mesh", + "position": [20.3535, 8.9572, -46.5394], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_80", + "type": "Mesh", + "position": [21.1388, 8.0082, -49.3067], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_81", + "type": "Mesh", + "position": [17.3672, 8.9059, -47.3638], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_82", + "type": "Mesh", + "position": [18.0703, 7.9654, -50.1244], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_83", + "type": "Mesh", + "position": [18.7235, 7.0449, -52.8776], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_84", + "type": "Mesh", + "position": [14.906, 7.9444, -50.8933], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_85", + "type": "Mesh", + "position": [15.488, 7.0391, -53.6161], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_86", + "type": "Mesh", + "position": [14.308, 8.8686, -48.1541], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_87", + "type": "Mesh", + "position": [16.6617, 9.8732, -44.6197], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_88", + "type": "Mesh", + "position": [13.6882, 9.828, -45.4074], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_89", + "type": "Mesh", + "position": [15.9923, 10.8561, -41.9015], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_90", + "type": "Mesh", + "position": [13.0896, 10.8098, -42.6729], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_91", + "type": "Mesh", + "position": [15.3455, 11.8465, -39.1897], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_92", + "type": "Mesh", + "position": [-1.8737, 12.8415, -38.6004], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_93", + "type": "Mesh", + "position": [0.8385, 13.8775, -35.8359], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_94", + "type": "Mesh", + "position": [-1.867, 13.8471, -35.7865], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_95", + "type": "Mesh", + "position": [3.3283, 14.8668, -32.9433], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_96", + "type": "Mesh", + "position": [0.736, 14.8722, -33.0245], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_97", + "type": "Mesh", + "position": [5.5185, 15.833, -29.8703], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_98", + "type": "Mesh", + "position": [3.1096, 15.8529, -30.1424], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_99", + "type": "Mesh", + "position": [-48.1453, 7.0266, -36.6113], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_100", + "type": "Mesh", + "position": [-33.0347, 16.8004, -14.704], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_101", + "type": "Mesh", + "position": [-16.4865, 16.8879, -24.3421], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_102", + "type": "Mesh", + "position": [-24.6472, 7.0777, -50.9985], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_103", + "type": "Mesh", + "position": [-27.9084, 7.0688, -49.7732], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_104", + "type": "Mesh", + "position": [-31.2571, 7.0698, -48.4518], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_105", + "type": "Mesh", + "position": [-34.5056, 7.0627, -46.7514], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_106", + "type": "Mesh", + "position": [-37.5152, 7.0447, -44.6891], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_107", + "type": "Mesh", + "position": [-40.3646, 7.0348, -42.5789], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_108", + "type": "Mesh", + "position": [-43.0557, 7.0312, -40.52], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_109", + "type": "Mesh", + "position": [-45.6294, 7.029, -38.5433], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_110", + "type": "Mesh", + "position": [-41.5311, 7.9215, -38.4189], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_111", + "type": "Mesh", + "position": [-44.0943, 7.9131, -36.4774], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_112", + "type": "Mesh", + "position": [-46.6055, 7.9043, -34.5707], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_113", + "type": "Mesh", + "position": [-42.5958, 8.8101, -34.3776], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_114", + "type": "Mesh", + "position": [-45.0878, 8.7914, -32.5179], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_115", + "type": "Mesh", + "position": [-43.6043, 9.7125, -30.4406], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_116", + "type": "Mesh", + "position": [-42.1392, 10.6664, -28.3315], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_117", + "type": "Mesh", + "position": [-40.682, 11.6354, -26.1926], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_118", + "type": "Mesh", + "position": [-39.2229, 12.631, -24.0008], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_119", + "type": "Mesh", + "position": [-37.7376, 13.656, -21.7488], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_120", + "type": "Mesh", + "position": [-36.2206, 14.6921, -19.4472], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_121", + "type": "Mesh", + "position": [-34.6597, 15.7371, -17.0928], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_122", + "type": "Mesh", + "position": [-34.0276, 14.7253, -20.9862], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_123", + "type": "Mesh", + "position": [-32.4957, 15.766, -18.6283], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_124", + "type": "Mesh", + "position": [-30.3881, 15.7807, -20.1706], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_125", + "type": "Mesh", + "position": [-28.805, 16.8165, -17.8519], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_126", + "type": "Mesh", + "position": [-30.8774, 16.8124, -16.2965], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_127", + "type": "Mesh", + "position": [-26.8283, 16.8209, -19.3325], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_128", + "type": "Mesh", + "position": [-24.945, 16.8329, -20.6418], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_129", + "type": "Mesh", + "position": [-23.0352, 16.8559, -21.7511], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_130", + "type": "Mesh", + "position": [-20.9621, 16.8724, -22.687], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_131", + "type": "Mesh", + "position": [-18.753, 16.8786, -23.5178], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_132", + "type": "Mesh", + "position": [-21.9378, 15.9357, -25.1001], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_133", + "type": "Mesh", + "position": [-19.6334, 15.959, -25.9432], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_134", + "type": "Mesh", + "position": [-20.4666, 15.0268, -28.4174], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_135", + "type": "Mesh", + "position": [-18.016, 15.0846, -29.1732], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_136", + "type": "Mesh", + "position": [-17.2806, 15.9942, -26.7251], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_137", + "type": "Mesh", + "position": [-18.7262, 14.134, -31.7247], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_138", + "type": "Mesh", + "position": [-19.4452, 13.1457, -34.354], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_139", + "type": "Mesh", + "position": [-20.1963, 12.1317, -37.0465], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_140", + "type": "Mesh", + "position": [-20.9938, 11.106, -39.7867], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_141", + "type": "Mesh", + "position": [-21.8426, 10.0757, -42.5596], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_142", + "type": "Mesh", + "position": [-22.7282, 9.0569, -45.3578], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_143", + "type": "Mesh", + "position": [-23.6575, 8.0608, -48.1799], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_144", + "type": "Mesh", + "position": [-26.8236, 8.0304, -47.0553], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_145", + "type": "Mesh", + "position": [-25.7939, 9.0113, -44.3233], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_146", + "type": "Mesh", + "position": [-28.8249, 8.9852, -43.1821], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_147", + "type": "Mesh", + "position": [-24.8051, 10.0266, -41.5784], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_148", + "type": "Mesh", + "position": [-27.7093, 9.9936, -40.5203], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_149", + "type": "Mesh", + "position": [-30.5427, 9.9297, -39.2823], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_150", + "type": "Mesh", + "position": [-26.6726, 11.0161, -37.8459], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_151", + "type": "Mesh", + "position": [-29.4226, 10.9336, -36.713], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_152", + "type": "Mesh", + "position": [-32.1298, 10.8228, -35.3214], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_153", + "type": "Mesh", + "position": [-28.3773, 11.9379, -34.1323], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_154", + "type": "Mesh", + "position": [-30.9822, 11.8199, -32.8411], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_155", + "type": "Mesh", + "position": [-33.4911, 11.7443, -31.2829], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_156", + "type": "Mesh", + "position": [-29.8479, 12.825, -30.3637], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_157", + "type": "Mesh", + "position": [-32.2576, 12.7464, -28.8854], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_158", + "type": "Mesh", + "position": [-34.6048, 12.701, -27.2649], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_159", + "type": "Mesh", + "position": [-31.0163, 13.7596, -26.4742], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_160", + "type": "Mesh", + "position": [-33.2633, 13.7202, -24.9117], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_161", + "type": "Mesh", + "position": [-29.7227, 14.778, -24.0562], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_162", + "type": "Mesh", + "position": [-31.8647, 14.7496, -22.5374], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_163", + "type": "Mesh", + "position": [-27.5462, 14.8319, -25.4367], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_164", + "type": "Mesh", + "position": [-26.305, 15.8294, -23.0074], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_165", + "type": "Mesh", + "position": [-28.3423, 15.7959, -21.6622], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_166", + "type": "Mesh", + "position": [-25.264, 14.919, -26.5971], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_167", + "type": "Mesh", + "position": [-24.174, 15.89, -24.1421], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_168", + "type": "Mesh", + "position": [-26.3048, 13.9381, -29.0867], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_169", + "type": "Mesh", + "position": [-23.8108, 14.0185, -30.0877], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_170", + "type": "Mesh", + "position": [-22.8914, 14.9865, -27.5703], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_171", + "type": "Mesh", + "position": [-24.7415, 13.0277, -32.638], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_172", + "type": "Mesh", + "position": [-22.1047, 13.0775, -33.5466], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé_173", + "type": "Mesh", + "position": [-21.2769, 14.0671, -30.9553], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol_174", + "type": "Mesh", + "position": [-25.6933, 12.0254, -35.2193], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja_175", + "type": "Mesh", + "position": [-22.9608, 12.0702, -36.1809], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-27.3388, 12.9411, -31.596], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-28.7111, 13.8315, -27.896], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-38.3133, 11.6684, -27.8836], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-35.9252, 11.7011, -29.5866], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-36.9157, 12.6672, -25.6275], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-39.7159, 10.6948, -30.0846], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-37.2643, 10.7232, -31.8548], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-38.6358, 9.763, -34.0729], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-36.0583, 9.7975, -35.9129], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-34.7547, 10.7587, -33.6372], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-37.4266, 8.8588, -38.1564], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-34.6681, 8.9017, -40.0286], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-33.3446, 9.8492, -37.7142], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-36.0646, 7.9667, -42.375], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-33.1048, 8.004, -44.2353], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-31.789, 8.9496, -41.7689], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-38.8688, 7.938, -40.3989], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-40.0542, 8.8274, -36.2638], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "tournesol", + "type": "Mesh", + "position": [-41.1398, 9.7386, -32.2455], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-35.494, 13.6905, -23.3247], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "blé", + "type": "Mesh", + "position": [-23.8565, 11.0527, -38.8595], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "soja", + "type": "Mesh", + "position": [-29.9994, 8.0221, -45.7926], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "buissons", + "type": "Object3D", + "position": [-20.2246, 3.1095, -70.1386], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-14.1379, 5.834, -59.1492], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-13.2719, 5.7979, -59.6663], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-12.4487, 5.7453, -60.2479], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-11.6734, 5.6764, -60.8906], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-10.9509, 5.5916, -61.5902], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-10.2855, 5.4916, -62.3426], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-9.6814, 5.3769, -63.143], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-9.1424, 5.2481, -63.9865], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-8.6716, 5.1063, -64.868], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-8.2721, 4.9521, -65.782], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-7.9463, 4.7865, -66.7228], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-7.6961, 4.6106, -67.6847], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-7.5232, 4.4254, -68.6617], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-7.4286, 4.2322, -69.6478], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-7.413, 4.032, -70.637], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-7.4762, 3.8261, -71.6231], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-7.6181, 3.6158, -72.6], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-7.8378, 3.4024, -73.5617], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-8.1337, 3.1872, -74.5024], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-8.5043, 2.9715, -75.4161], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-8.9471, 2.7566, -76.2973], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-9.4594, 2.5439, -77.1406], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-10.0381, 2.3347, -77.9406], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-10.6796, 2.1303, -78.6926], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-11.3799, 1.932, -79.3918], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-12.1348, 1.7408, -80.034], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-12.9395, 1.5582, -80.6151], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-13.7892, 1.385, -81.1317], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-14.6785, 1.2226, -81.5805], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-15.6021, 1.0717, -81.9588], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-16.5541, 0.9334, -82.2641], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-17.5287, 0.8086, -82.4948], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-18.52, 0.6979, -82.6492], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-19.5218, 0.6021, -82.7265], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-20.5279, 0.5217, -82.7262], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-21.5322, 0.4573, -82.6483], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-22.5284, 0.4093, -82.4933], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-23.5104, 0.3779, -82.262], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-24.4721, 0.3633, -81.9561], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-25.4076, 0.3657, -81.5773], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-26.3112, 0.3849, -81.128], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-27.1773, 0.421, -80.6109], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-28.0005, 0.4737, -80.0292], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-28.7757, 0.5426, -79.3866], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-29.4983, 0.6273, -78.6869], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-30.1636, 0.7274, -77.9346], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-30.7677, 0.8421, -77.1342], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-31.3068, 0.9708, -76.2906], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-31.7775, 1.1127, -75.4091], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-32.1771, 1.2669, -74.4952], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-32.5029, 1.4325, -73.5543], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-32.753, 1.6084, -72.5924], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-32.9259, 1.7935, -71.6154], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-33.0205, 1.9868, -70.6293], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-33.0362, 2.187, -69.6402], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-32.9729, 2.3928, -68.6541], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-32.831, 2.6031, -67.6771], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-32.6114, 2.8166, -66.7154], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-32.3154, 3.0318, -65.7748], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-31.9449, 3.2475, -64.861], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-31.5021, 3.4623, -63.9798], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-30.9898, 3.675, -63.1366], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-30.4111, 3.8842, -62.3365], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-29.7696, 4.0886, -61.5846], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-29.0692, 4.287, -60.8853], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-28.3144, 4.4781, -60.2432], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-27.5096, 4.6608, -59.662], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-26.66, 4.8339, -59.1454], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-25.7706, 4.9964, -58.6966], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-24.8471, 5.1472, -58.3184], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-23.8951, 5.2855, -58.013], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-22.9204, 5.4104, -57.7824], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-21.9291, 5.5211, -57.6279], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-20.9273, 5.6169, -57.5506], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-19.9212, 5.6972, -57.5509], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "buisson", + "type": "Mesh", + "position": [-15.0415, 5.8533, -58.6998], + "rotation": [0.1394, -1.3403, 0.3489], + "scale": [1, 1, 1] + }, + { + "name": "arbres", + "type": "Object3D", + "position": [4.6185, 12.2303, -52.5395], + "rotation": [0, -1.3459, 0], + "scale": [1, 1, 1] + }, + { + "name": "arbres", + "type": "Object3D", + "position": [12.6294, 12.2056, -51.0727], + "rotation": [3.1416, -1.2064, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [13.5023, 8.8974, -51.6228], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [12.2232, 11.4636, -44.1262], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [10.9763, 14.2168, -36.5025], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [9.7295, 17.0247, -28.7199], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-5.3958, 8.8974, -53.0006], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-4.9669, 11.4636, -45.3693], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-4.5494, 14.2168, -37.6189], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-4.1326, 17.0247, -29.7158], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-23.8928, 8.8974, -48.8971], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-21.7962, 11.4636, -41.6663], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-19.7509, 14.2168, -34.2931], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-17.7039, 17.0247, -26.7489], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-40.4273, 8.8974, -39.6637], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-36.858, 11.4636, -33.3286], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-33.3621, 14.2168, -26.8015], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre", + "type": "Mesh", + "position": [-29.8487, 17.0247, -20.0648], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "ferme_verti", + "type": "Mesh", + "position": [-20.5518, 8.1225, -70.6352], + "rotation": [3.1416, -1.1848, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "zone_energie", + "type": "Object3D", + "position": [-38.5694, 21.397, 50.3786], + "rotation": [3.1416, -1.1286, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "panneaux_solaires_", + "type": "Object3D", + "position": [-48.6802, 22.897, 32.2311], + "rotation": [-3.1416, -0.0649, -3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_0", + "type": "Mesh", + "position": [-70.4558, 20.086, 34.4879], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_1", + "type": "Mesh", + "position": [-71.9487, 16.01, 24.3689], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_2", + "type": "Mesh", + "position": [-60.0322, 21.2231, 32.7426], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_3", + "type": "Mesh", + "position": [-60.2651, 18.9485, 24.041], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_4", + "type": "Mesh", + "position": [-50.148, 22.724, 32.715], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_5", + "type": "Mesh", + "position": [-50.2549, 22.2507, 25.653], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_6", + "type": "Mesh", + "position": [-42.6015, 24.6195, 33.6543], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_7", + "type": "Mesh", + "position": [-43.5134, 25.004, 26.3826], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "panneaux_solaires", + "type": "Object3D", + "position": [-28.1161, 22.0484, 66.7736], + "rotation": [-3.1416, -0.9294, -3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_0", + "type": "Mesh", + "position": [-34.345, 19.9921, 75.3957], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_1", + "type": "Mesh", + "position": [-20.2017, 25.2104, 56.4639], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_2", + "type": "Mesh", + "position": [-23.5978, 14.8881, 79.7071], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_3", + "type": "Mesh", + "position": [-14.252, 24.6604, 59.324], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_4", + "type": "Mesh", + "position": [-17.5336, 20.6605, 65.6909], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_5", + "type": "Mesh", + "position": [-20.6537, 17.5371, 72.1844], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_6", + "type": "Mesh", + "position": [-29.8252, 21.3349, 68.2666], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_7", + "type": "Mesh", + "position": [-24.9035, 22.779, 61.9872], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "éoliennes", + "type": "Object3D", + "position": [-67.1528, 25.397, 68.0941], + "rotation": [-3.1416, -0.5658, -3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_0", + "type": "Mesh", + "position": [-92.0412, 16.0117, 33.8493], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_1", + "type": "Mesh", + "position": [-86.0049, 16.7563, 32.0059], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_2", + "type": "Mesh", + "position": [-79.8545, 22.1436, 59.5407], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_3", + "type": "Mesh", + "position": [-74.8473, 22.7176, 55.9935], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_4", + "type": "Mesh", + "position": [-60.6625, 22.1436, 80.5695], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_5", + "type": "Mesh", + "position": [-57.0062, 22.7176, 75.7209], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_6", + "type": "Mesh", + "position": [-35.9614, 15.9655, 95.0568], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "Cylindre_7", + "type": "Mesh", + "position": [-33.8614, 16.6976, 89.3578], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "générateur", + "type": "Mesh", + "position": [-48.5737, 21.4281, 54.5311], + "rotation": [3.1416, -1.1286, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "zone_fabrik", + "type": "Object3D", + "position": [35.6417, 8.9438, 51.2707], + "rotation": [0, -1.5519, 0], + "scale": [1, 1, 1] + }, + { + "name": "bati-fabrik", + "type": "Mesh", + "position": [47.4907, 11.1375, 63.8349], + "rotation": [-3.1416, -0.6297, -3.1416], + "scale": [1, 2, 1] + }, + { + "name": "Groupe1", + "type": "Object3D", + "position": [30.2688, 4.9268, 89.1765], + "rotation": [-3.1416, -0.7879, -3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [32.7856, 3.9426, 86.6943], + "rotation": [3.1416, -0.7879, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [27.7519, 5.9109, 91.6587], + "rotation": [-3.1416, -0.7879, -3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble", + "type": "Mesh", + "position": [72.2157, 4.1055, 54.7221], + "rotation": [-3.1416, -0.35, -3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [18.9151, 13.8995, 66.8272], + "rotation": [3.1416, -1.0563, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "Groupe", + "type": "Object3D", + "position": [50.8106, 15.3193, 42.1115], + "rotation": [3.1416, -0.5678, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_2", + "type": "Mesh", + "position": [53.8087, 14.3351, 40.2387], + "rotation": [3.1416, -0.5678, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "immeuble_1", + "type": "Mesh", + "position": [47.8126, 16.3034, 43.9843], + "rotation": [3.1416, -0.5678, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "zone_ecole", + "type": "Object3D", + "position": [3.7017, 28.0335, 28.3142], + "rotation": [0.1129, -1.4525, 0.1096], + "scale": [1, 1, 1] + }, + { + "name": "terrainarbresecole", + "type": "Object3D", + "position": [-0.6455, 0, 5.6812], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "panneau", + "type": "Mesh", + "position": [1.3128, 26.9637, 34.1952], + "rotation": [0.0126, -0.5805, 0.0154], + "scale": [1, 1, 1] + }, + { + "name": "arbres", + "type": "Object3D", + "position": [-0.8061, 24.8656, 24.8498], + "rotation": [0, -0.7007, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [13.7329, 23.9356, 47.3633], + "rotation": [3.1416, -0.5734, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [6.2307, 23.9356, 50.7095], + "rotation": [3.1416, -0.2657, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-1.9326, 23.9356, 51.6261], + "rotation": [3.1416, 0.042, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-9.9901, 23.9356, 50.0271], + "rotation": [3.1416, 0.3498, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-17.1848, 23.9356, 46.0625], + "rotation": [3.1416, 0.6575, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-22.8406, 23.9356, 40.105], + "rotation": [-3.1416, 0.9652, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-26.4262, 23.9356, 32.7143], + "rotation": [-3.1416, 1.273, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-27.6048, 23.9356, 24.5846], + "rotation": [0, 1.5609, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-26.2655, 23.9356, 16.4799], + "rotation": [0, 1.2532, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-22.5343, 23.9356, 9.1615], + "rotation": [0, 0.9454, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-16.7617, 23.9356, 3.3171], + "rotation": [0, 0.6377, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-9.49, 23.9356, -0.5042], + "rotation": [0, 0.33, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-1.4024, 23.9356, -1.9435], + "rotation": [0, 0.0223, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [6.7412, 23.9356, -0.8655], + "rotation": [0, -0.2855, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [14.1757, 23.9356, 2.6285], + "rotation": [0, -0.5932, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [20.2026, 23.9356, 8.2103], + "rotation": [0, -0.9009, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [24.2557, 23.9356, 15.3554], + "rotation": [0, -1.2087, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [25.9543, 23.9356, 23.3925], + "rotation": [0, -1.5164, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [25.1386, 23.9356, 31.5665], + "rotation": [3.1416, -1.3175, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "arbres", + "type": "Object3D", + "position": [-0.8061, 24.8656, 24.8498], + "rotation": [0, -0.7007, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [9.5123, 26.3756, 40.8277], + "rotation": [-3.1416, -0.5734, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [4.1879, 26.3756, 43.2025], + "rotation": [-3.1416, -0.2657, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-1.6056, 26.3756, 43.853], + "rotation": [-3.1416, 0.042, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-7.324, 26.3756, 42.7182], + "rotation": [-3.1416, 0.3498, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-12.4301, 26.3756, 39.9045], + "rotation": [-3.1416, 0.6575, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-16.444, 26.3756, 35.6765], + "rotation": [-3.1416, 0.9652, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-18.9887, 26.3756, 30.4312], + "rotation": [-3.1416, 1.273, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-19.8252, 26.3756, 24.6616], + "rotation": [0, 1.5609, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-18.8747, 26.3756, 18.9097], + "rotation": [0, 1.2532, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-16.2267, 26.3756, 13.7158], + "rotation": [0, 0.9454, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-12.1298, 26.3756, 9.568], + "rotation": [0, 0.6377, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [-6.9691, 26.3756, 6.856], + "rotation": [0, 0.33, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [-1.2293, 26.3756, 5.8345], + "rotation": [0, 0.0223, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [4.5502, 26.3756, 6.5996], + "rotation": [0, -0.2855, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [9.8265, 26.3756, 9.0793], + "rotation": [0, -0.5932, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin", + "type": "Mesh", + "position": [14.1038, 26.3756, 13.0407], + "rotation": [0, -0.9009, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [16.9803, 26.3756, 18.1116], + "rotation": [0, -1.2087, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [18.1858, 26.3756, 23.8156], + "rotation": [0, -1.5164, 0], + "scale": [1, 1, 1] + }, + { + "name": "pylone", + "type": "Mesh", + "position": [17.6069, 26.3756, 29.6167], + "rotation": [3.1416, -1.3175, 3.1416], + "scale": [1, 1, 1] + }, + { + "name": "arbres-école", + "type": "Object3D", + "position": [17.2143, 27.7146, 29.0483], + "rotation": [0.1129, -1.4525, 0.1096], + "scale": [1, 1, 1] + }, + { + "name": "arbres_1", + "type": "Object3D", + "position": [4.0735, 27.5587, 31.7711], + "rotation": [0.0133, -0.6214, 0.0159], + "scale": [1, 1, 1] + }, + { + "name": "sapin_0", + "type": "Mesh", + "position": [20.1553, 24.2993, 42.4409], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin_1", + "type": "Mesh", + "position": [7.5375, 27.2128, 33.2893], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin_2", + "type": "Mesh", + "position": [24.758, 24.3496, 35.4002], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "arbre_3", + "type": "Mesh", + "position": [9.41, 27.2123, 30.5578], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin_4", + "type": "Mesh", + "position": [14.607, 26.6674, 32.4709], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "sapin_5", + "type": "Mesh", + "position": [19.5845, 25.7627, 34.0445], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "arbre_6", + "type": "Mesh", + "position": [16.0263, 25.6963, 39.6732], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "arbre_7", + "type": "Mesh", + "position": [11.8387, 26.6517, 36.6584], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + }, + { + "name": "lecole", + "type": "Object3D", + "position": [-0.3871, 30.9693, 26.172], + "rotation": [0.0126, -0.5805, 0.0154], + "scale": [1, 2, 1] + }, + { + "name": "bati-ecole", + "type": "Mesh", + "position": [-7.1777, 30.3365, 36.5318], + "rotation": [0.0126, -0.5805, 0.0154], + "scale": [1, 2, 1] + }, + { + "name": "bati-ecole", + "type": "Mesh", + "position": [6.4132, 30.5965, 15.813], + "rotation": [0.0126, -0.5805, 0.0154], + "scale": [1, 2, 1] + }, + { + "name": "bati-ecole", + "type": "Mesh", + "position": [-0.3968, 31.9749, 26.1711], + "rotation": [0.0126, -0.5805, 0.0154], + "scale": [1, 2, 1] + }, + { + "name": "terrain", + "type": "Mesh", + "position": [-0.6455, 0, 5.6812], + "rotation": [0, 0, 0], + "scale": [1, 1, 1] + } +] diff --git a/public/models/arbre/arbre.bin b/public/models/arbre/arbre.bin index 39d3a5f..889456c 100644 Binary files a/public/models/arbre/arbre.bin and b/public/models/arbre/arbre.bin differ diff --git a/public/models/arbre/arbre.glb b/public/models/arbre/arbre.glb new file mode 100644 index 0000000..3dae041 --- /dev/null +++ b/public/models/arbre/arbre.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a55b404a579fd891c8bdf3e85519a38da73f81a4f5dc6e9355b48bba550d097d +size 14256732 diff --git a/public/models/arbre/arbre.spp b/public/models/arbre/arbre.spp new file mode 100644 index 0000000..be218a0 Binary files /dev/null and b/public/models/arbre/arbre.spp differ diff --git a/public/models/arbre/feuilles_baseColor.png b/public/models/arbre/feuilles_baseColor.png new file mode 100644 index 0000000..5774648 --- /dev/null +++ b/public/models/arbre/feuilles_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea960d6139edd7f4b488b5b9a9549331edad8aaad80d5c1de05dae0b523d5f15 +size 2396375 diff --git a/public/models/arbre/feuilles_normal.png b/public/models/arbre/feuilles_normal.png new file mode 100644 index 0000000..ebe7983 --- /dev/null +++ b/public/models/arbre/feuilles_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05ffb9add4169252be91a4ec8b53e707139a4e86910f1594d28c185bc5b536ae +size 3013728 diff --git a/public/models/arbre/feuilles_occlusionRoughnessMetallic.png b/public/models/arbre/feuilles_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..7706c8f --- /dev/null +++ b/public/models/arbre/feuilles_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b16f1e24e32c13d3b4511664d7c93c8a4c1b00a0013bc870f46269fc933e07b9 +size 629215 diff --git a/public/models/arbre/model.gltf b/public/models/arbre/model.gltf new file mode 100644 index 0000000..64c992e --- /dev/null +++ b/public/models/arbre/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7b6bcc5bf5ade2fbfa909e63f59d7f9e3f491cedf81d34f068d12ae49dffc33b +size 2293054 diff --git a/public/models/arbre/tronc_baseColor.png b/public/models/arbre/tronc_baseColor.png new file mode 100644 index 0000000..1a634a2 --- /dev/null +++ b/public/models/arbre/tronc_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25d29e2a2144a873730d153e0d708fad6a616bb8355b48f4b1bada37c78e17ab +size 940797 diff --git a/public/models/arbre/tronc_occlusionRoughnessMetallic.png b/public/models/arbre/tronc_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..2048d29 --- /dev/null +++ b/public/models/arbre/tronc_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d54f925bd271efb021fddbb9b29fc8cd1a3917e0f7fe7d7b312aaca94ad940af +size 505205 diff --git a/public/models/buisson/buisson.bin b/public/models/buisson/buisson.bin new file mode 100644 index 0000000..ad2ce20 --- /dev/null +++ b/public/models/buisson/buisson.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69d47f96ddd28b4ffaed28fa40741a984d507264f2efdf6309f05c509c7d1eef +size 2682000 diff --git a/public/models/buisson/feuilles_baseColor.png b/public/models/buisson/feuilles_baseColor.png new file mode 100644 index 0000000..ecd2570 --- /dev/null +++ b/public/models/buisson/feuilles_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d7dfb57dde5a5d3d210dc1481b4ff2f4c1f5a46e31c55a3fa9baa9c675623f1 +size 2634187 diff --git a/public/models/buisson/feuilles_normal.png b/public/models/buisson/feuilles_normal.png new file mode 100644 index 0000000..1c5d9b6 --- /dev/null +++ b/public/models/buisson/feuilles_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60001dbfc98dffaaa2bcef3ba741add59a62e5a028c5d88d648333985685f4c4 +size 4354207 diff --git a/public/models/buisson/feuilles_occlusionRoughnessMetallic.png b/public/models/buisson/feuilles_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..62ecb53 --- /dev/null +++ b/public/models/buisson/feuilles_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0b4dd1ae1b24fba7d55a8aae41838983d58a518175f268c051581fa53d05b8a7 +size 969003 diff --git a/public/models/buisson/model.gltf b/public/models/buisson/model.gltf new file mode 100644 index 0000000..e4f7abc --- /dev/null +++ b/public/models/buisson/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6228829da0a06a0f325ab8d11daff5ab5199797700ea3ea23842f34472771935 +size 3110 diff --git a/public/models/cable1/cabledroit_Base_color.png b/public/models/cable1/cabledroit_Base_color.png new file mode 100644 index 0000000..17a1e8c --- /dev/null +++ b/public/models/cable1/cabledroit_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:613f4ed9175f554bf1ec4b8425ecb2b81fde584414caaaab865bc47582f1ea61 +size 20078 diff --git a/public/models/cable1/cabledroit_Height.png b/public/models/cable1/cabledroit_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/cable1/cabledroit_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/cable1/cabledroit_Metallic.png b/public/models/cable1/cabledroit_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/cable1/cabledroit_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/cable1/cabledroit_Mixed_AO.png b/public/models/cable1/cabledroit_Mixed_AO.png new file mode 100644 index 0000000..5addc6e --- /dev/null +++ b/public/models/cable1/cabledroit_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4808a2bb7e3ae292484eab89442fe12ec00f0c9e60df1f0a3c0a07cd60d31d92 +size 100286 diff --git a/public/models/cable1/cabledroit_Normal.png b/public/models/cable1/cabledroit_Normal.png new file mode 100644 index 0000000..573e9ce --- /dev/null +++ b/public/models/cable1/cabledroit_Normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2870a832300161a35a832511aa6401a0ef8b301acf79d67eeb8aea6a6f0c6470 +size 144969 diff --git a/public/models/cable1/cabledroit_Normal_OpenGL.png b/public/models/cable1/cabledroit_Normal_OpenGL.png new file mode 100644 index 0000000..5f329f3 --- /dev/null +++ b/public/models/cable1/cabledroit_Normal_OpenGL.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:300804d6b7edc1d1375366f4a88c78d5f5f11bceb404be860144041c638fd0e6 +size 145487 diff --git a/public/models/cable1/cabledroit_Roughness.png b/public/models/cable1/cabledroit_Roughness.png new file mode 100644 index 0000000..ad7f319 --- /dev/null +++ b/public/models/cable1/cabledroit_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c284c7d004b8ac903385f47bd837da38d89bd62d6cb0ca373d0e7fb13ccebf90 +size 53658 diff --git a/public/models/cable1/model.gltf b/public/models/cable1/model.gltf new file mode 100644 index 0000000..3aa626e --- /dev/null +++ b/public/models/cable1/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:facc8c48d1ee272d9fda6e98143c62d9d75302378eaf2e916eebe5493cd1f1d3 +size 372008 diff --git a/public/models/cable2/cablegauche_Base_color.png b/public/models/cable2/cablegauche_Base_color.png new file mode 100644 index 0000000..d9adfcb --- /dev/null +++ b/public/models/cable2/cablegauche_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb15c724f623830d464d72abecd429406c7a4338e6e4a6bf1afd841dbdd0c6f5 +size 31886 diff --git a/public/models/cable2/cablegauche_Height.png b/public/models/cable2/cablegauche_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/cable2/cablegauche_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/cable2/cablegauche_Metallic.png b/public/models/cable2/cablegauche_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/cable2/cablegauche_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/cable2/cablegauche_Mixed_AO.png b/public/models/cable2/cablegauche_Mixed_AO.png new file mode 100644 index 0000000..c421b49 --- /dev/null +++ b/public/models/cable2/cablegauche_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:daf9d86a1f29600e4af115eb0d3f429240c4f8cdfb773dfc7ce7bff2785b6cd6 +size 98979 diff --git a/public/models/cable2/cablegauche_Normal.png b/public/models/cable2/cablegauche_Normal.png new file mode 100644 index 0000000..816c578 --- /dev/null +++ b/public/models/cable2/cablegauche_Normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:050b424b60d026327146d44bf02cf5f8f3c06525b1ca99b234ade11bc6114ad2 +size 144355 diff --git a/public/models/cable2/cablegauche_Normal_OpenGL.png b/public/models/cable2/cablegauche_Normal_OpenGL.png new file mode 100644 index 0000000..8d99c85 --- /dev/null +++ b/public/models/cable2/cablegauche_Normal_OpenGL.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ab8fd8bff205eea0af8292bc13ba4687b75e140645a654cdb3247c533ab646c +size 144797 diff --git a/public/models/cable2/cablegauche_Roughness.png b/public/models/cable2/cablegauche_Roughness.png new file mode 100644 index 0000000..f90ec1c --- /dev/null +++ b/public/models/cable2/cablegauche_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a252defdb7a8f50a89c6cdad3937776f4aaf10578a6134b8dc8957b25fced770 +size 53435 diff --git a/public/models/cable2/model.gltf b/public/models/cable2/model.gltf new file mode 100644 index 0000000..e6b1c5e --- /dev/null +++ b/public/models/cable2/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d8776e348ee8353a186cf0d1f6c3dbec569068bb6eb669e9469d0e8ad8d85e3b +size 388273 diff --git a/public/models/chemins/chemin_baseColor.png b/public/models/chemins/chemin_baseColor.png new file mode 100644 index 0000000..e8a5e8b --- /dev/null +++ b/public/models/chemins/chemin_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b7d84c0a421b3053f622701fd7ed2650008314f0e21c100fbff9b95d62c74cd9 +size 1630361 diff --git a/public/models/chemins/chemin_normal.png b/public/models/chemins/chemin_normal.png new file mode 100644 index 0000000..7ecf444 --- /dev/null +++ b/public/models/chemins/chemin_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de996c090c39ddf8a061aa5d4a38ecada92556915bc63a49d8768ebf9f714ccd +size 2312861 diff --git a/public/models/chemins/chemin_occlusionRoughnessMetallic.png b/public/models/chemins/chemin_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..e631e74 --- /dev/null +++ b/public/models/chemins/chemin_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab2316f07a7260c1d154456c81f6f29cd558ebc58129451b41c566287cbe869d +size 1036737 diff --git a/public/models/chemins/chemins.bin b/public/models/chemins/chemins.bin new file mode 100644 index 0000000..2c41af6 --- /dev/null +++ b/public/models/chemins/chemins.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ba960011c92ed9d62232442d6244aaddffd76b0393679fcc8d99acbd0f2d708 +size 8208 diff --git a/public/models/chemins/chemins.glb b/public/models/chemins/chemins.glb new file mode 100644 index 0000000..1d58962 --- /dev/null +++ b/public/models/chemins/chemins.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:acd28ce2e66a217e21f4bdee1e90a30179e880a7cf90dffcfd11208950506375 +size 4991272 diff --git a/public/models/chemins/model.gltf b/public/models/chemins/model.gltf new file mode 100644 index 0000000..00dea0b --- /dev/null +++ b/public/models/chemins/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a14e2139e9c3bfbbe53a0f09205ab6bbdb572297206a2b5fe04a13ae73cbe846 +size 2967 diff --git a/public/models/createurdepluie/bac_eau_basecolor.png b/public/models/createurdepluie/bac_eau_basecolor.png new file mode 100644 index 0000000..783cc94 --- /dev/null +++ b/public/models/createurdepluie/bac_eau_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b5a6f13068b4d264586739b2398b31ecc58cdaf888f57cd2f4436d4c6c881a1 +size 184487 diff --git a/public/models/createurdepluie/bac_eau_normal.png b/public/models/createurdepluie/bac_eau_normal.png new file mode 100644 index 0000000..de96fbc --- /dev/null +++ b/public/models/createurdepluie/bac_eau_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f023b5e27d540faec936a0cd17614375a682cbaffe9a1dc9a1bf3f57442bb32 +size 3221317 diff --git a/public/models/createurdepluie/bac_eau_occlusionroughnessmetallic.png b/public/models/createurdepluie/bac_eau_occlusionroughnessmetallic.png new file mode 100644 index 0000000..b8257a6 --- /dev/null +++ b/public/models/createurdepluie/bac_eau_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0bfea8322d8fd6c268fef98caeb975e5382006a5524b8e50c870eb64cde78179 +size 492220 diff --git a/public/models/createurdepluie/cable_1_basecolor.png b/public/models/createurdepluie/cable_1_basecolor.png new file mode 100644 index 0000000..1e0cf93 --- /dev/null +++ b/public/models/createurdepluie/cable_1_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5075c237c1aa8b07f9ada565621c1b78a6be0ae996f34966e4ba679085caa81e +size 16903 diff --git a/public/models/createurdepluie/cable_1_normal.png b/public/models/createurdepluie/cable_1_normal.png new file mode 100644 index 0000000..801e9cd --- /dev/null +++ b/public/models/createurdepluie/cable_1_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbd2c70e1e64f74362b4e59c3782ad586e05f4b10a58e8ef07736c5b23f27d47 +size 2272612 diff --git a/public/models/createurdepluie/cable_1_occlusionroughnessmetallic.png b/public/models/createurdepluie/cable_1_occlusionroughnessmetallic.png new file mode 100644 index 0000000..5bcc0e3 --- /dev/null +++ b/public/models/createurdepluie/cable_1_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:245e50263e24661e727e285b9f15006638f9cc15feafed65e377d32497fe3738 +size 16902 diff --git a/public/models/createurdepluie/cable_2_basecolor.png b/public/models/createurdepluie/cable_2_basecolor.png new file mode 100644 index 0000000..963528c --- /dev/null +++ b/public/models/createurdepluie/cable_2_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1041f4944fd55c9ef174f68768151a0d47780fa7196113cf10cef793e3f9b78e +size 16905 diff --git a/public/models/createurdepluie/cable_2_normal.png b/public/models/createurdepluie/cable_2_normal.png new file mode 100644 index 0000000..801e9cd --- /dev/null +++ b/public/models/createurdepluie/cable_2_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbd2c70e1e64f74362b4e59c3782ad586e05f4b10a58e8ef07736c5b23f27d47 +size 2272612 diff --git a/public/models/createurdepluie/cable_2_occlusionroughnessmetallic.png b/public/models/createurdepluie/cable_2_occlusionroughnessmetallic.png new file mode 100644 index 0000000..5bcc0e3 --- /dev/null +++ b/public/models/createurdepluie/cable_2_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:245e50263e24661e727e285b9f15006638f9cc15feafed65e377d32497fe3738 +size 16902 diff --git a/public/models/createurdepluie/model.gltf b/public/models/createurdepluie/model.gltf new file mode 100644 index 0000000..96bff1f --- /dev/null +++ b/public/models/createurdepluie/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:45eaf8de6cd85e5ded7c706f263fdf6b899f7a8ea6fa9d2fc4f1aa9969726d4d +size 28842546 diff --git a/public/models/createurdepluie/refroidisseur_basecolor.png b/public/models/createurdepluie/refroidisseur_basecolor.png new file mode 100644 index 0000000..a6ea95d --- /dev/null +++ b/public/models/createurdepluie/refroidisseur_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9851775687a9d8102d5437c21551e8bba3567777cd0aa886e36cdb25df13453e +size 16902 diff --git a/public/models/createurdepluie/refroidisseur_normal.png b/public/models/createurdepluie/refroidisseur_normal.png new file mode 100644 index 0000000..801e9cd --- /dev/null +++ b/public/models/createurdepluie/refroidisseur_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbd2c70e1e64f74362b4e59c3782ad586e05f4b10a58e8ef07736c5b23f27d47 +size 2272612 diff --git a/public/models/createurdepluie/refroidisseur_occlusionroughnessmetallic.png b/public/models/createurdepluie/refroidisseur_occlusionroughnessmetallic.png new file mode 100644 index 0000000..5bcc0e3 --- /dev/null +++ b/public/models/createurdepluie/refroidisseur_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:245e50263e24661e727e285b9f15006638f9cc15feafed65e377d32497fe3738 +size 16902 diff --git a/public/models/createurdepluie/resistance_basecolor.png b/public/models/createurdepluie/resistance_basecolor.png new file mode 100644 index 0000000..0e8b4c0 --- /dev/null +++ b/public/models/createurdepluie/resistance_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2a98ca251ec125b292ca933dcaabde7a8cffc671c196d0912317f5f4b78a02e6 +size 16905 diff --git a/public/models/createurdepluie/resistance_normal.png b/public/models/createurdepluie/resistance_normal.png new file mode 100644 index 0000000..88de4b1 --- /dev/null +++ b/public/models/createurdepluie/resistance_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:08afc9f1d8399100be33bd233388a26a1b6b94de95810ab583c491022ae5fb15 +size 2553049 diff --git a/public/models/createurdepluie/resistance_occlusionroughnessmetallic.png b/public/models/createurdepluie/resistance_occlusionroughnessmetallic.png new file mode 100644 index 0000000..a41d659 --- /dev/null +++ b/public/models/createurdepluie/resistance_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:265f3084db7db2ea2fe1a1f259b05315ada8cbfcb2b16824ddde8500f904b1f2 +size 300665 diff --git a/public/models/createurdepluie/shell_basecolor.png b/public/models/createurdepluie/shell_basecolor.png new file mode 100644 index 0000000..ce0a7bf --- /dev/null +++ b/public/models/createurdepluie/shell_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b5045fd7273b46e817bf56da900602491c7894adc60660c5f08acc99e3d4c87 +size 212626 diff --git a/public/models/createurdepluie/shell_normal.png b/public/models/createurdepluie/shell_normal.png new file mode 100644 index 0000000..0d3c060 --- /dev/null +++ b/public/models/createurdepluie/shell_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05682068f4a19be1f3d40e0f463dc76567d79524f1bd1e99aa38b778b695a92e +size 2505766 diff --git a/public/models/createurdepluie/shell_occlusionroughnessmetallic.png b/public/models/createurdepluie/shell_occlusionroughnessmetallic.png new file mode 100644 index 0000000..8fa3717 --- /dev/null +++ b/public/models/createurdepluie/shell_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ee07ba1b25f822098e72df9099dbbdbf73244acb6b0e61e3a735745185ff3c3e +size 347997 diff --git a/public/models/createurdepluie/tuyau_basecolor.png b/public/models/createurdepluie/tuyau_basecolor.png new file mode 100644 index 0000000..eae930e --- /dev/null +++ b/public/models/createurdepluie/tuyau_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae0258e8e81b889fcb2bfa625191c750413bfdd5630688321c3b5f4501760880 +size 718156 diff --git a/public/models/createurdepluie/tuyau_normal.png b/public/models/createurdepluie/tuyau_normal.png new file mode 100644 index 0000000..f3d383f --- /dev/null +++ b/public/models/createurdepluie/tuyau_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:922fc53127b0be5e6c39ae17c5fef31ec6a7a67c4db7e0c141301d5da8c60503 +size 3258002 diff --git a/public/models/createurdepluie/tuyau_occlusionroughnessmetallic.png b/public/models/createurdepluie/tuyau_occlusionroughnessmetallic.png new file mode 100644 index 0000000..1dd17a9 --- /dev/null +++ b/public/models/createurdepluie/tuyau_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f30eddef4ecebe9474111a423da53a68c247f77c067214dc77cd490db4b34d39 +size 421486 diff --git a/public/models/ebike/Cable 1_baseColor.png b/public/models/ebike/Cable 1_baseColor.png new file mode 100644 index 0000000..3245455 --- /dev/null +++ b/public/models/ebike/Cable 1_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3dfa719cde9daa39a0333c8a1b8d0bee72692c69b3bbf1da388df0deb0f4ba0e +size 16904 diff --git a/public/models/ebike/Cable 1_normal.png b/public/models/ebike/Cable 1_normal.png new file mode 100644 index 0000000..a42b114 --- /dev/null +++ b/public/models/ebike/Cable 1_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afc88d8cbb75c5b4e5761fc40cdb1f937beae4d8483f05ca845ab56e19f15c90 +size 3066150 diff --git a/public/models/ebike/Cable 1_occlusionRoughnessMetallic.png b/public/models/ebike/Cable 1_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..8747c04 --- /dev/null +++ b/public/models/ebike/Cable 1_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:77cf06f5e7e08653f290c353cd4c37ff91c118602436be1256280e13e52cd173 +size 353293 diff --git a/public/models/ebike/Cable2_baseColor.png b/public/models/ebike/Cable2_baseColor.png new file mode 100644 index 0000000..033cb1d --- /dev/null +++ b/public/models/ebike/Cable2_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d414328fbcbd2216d6bb2f3722f4892aa9d004280772b5b2de814335c4fd8b2 +size 16905 diff --git a/public/models/ebike/Cable2_normal.png b/public/models/ebike/Cable2_normal.png new file mode 100644 index 0000000..3679ba1 --- /dev/null +++ b/public/models/ebike/Cable2_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bd3f1dcf7d1309b3e907939fd96fcfb9740fcce0a7755aca372b72297aa17f9d +size 3033832 diff --git a/public/models/ebike/Cable2_occlusionRoughnessMetallic.png b/public/models/ebike/Cable2_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..f0c1d5f --- /dev/null +++ b/public/models/ebike/Cable2_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:937bba888a3f821daba2aec3653bbcc3f393234d51cd604dd9341d6320c92cb2 +size 355460 diff --git a/public/models/ebike/Carroserie_baseColor.png b/public/models/ebike/Carroserie_baseColor.png new file mode 100644 index 0000000..0171d51 --- /dev/null +++ b/public/models/ebike/Carroserie_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:957d7b537a82fbdbf1049291af8c36431c4abd4fbd9e94381dbd49215b2b50b2 +size 16905 diff --git a/public/models/ebike/Carroserie_normal.png b/public/models/ebike/Carroserie_normal.png new file mode 100644 index 0000000..dbdd88e --- /dev/null +++ b/public/models/ebike/Carroserie_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c692839659b369d9694709deea005faf71e4b448d24b7bbeec9f8d1c47b94485 +size 2510257 diff --git a/public/models/ebike/Carroserie_occlusionRoughnessMetallic.png b/public/models/ebike/Carroserie_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..05ff7d9 --- /dev/null +++ b/public/models/ebike/Carroserie_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6abf72de5fcfce9738ac6f49bc3352160b11f1af7680ae5da84266d5fb4aaa2 +size 261088 diff --git a/public/models/ebike/Ferail_baseColor.png b/public/models/ebike/Ferail_baseColor.png new file mode 100644 index 0000000..b2e286e --- /dev/null +++ b/public/models/ebike/Ferail_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:72fc78eb3273eb8ae80c523319de0e3e69924a5f7ec15d88a6330083ccfffd8f +size 276020 diff --git a/public/models/ebike/Ferail_normal.png b/public/models/ebike/Ferail_normal.png new file mode 100644 index 0000000..2f2b172 --- /dev/null +++ b/public/models/ebike/Ferail_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efb159756d206de812e300c1bc40df771b5cd2606c4d856682af5873584b7761 +size 2554815 diff --git a/public/models/ebike/Ferail_occlusionRoughnessMetallic.png b/public/models/ebike/Ferail_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..52689a4 --- /dev/null +++ b/public/models/ebike/Ferail_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:25a3b05c805e06b38fd94bb27eff7c8ae72ce4bf14fbdb15e59366ac2e1f45f1 +size 349895 diff --git a/public/models/ebike/Reservoir_baseColor.png b/public/models/ebike/Reservoir_baseColor.png new file mode 100644 index 0000000..7ec7dac --- /dev/null +++ b/public/models/ebike/Reservoir_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:81cda14600b32f5ab26e00d9db40924010e1beb1939c5eed0ce6386e358d3b1d +size 53203 diff --git a/public/models/ebike/Reservoir_normal.png b/public/models/ebike/Reservoir_normal.png new file mode 100644 index 0000000..1bfb989 --- /dev/null +++ b/public/models/ebike/Reservoir_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4702cd610157f13b0bf2c4bb04dd40489e80719e90fc7cb57f1c30f6a4cc2658 +size 2272453 diff --git a/public/models/ebike/Reservoir_occlusionRoughnessMetallic.png b/public/models/ebike/Reservoir_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..b46ab8d --- /dev/null +++ b/public/models/ebike/Reservoir_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7aec1cadb1ffd038a54e648b875609458725c1ef652959e252afa0f03a3f7f1e +size 16902 diff --git a/public/models/ebike/Sac_baseColor.png b/public/models/ebike/Sac_baseColor.png new file mode 100644 index 0000000..a5a1f2e --- /dev/null +++ b/public/models/ebike/Sac_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4050254074e54089f003380521fac6e72590cd8f0b00be951dfe77bd16fe55b +size 16904 diff --git a/public/models/ebike/Sac_normal.png b/public/models/ebike/Sac_normal.png new file mode 100644 index 0000000..be10189 --- /dev/null +++ b/public/models/ebike/Sac_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9fced262e1eb6b4dfa10bea86eaa2e8c497304fc26f055dffc03e1459588c231 +size 2343888 diff --git a/public/models/ebike/Sac_occlusionRoughnessMetallic.png b/public/models/ebike/Sac_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..45e9c20 --- /dev/null +++ b/public/models/ebike/Sac_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c539f92a27e495d88074dc87f3cd463d66b96b7de73188957b5f6d361b1e7b95 +size 105767 diff --git a/public/models/ebike/Siege_baseColor.png b/public/models/ebike/Siege_baseColor.png new file mode 100644 index 0000000..77303d5 --- /dev/null +++ b/public/models/ebike/Siege_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ebe579bfb6a336e8d580323c6ac660e755836d180d5c9ba4276c11c1e44f59d +size 16904 diff --git a/public/models/ebike/Siege_normal.png b/public/models/ebike/Siege_normal.png new file mode 100644 index 0000000..08c1c41 --- /dev/null +++ b/public/models/ebike/Siege_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c813675da9d47425a2cac86909e98646a82c2a42b73378f7eab8a5af79f08f7e +size 2800715 diff --git a/public/models/ebike/Siege_occlusionRoughnessMetallic.png b/public/models/ebike/Siege_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..c6b768c --- /dev/null +++ b/public/models/ebike/Siege_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a11a02281f5443ef44ec0ccb93d4ab1b4972e16e673741834acda5a3b60390c +size 308036 diff --git a/public/models/ebike/ebike.bin b/public/models/ebike/ebike.bin new file mode 100644 index 0000000..30c7a57 --- /dev/null +++ b/public/models/ebike/ebike.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed6d61d76b9acb99c87b45b497dcd0214e2f0c0eb2ab7390e3a14d0debbe26b4 +size 3865056 diff --git a/public/models/ebike/model.gltf b/public/models/ebike/model.gltf new file mode 100644 index 0000000..90c018b --- /dev/null +++ b/public/models/ebike/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c63499eef242474ceecaefcd8e242af239d63d77ef6dc854fea19ab802c6e40c +size 311438 diff --git a/public/models/ebike/phare_baseColor.png b/public/models/ebike/phare_baseColor.png new file mode 100644 index 0000000..05209c8 --- /dev/null +++ b/public/models/ebike/phare_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91c23d60933bb685bbb96bdae47672f5c7ec1a62552a56d0eeee1b22448cb66d +size 16905 diff --git a/public/models/ebike/phare_normal.png b/public/models/ebike/phare_normal.png new file mode 100644 index 0000000..7919b63 --- /dev/null +++ b/public/models/ebike/phare_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a4a1e9491ca5d182d658a29095d24616f7927b8084a68733f5e2eca638b0e7f +size 2905767 diff --git a/public/models/ebike/phare_occlusionRoughnessMetallic.png b/public/models/ebike/phare_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..b0edb22 --- /dev/null +++ b/public/models/ebike/phare_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:808064a2e6581764a06ead7add5c07bf3d3bd33f3fefb9d76dfe96b8fd3ec3a3 +size 76759 diff --git a/public/models/ebike/pneu_baseColor.png b/public/models/ebike/pneu_baseColor.png new file mode 100644 index 0000000..f0070f9 --- /dev/null +++ b/public/models/ebike/pneu_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66b5bd694173370dad3acaf0b8f51fbb3430aaa8ab485b4e9edda391ceccbd89 +size 16903 diff --git a/public/models/ebike/pneu_normal.png b/public/models/ebike/pneu_normal.png new file mode 100644 index 0000000..36b9922 --- /dev/null +++ b/public/models/ebike/pneu_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39901ec91b5cebd09a5cd47e8113c702639cd4469c0f9163fae482f22ed259d0 +size 2906834 diff --git a/public/models/ebike/pneu_occlusionRoughnessMetallic.png b/public/models/ebike/pneu_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..1c9776d --- /dev/null +++ b/public/models/ebike/pneu_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e148f1d006dbbc26e4e2d846b359c6099a49ceec3fca57373293aad70709257e +size 175094 diff --git a/public/models/ebike/refroidisseur_baseColor.png b/public/models/ebike/refroidisseur_baseColor.png new file mode 100644 index 0000000..d42ddd3 --- /dev/null +++ b/public/models/ebike/refroidisseur_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0a26f992b5a35bb17d7413706137eda6556b1efa06b166d4b304ca779a5e40a +size 16905 diff --git a/public/models/ebike/refroidisseur_normal.png b/public/models/ebike/refroidisseur_normal.png new file mode 100644 index 0000000..2d305a2 --- /dev/null +++ b/public/models/ebike/refroidisseur_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:17af9328e0fd9ab1616a4ded1beded04ff74354c94a08353aeeaaa2c1a121088 +size 2681590 diff --git a/public/models/ebike/refroidisseur_occlusionRoughnessMetallic.png b/public/models/ebike/refroidisseur_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..7472735 --- /dev/null +++ b/public/models/ebike/refroidisseur_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db6b826f7944bebcd541739518eb6f9c4b4fbc2039666f7e09f67c8249e4f42f +size 392559 diff --git a/public/models/ebike/resort_baseColor.png b/public/models/ebike/resort_baseColor.png new file mode 100644 index 0000000..15c01a0 --- /dev/null +++ b/public/models/ebike/resort_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de9b0d8cdb09ea492a643f3df39485dfa0a079c35d64ce1e9a07f96b13911f77 +size 16906 diff --git a/public/models/ebike/resort_normal.png b/public/models/ebike/resort_normal.png new file mode 100644 index 0000000..d51da9b --- /dev/null +++ b/public/models/ebike/resort_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51249f7261e440e355c85abc2abc453760f7a51f98e868e3132dbf6431f5b47b +size 2929670 diff --git a/public/models/ebike/resort_occlusionRoughnessMetallic.png b/public/models/ebike/resort_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..106d8d6 --- /dev/null +++ b/public/models/ebike/resort_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1a1420af59e0ebc0d2707ca3e5148f4bb621fa73daabff45b6ed723f766836e9 +size 100634 diff --git a/public/models/ecole/Panneau_baseColor.png b/public/models/ecole/Panneau_baseColor.png new file mode 100644 index 0000000..6a5a13d --- /dev/null +++ b/public/models/ecole/Panneau_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ccd0b05ec597b6c659ff5839c5ea711e0f69812b5bbfe3bcae283d80524b3a2d +size 553813 diff --git a/public/models/ecole/Panneau_normal.png b/public/models/ecole/Panneau_normal.png new file mode 100644 index 0000000..f6bc270 --- /dev/null +++ b/public/models/ecole/Panneau_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c34c69d4745aecdf3be9ecf1ac598fcc83247ad8f56dcd154b37639f997d7fa0 +size 2598855 diff --git a/public/models/ecole/Panneau_occlusionRoughnessMetallic.png b/public/models/ecole/Panneau_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..0316814 --- /dev/null +++ b/public/models/ecole/Panneau_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90e855f9f4f329a67193ae5a72d80f958b57c51ee54bb30a9f8334e201ac0b3f +size 364876 diff --git a/public/models/ecole/ecole2.bin b/public/models/ecole/ecole2.bin new file mode 100644 index 0000000..f5fcd05 --- /dev/null +++ b/public/models/ecole/ecole2.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:69ec620396ceb5440723b060af92c1420fa20c72ba2d61ba9f59d192bc7b1e11 +size 188088 diff --git a/public/models/ecole/fenetre_baseColor.png b/public/models/ecole/fenetre_baseColor.png new file mode 100644 index 0000000..ee24397 --- /dev/null +++ b/public/models/ecole/fenetre_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:68f2d77c0b477b48080e1b27ad11074c5fd23c5928ae13577a92bd4bd1ff19f7 +size 107157 diff --git a/public/models/ecole/fenetre_normal.png b/public/models/ecole/fenetre_normal.png new file mode 100644 index 0000000..cb6a532 --- /dev/null +++ b/public/models/ecole/fenetre_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbef2db5e7556f13115744dfbbb4520e36379810a5340603e83159e8683f58ce +size 2413075 diff --git a/public/models/ecole/fenetre_occlusionRoughnessMetallic.png b/public/models/ecole/fenetre_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..e8f138a --- /dev/null +++ b/public/models/ecole/fenetre_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc52932715c82b80d92e7c020def7181f3f13936eaf8a4c8db35e8c20d39d078 +size 83608 diff --git a/public/models/ecole/maison_baseColor.png b/public/models/ecole/maison_baseColor.png new file mode 100644 index 0000000..4376b24 --- /dev/null +++ b/public/models/ecole/maison_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:550d3a896dd06ebc8e9abd668645f057dc45f0095628d209664991bc7cb8ff13 +size 794881 diff --git a/public/models/ecole/maison_normal.png b/public/models/ecole/maison_normal.png new file mode 100644 index 0000000..6cc1302 --- /dev/null +++ b/public/models/ecole/maison_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d123398ca52c2d4f38e15103029cc2e19f7b27fa8e2568cc3348359517cfe780 +size 3434766 diff --git a/public/models/ecole/maison_occlusionRoughnessMetallic.png b/public/models/ecole/maison_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..ed72cd8 --- /dev/null +++ b/public/models/ecole/maison_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6e8e5f141654f7cafa573f8362b33c50c53cd7e07ddaf28c4acc98f1309f6d8 +size 1065333 diff --git a/public/models/ecole/model.gltf b/public/models/ecole/model.gltf new file mode 100644 index 0000000..6056361 --- /dev/null +++ b/public/models/ecole/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d724bb99c0f36d0984018f4eb9f9304d02b1328a002caf3c175390d3972888b +size 22590156 diff --git a/public/models/ecole/porte_baseColor.png b/public/models/ecole/porte_baseColor.png new file mode 100644 index 0000000..ccdaaec --- /dev/null +++ b/public/models/ecole/porte_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2840b14685c2e82ead9acad4048be357ce2bd4f0084ed2100cbf3244609c5cc6 +size 28307 diff --git a/public/models/ecole/porte_normal.png b/public/models/ecole/porte_normal.png new file mode 100644 index 0000000..c482fa3 --- /dev/null +++ b/public/models/ecole/porte_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc4c48303b594a6c391c4a2d45bf7fffc5424a0b97d756af32cf45601c2816e6 +size 2477905 diff --git a/public/models/ecole/porte_occlusionRoughnessMetallic.png b/public/models/ecole/porte_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..d85ee2e --- /dev/null +++ b/public/models/ecole/porte_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06bce47a6b2308c10bdd2cac2ada91149892e8212bc290c2f01e29bd830b97c6 +size 31863 diff --git a/public/models/ecole/tiges_baseColor.png b/public/models/ecole/tiges_baseColor.png new file mode 100644 index 0000000..3bb4087 --- /dev/null +++ b/public/models/ecole/tiges_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a742cb3a3643caf18d499f48a4fe1ee9c8d19aa634e1e86c9c8b23cf08169ed +size 16906 diff --git a/public/models/ecole/tiges_normal.png b/public/models/ecole/tiges_normal.png new file mode 100644 index 0000000..801e9cd --- /dev/null +++ b/public/models/ecole/tiges_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbd2c70e1e64f74362b4e59c3782ad586e05f4b10a58e8ef07736c5b23f27d47 +size 2272612 diff --git a/public/models/ecole/tiges_occlusionRoughnessMetallic.png b/public/models/ecole/tiges_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..5bcc0e3 --- /dev/null +++ b/public/models/ecole/tiges_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:245e50263e24661e727e285b9f15006638f9cc15feafed65e377d32497fe3738 +size 16902 diff --git a/public/models/elec/Mat_baseColor.png b/public/models/elec/Mat_baseColor.png new file mode 100644 index 0000000..ba0de35 --- /dev/null +++ b/public/models/elec/Mat_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:142be230a66ff6bebe321b373e4785283624c3bb5f3565114a6acca6e2d056f2 +size 691735 diff --git a/public/models/elec/Mat_normal.png b/public/models/elec/Mat_normal.png new file mode 100644 index 0000000..c72e6e2 --- /dev/null +++ b/public/models/elec/Mat_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f4580790707fc1fc505b3b725a523eac3e985353bc2e566a73ae2d983e87029 +size 1229760 diff --git a/public/models/elec/Mat_occlusionRoughnessMetallic.png b/public/models/elec/Mat_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..dc6530c --- /dev/null +++ b/public/models/elec/Mat_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2abdb28a5b27842d8958480f97357a3603b2c0ab46db9ff6bf08e474600c5d49 +size 650826 diff --git a/public/models/elec/model.bin b/public/models/elec/model.bin new file mode 100644 index 0000000..3a75871 --- /dev/null +++ b/public/models/elec/model.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:247407ee9bdb8fa5730a56df06872a224888cde1a4a0592c62d0157608b83f02 +size 2954520 diff --git a/public/models/elec/model.gltf b/public/models/elec/model.gltf new file mode 100644 index 0000000..fc3c84f --- /dev/null +++ b/public/models/elec/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35129131d3f1d70b9648b5ea09d704ffecaab6b52aa03c0ab32b476349b25f92 +size 47180 diff --git a/public/models/electricienne/Mat_baseColor.png b/public/models/electricienne/Mat_baseColor.png new file mode 100644 index 0000000..ba0de35 --- /dev/null +++ b/public/models/electricienne/Mat_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:142be230a66ff6bebe321b373e4785283624c3bb5f3565114a6acca6e2d056f2 +size 691735 diff --git a/public/models/electricienne/Mat_normal.png b/public/models/electricienne/Mat_normal.png new file mode 100644 index 0000000..66ca144 --- /dev/null +++ b/public/models/electricienne/Mat_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de14342c19b038a504840385d616c239851b90a289dac974fb6f93e7f3c03b99 +size 3374459 diff --git a/public/models/electricienne/Mat_occlusionRoughnessMetallic.png b/public/models/electricienne/Mat_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..dc6530c --- /dev/null +++ b/public/models/electricienne/Mat_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2abdb28a5b27842d8958480f97357a3603b2c0ab46db9ff6bf08e474600c5d49 +size 650826 diff --git a/public/models/electricienne/electricienne.bin b/public/models/electricienne/electricienne.bin new file mode 100644 index 0000000..c1cb8a9 --- /dev/null +++ b/public/models/electricienne/electricienne.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:96139291cc9e5f46b3c6526b68d2560af05da817b9d96c8660802705dc0d4fd9 +size 3050928 diff --git a/public/models/electricienne/model.gltf b/public/models/electricienne/model.gltf new file mode 100644 index 0000000..53ed71b --- /dev/null +++ b/public/models/electricienne/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efaeba23122c987375bcbd9c920cea85b0eea02205fe3164e2dcc076e24fa71d +size 3113 diff --git a/public/models/electricienne_animated/Mat_baseColor.png b/public/models/electricienne_animated/Mat_baseColor.png new file mode 100644 index 0000000..ba0de35 --- /dev/null +++ b/public/models/electricienne_animated/Mat_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:142be230a66ff6bebe321b373e4785283624c3bb5f3565114a6acca6e2d056f2 +size 691735 diff --git a/public/models/electricienne_animated/Mat_normal.png b/public/models/electricienne_animated/Mat_normal.png new file mode 100644 index 0000000..c72e6e2 --- /dev/null +++ b/public/models/electricienne_animated/Mat_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f4580790707fc1fc505b3b725a523eac3e985353bc2e566a73ae2d983e87029 +size 1229760 diff --git a/public/models/electricienne_animated/Mat_occlusionRoughnessMetallic.png b/public/models/electricienne_animated/Mat_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..dc6530c --- /dev/null +++ b/public/models/electricienne_animated/Mat_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2abdb28a5b27842d8958480f97357a3603b2c0ab46db9ff6bf08e474600c5d49 +size 650826 diff --git a/public/models/electricienne_animated/model.bin b/public/models/electricienne_animated/model.bin new file mode 100644 index 0000000..3a75871 --- /dev/null +++ b/public/models/electricienne_animated/model.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:247407ee9bdb8fa5730a56df06872a224888cde1a4a0592c62d0157608b83f02 +size 2954520 diff --git a/public/models/electricienne_animated/model.gltf b/public/models/electricienne_animated/model.gltf new file mode 100644 index 0000000..fc3c84f --- /dev/null +++ b/public/models/electricienne_animated/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35129131d3f1d70b9648b5ea09d704ffecaab6b52aa03c0ab32b476349b25f92 +size 47180 diff --git a/public/models/eolienne/cul_base_color.png b/public/models/eolienne/cul_base_color.png new file mode 100644 index 0000000..e144980 --- /dev/null +++ b/public/models/eolienne/cul_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:865edafdd3f22fd509f75c6ec5238dedad300f5fb2665f7f088ef1f810d6cb73 +size 432094 diff --git a/public/models/eolienne/cul_height.png b/public/models/eolienne/cul_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/eolienne/cul_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/eolienne/cul_metallic.png b/public/models/eolienne/cul_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/eolienne/cul_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/eolienne/cul_mixed_ao.png b/public/models/eolienne/cul_mixed_ao.png new file mode 100644 index 0000000..655dffa --- /dev/null +++ b/public/models/eolienne/cul_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5960ad1ade751d2b6a45137265507c9b98ec9a427bcb4cdd640b308288875929 +size 295249 diff --git a/public/models/eolienne/cul_normal.png b/public/models/eolienne/cul_normal.png new file mode 100644 index 0000000..3e142f2 --- /dev/null +++ b/public/models/eolienne/cul_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:761530eb1110b23e7eaa0f4dd7f1fc7e909e91d2d20204991b33932d21c83071 +size 203721 diff --git a/public/models/eolienne/cul_normal_opengl.png b/public/models/eolienne/cul_normal_opengl.png new file mode 100644 index 0000000..a7c7291 --- /dev/null +++ b/public/models/eolienne/cul_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5bdf12b1dcc3ff804e53ff6a70c765da7e55f07afca01a8277aacf4685ceaaba +size 205011 diff --git a/public/models/eolienne/cul_roughness.png b/public/models/eolienne/cul_roughness.png new file mode 100644 index 0000000..8e05377 --- /dev/null +++ b/public/models/eolienne/cul_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1cbb69128ca93cce687503bf369b0e395cf82df46558780fd4e29d01675716f +size 91621 diff --git a/public/models/eolienne/feuilles1st_base_color.png b/public/models/eolienne/feuilles1st_base_color.png new file mode 100644 index 0000000..32d6629 --- /dev/null +++ b/public/models/eolienne/feuilles1st_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f57737c31c43f7160f4a66174f8fe8a012f75b0f982b2476e00e7bf55a9e022 +size 276451 diff --git a/public/models/eolienne/feuilles1st_height.png b/public/models/eolienne/feuilles1st_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/eolienne/feuilles1st_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/eolienne/feuilles1st_metallic.png b/public/models/eolienne/feuilles1st_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/eolienne/feuilles1st_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/eolienne/feuilles1st_mixed_ao.png b/public/models/eolienne/feuilles1st_mixed_ao.png new file mode 100644 index 0000000..3c00fbc --- /dev/null +++ b/public/models/eolienne/feuilles1st_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4dae82e8f1b8e0df14d9e89e9ea43da19f9f223f9e37c2aef2c0bd7192ea84a +size 308317 diff --git a/public/models/eolienne/feuilles1st_normal.png b/public/models/eolienne/feuilles1st_normal.png new file mode 100644 index 0000000..98f38fe --- /dev/null +++ b/public/models/eolienne/feuilles1st_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a37f8b5af1277ab6863943cd19340210dae7ee7727d2832edac1a465f793d7de +size 46561 diff --git a/public/models/eolienne/feuilles1st_normal_opengl.png b/public/models/eolienne/feuilles1st_normal_opengl.png new file mode 100644 index 0000000..b64245b --- /dev/null +++ b/public/models/eolienne/feuilles1st_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:172dd4a40c9342335f4b63534710090644048b5acbc282b0ce580f8f8dd40580 +size 52679 diff --git a/public/models/eolienne/feuilles1st_roughness.png b/public/models/eolienne/feuilles1st_roughness.png new file mode 100644 index 0000000..4ab879f --- /dev/null +++ b/public/models/eolienne/feuilles1st_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12e2e1b050172c55cf294c7b4293daa80e21c78845f2e75445d80005dde17280 +size 30413 diff --git a/public/models/eolienne/feuilles2nd_base_color.png b/public/models/eolienne/feuilles2nd_base_color.png new file mode 100644 index 0000000..8b3e32e --- /dev/null +++ b/public/models/eolienne/feuilles2nd_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5e34d6b6bbbcb80f6c5d5c2c08f4db322c46cb04599342d83eba0f8371189d2c +size 251469 diff --git a/public/models/eolienne/feuilles2nd_height.png b/public/models/eolienne/feuilles2nd_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/eolienne/feuilles2nd_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/eolienne/feuilles2nd_metallic.png b/public/models/eolienne/feuilles2nd_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/eolienne/feuilles2nd_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/eolienne/feuilles2nd_mixed_ao.png b/public/models/eolienne/feuilles2nd_mixed_ao.png new file mode 100644 index 0000000..5a3a553 --- /dev/null +++ b/public/models/eolienne/feuilles2nd_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53a1cec0d4bd061c1cc55e3e9aaae8794b21ddca9f67873a2a394f358b7cf0d6 +size 311566 diff --git a/public/models/eolienne/feuilles2nd_normal.png b/public/models/eolienne/feuilles2nd_normal.png new file mode 100644 index 0000000..f608b95 --- /dev/null +++ b/public/models/eolienne/feuilles2nd_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c30da93bc0ffa7f590568bcffa8eff1aacb301e190dee97edfa4e3423dd53b91 +size 50006 diff --git a/public/models/eolienne/feuilles2nd_normal_opengl.png b/public/models/eolienne/feuilles2nd_normal_opengl.png new file mode 100644 index 0000000..70b6927 --- /dev/null +++ b/public/models/eolienne/feuilles2nd_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:14511fa9847e7b22550a1babdc7b3fd92dd4bce4c37ed79ddddd565b720003e5 +size 55648 diff --git a/public/models/eolienne/feuilles2nd_roughness.png b/public/models/eolienne/feuilles2nd_roughness.png new file mode 100644 index 0000000..e1df83a --- /dev/null +++ b/public/models/eolienne/feuilles2nd_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c914892d63771015f4321d00daf5bb0893cb9652596e83f997997a43e1283ad3 +size 27279 diff --git a/public/models/eolienne/he_lisse_base_color.png b/public/models/eolienne/he_lisse_base_color.png new file mode 100644 index 0000000..18c7157 --- /dev/null +++ b/public/models/eolienne/he_lisse_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:545616d3ed16231900f5120616c6770a2d6dc9e0d64063085404ed58ff59d7ac +size 201972 diff --git a/public/models/eolienne/he_lisse_height.png b/public/models/eolienne/he_lisse_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/eolienne/he_lisse_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/eolienne/he_lisse_metallic.png b/public/models/eolienne/he_lisse_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/eolienne/he_lisse_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/eolienne/he_lisse_mixed_ao.png b/public/models/eolienne/he_lisse_mixed_ao.png new file mode 100644 index 0000000..c04344a --- /dev/null +++ b/public/models/eolienne/he_lisse_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15d8cb6b802231b5ed9c0632d06d9b5390302a7dbf689e293f504ff95e1ef17d +size 197880 diff --git a/public/models/eolienne/he_lisse_normal.png b/public/models/eolienne/he_lisse_normal.png new file mode 100644 index 0000000..9f5b774 --- /dev/null +++ b/public/models/eolienne/he_lisse_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ec43473f3a38dc95632aa7412bbae031cdb2b08dea899c23cf6f1208de2d60a +size 191989 diff --git a/public/models/eolienne/he_lisse_normal_opengl.png b/public/models/eolienne/he_lisse_normal_opengl.png new file mode 100644 index 0000000..1a26c7d --- /dev/null +++ b/public/models/eolienne/he_lisse_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5a0ebfd8a08a1e93f5d53ec0d353b46d9729fc9e480a6f9e46a866b877722548 +size 192990 diff --git a/public/models/eolienne/he_lisse_opacity.png b/public/models/eolienne/he_lisse_opacity.png new file mode 100644 index 0000000..c4a8c52 --- /dev/null +++ b/public/models/eolienne/he_lisse_opacity.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad2c1abbcdf7221a041209a10c946df6fd9d55513f21023de542e29547b93308 +size 3179 diff --git a/public/models/eolienne/he_lisse_roughness.png b/public/models/eolienne/he_lisse_roughness.png new file mode 100644 index 0000000..a54d620 --- /dev/null +++ b/public/models/eolienne/he_lisse_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0fe2c810ca9e68690d90cfc16dc13fb776a21198d431efd5920fb3a03ca6e8aa +size 66162 diff --git a/public/models/eolienne/height_cul.png b/public/models/eolienne/height_cul.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/eolienne/height_cul.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/eolienne/height_feuilles1st.png b/public/models/eolienne/height_feuilles1st.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/eolienne/height_feuilles1st.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/eolienne/height_feuilles2nd.png b/public/models/eolienne/height_feuilles2nd.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/eolienne/height_feuilles2nd.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/eolienne/height_he_lisse.png b/public/models/eolienne/height_he_lisse.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/eolienne/height_he_lisse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/eolienne/height_moteur.png b/public/models/eolienne/height_moteur.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/eolienne/height_moteur.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/eolienne/height_pied.png b/public/models/eolienne/height_pied.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/eolienne/height_pied.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/eolienne/height_tiges1st.png b/public/models/eolienne/height_tiges1st.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/eolienne/height_tiges1st.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/eolienne/height_tiges2nd.png b/public/models/eolienne/height_tiges2nd.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/eolienne/height_tiges2nd.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/eolienne/metalness_cul.png b/public/models/eolienne/metalness_cul.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/eolienne/metalness_cul.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/eolienne/metalness_feuilles1st.png b/public/models/eolienne/metalness_feuilles1st.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/eolienne/metalness_feuilles1st.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/eolienne/metalness_feuilles2nd.png b/public/models/eolienne/metalness_feuilles2nd.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/eolienne/metalness_feuilles2nd.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/eolienne/metalness_he_lisse.png b/public/models/eolienne/metalness_he_lisse.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/eolienne/metalness_he_lisse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/eolienne/metalness_moteur.png b/public/models/eolienne/metalness_moteur.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/eolienne/metalness_moteur.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/eolienne/metalness_pied.png b/public/models/eolienne/metalness_pied.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/eolienne/metalness_pied.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/eolienne/metalness_tiges1st.png b/public/models/eolienne/metalness_tiges1st.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/eolienne/metalness_tiges1st.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/eolienne/metalness_tiges2nd.png b/public/models/eolienne/metalness_tiges2nd.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/eolienne/metalness_tiges2nd.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/eolienne/model.gltf b/public/models/eolienne/model.gltf new file mode 100644 index 0000000..87bda2b --- /dev/null +++ b/public/models/eolienne/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa68d5c4ff193351bd21b2d42a6b6d0d0983d66019c3344082a5210a00c036a1 +size 7667190 diff --git a/public/models/eolienne/moteur_base_color.png b/public/models/eolienne/moteur_base_color.png new file mode 100644 index 0000000..163565f --- /dev/null +++ b/public/models/eolienne/moteur_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:943b1c48b08b499fcd49eb28137cd5f669f435fcb4daa643e42b897bc4b012c2 +size 413119 diff --git a/public/models/eolienne/moteur_height.png b/public/models/eolienne/moteur_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/eolienne/moteur_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/eolienne/moteur_metallic.png b/public/models/eolienne/moteur_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/eolienne/moteur_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/eolienne/moteur_mixed_ao.png b/public/models/eolienne/moteur_mixed_ao.png new file mode 100644 index 0000000..4eb59ed --- /dev/null +++ b/public/models/eolienne/moteur_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:988de71cd3caf14138f2b85146371edbaf59cb898a285c5e965271663a8879d0 +size 207624 diff --git a/public/models/eolienne/moteur_normal.png b/public/models/eolienne/moteur_normal.png new file mode 100644 index 0000000..f9c8d9c --- /dev/null +++ b/public/models/eolienne/moteur_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fcfeeb8fcf3ce4c04d1eb7e5e59fa5277b452943bc9432daca69d7549514c56b +size 212873 diff --git a/public/models/eolienne/moteur_normal_opengl.png b/public/models/eolienne/moteur_normal_opengl.png new file mode 100644 index 0000000..d5de202 --- /dev/null +++ b/public/models/eolienne/moteur_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d3f3ff93fb1f2fc595a7ca5801f3d45caeca5df261277625f2947f1d8ad9d3c +size 212505 diff --git a/public/models/eolienne/moteur_roughness.png b/public/models/eolienne/moteur_roughness.png new file mode 100644 index 0000000..1de9094 --- /dev/null +++ b/public/models/eolienne/moteur_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf3c8800dc70982300822307941260c5a7d848a041ba6f9746ba8450d6870f02 +size 100105 diff --git a/public/models/eolienne/pied_base_color.png b/public/models/eolienne/pied_base_color.png new file mode 100644 index 0000000..7fcdd16 --- /dev/null +++ b/public/models/eolienne/pied_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93620500fac2ad4d84a1917da89a2d19c9d040e709faea358e4331e0a051715d +size 311741 diff --git a/public/models/eolienne/pied_height.png b/public/models/eolienne/pied_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/eolienne/pied_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/eolienne/pied_metallic.png b/public/models/eolienne/pied_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/eolienne/pied_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/eolienne/pied_mixed_ao.png b/public/models/eolienne/pied_mixed_ao.png new file mode 100644 index 0000000..a4ee06c --- /dev/null +++ b/public/models/eolienne/pied_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:561c48e222a3e98d39aeea3e05e43b80787aa955ae499f0b612bf40a845c19e4 +size 245569 diff --git a/public/models/eolienne/pied_normal.png b/public/models/eolienne/pied_normal.png new file mode 100644 index 0000000..0b3d48a --- /dev/null +++ b/public/models/eolienne/pied_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c11d1ece99eed332e974d8fd51cfcee497380c22108a0998ade0fd8986647fa4 +size 274501 diff --git a/public/models/eolienne/pied_normal_opengl.png b/public/models/eolienne/pied_normal_opengl.png new file mode 100644 index 0000000..9c287a1 --- /dev/null +++ b/public/models/eolienne/pied_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:325fe9a2fa966fac89d5f62b4c5ba0df245ed265d2468357a3d3b412a3281be7 +size 274643 diff --git a/public/models/eolienne/pied_roughness.png b/public/models/eolienne/pied_roughness.png new file mode 100644 index 0000000..9ce7107 --- /dev/null +++ b/public/models/eolienne/pied_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cae97f2a492e39eebc1e323fbf38b80b9ad65ab00d44dc0b4268f7df907cc193 +size 109661 diff --git a/public/models/eolienne/tiges1st_base_color.png b/public/models/eolienne/tiges1st_base_color.png new file mode 100644 index 0000000..f49ec72 --- /dev/null +++ b/public/models/eolienne/tiges1st_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1a939182dac29e0439daea6270c9ab040adf3b0b95e6842911a5614715c0844 +size 130621 diff --git a/public/models/eolienne/tiges1st_height.png b/public/models/eolienne/tiges1st_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/eolienne/tiges1st_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/eolienne/tiges1st_metallic.png b/public/models/eolienne/tiges1st_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/eolienne/tiges1st_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/eolienne/tiges1st_mixed_ao.png b/public/models/eolienne/tiges1st_mixed_ao.png new file mode 100644 index 0000000..09e2f33 --- /dev/null +++ b/public/models/eolienne/tiges1st_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09bbb9842790097009510c5680db7141a56f92b9a6d0661544413bc010a4510e +size 98982 diff --git a/public/models/eolienne/tiges1st_normal.png b/public/models/eolienne/tiges1st_normal.png new file mode 100644 index 0000000..d7fabee --- /dev/null +++ b/public/models/eolienne/tiges1st_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:362b758d3732454f73665ac5f3ef163ac123726e6bc0f927f010ba17666b85de +size 150651 diff --git a/public/models/eolienne/tiges1st_normal_opengl.png b/public/models/eolienne/tiges1st_normal_opengl.png new file mode 100644 index 0000000..cada0f7 --- /dev/null +++ b/public/models/eolienne/tiges1st_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:67472d13674b8dc0dacd4e097c5a152649a85f22e1ec3cd3680ef965aa0befb3 +size 151985 diff --git a/public/models/eolienne/tiges1st_roughness.png b/public/models/eolienne/tiges1st_roughness.png new file mode 100644 index 0000000..4439c84 --- /dev/null +++ b/public/models/eolienne/tiges1st_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7be021f31d6abb7cd71c1404af92f0a5567763a79fa1199feadc4267e2a4cb94 +size 44279 diff --git a/public/models/eolienne/tiges2nd_base_color.png b/public/models/eolienne/tiges2nd_base_color.png new file mode 100644 index 0000000..99cd3d9 --- /dev/null +++ b/public/models/eolienne/tiges2nd_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94d7d4c073d4a31dedf92d519582b3136c03f0ddc1062d186974d47fa18cced1 +size 389344 diff --git a/public/models/eolienne/tiges2nd_height.png b/public/models/eolienne/tiges2nd_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/eolienne/tiges2nd_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/eolienne/tiges2nd_metallic.png b/public/models/eolienne/tiges2nd_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/eolienne/tiges2nd_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/eolienne/tiges2nd_mixed_ao.png b/public/models/eolienne/tiges2nd_mixed_ao.png new file mode 100644 index 0000000..042822d --- /dev/null +++ b/public/models/eolienne/tiges2nd_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4e1cc7ab7b893b2f2f09b51f664222a9067bc985b7bcd5f2caff43d0e940f0d +size 547796 diff --git a/public/models/eolienne/tiges2nd_normal.png b/public/models/eolienne/tiges2nd_normal.png new file mode 100644 index 0000000..4662e58 --- /dev/null +++ b/public/models/eolienne/tiges2nd_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e441130d64f0b3a3385568e6e44a9b3e041a698ed64a0c3aed308c529239c370 +size 587352 diff --git a/public/models/eolienne/tiges2nd_normal_opengl.png b/public/models/eolienne/tiges2nd_normal_opengl.png new file mode 100644 index 0000000..82d406f --- /dev/null +++ b/public/models/eolienne/tiges2nd_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8eb363a42322e801e25cb08d957164c72bcf9110f84551899042b0ca0d554c38 +size 596706 diff --git a/public/models/eolienne/tiges2nd_roughness.png b/public/models/eolienne/tiges2nd_roughness.png new file mode 100644 index 0000000..3dfc0a1 --- /dev/null +++ b/public/models/eolienne/tiges2nd_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27563b099d877a21dcbe23c99ae000dff2a3cdac72c084d51423692d10ce19a6 +size 126408 diff --git a/public/models/fermeverticale/ferme verticale.bin b/public/models/fermeverticale/ferme verticale.bin new file mode 100644 index 0000000..69ed088 --- /dev/null +++ b/public/models/fermeverticale/ferme verticale.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5cc8a6bba1b4ccaab30e04e4777963b5a751dbf9b8bba023609b5e9663c88423 +size 15648 diff --git a/public/models/fermeverticale/fermeverticale_baseColor.png b/public/models/fermeverticale/fermeverticale_baseColor.png new file mode 100644 index 0000000..818c751 --- /dev/null +++ b/public/models/fermeverticale/fermeverticale_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:daf907f69c82779b518b3beaebd298a3c5cd49f2abe97c3d7bac5635652e2d2c +size 1360951 diff --git a/public/models/fermeverticale/fermeverticale_normal.png b/public/models/fermeverticale/fermeverticale_normal.png new file mode 100644 index 0000000..01e3b69 --- /dev/null +++ b/public/models/fermeverticale/fermeverticale_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65d36f3571000ab4b2710486ee80a933bc1c13de4c5eb911794ca812d585f445 +size 2708830 diff --git a/public/models/fermeverticale/fermeverticale_occlusionRoughnessMetallic.png b/public/models/fermeverticale/fermeverticale_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..1055413 --- /dev/null +++ b/public/models/fermeverticale/fermeverticale_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6933f6afbcde5115950eb83878ac2be045e450d9a05f81d252a32e98e12f9cd3 +size 1182025 diff --git a/public/models/fermeverticale/model.gltf b/public/models/fermeverticale/model.gltf new file mode 100644 index 0000000..9467409 --- /dev/null +++ b/public/models/fermeverticale/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7696150952db561388cfc959f6506460776a5216cfa233679e176174be29059 +size 3226 diff --git a/public/models/fermier/defaultmaterial_basecolor.png b/public/models/fermier/defaultmaterial_basecolor.png new file mode 100644 index 0000000..8b84835 --- /dev/null +++ b/public/models/fermier/defaultmaterial_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7aa240560fc4e379098c14492577be668a24f021ef03e49af790e91bdb108fa3 +size 791788 diff --git a/public/models/fermier/defaultmaterial_normal.png b/public/models/fermier/defaultmaterial_normal.png new file mode 100644 index 0000000..378a5d7 --- /dev/null +++ b/public/models/fermier/defaultmaterial_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:37290badb8d3112676e42ab34ea64576407eaece66399cac992fca791aa3e8ce +size 3383876 diff --git a/public/models/fermier/defaultmaterial_occlusionroughnessmetallic.png b/public/models/fermier/defaultmaterial_occlusionroughnessmetallic.png new file mode 100644 index 0000000..65ce6be --- /dev/null +++ b/public/models/fermier/defaultmaterial_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d1305efe72137b5c013ffefc8d6ef26b2a256d4496238770bb37d943c21e132e +size 762856 diff --git a/public/models/fermier/model.gltf b/public/models/fermier/model.gltf new file mode 100644 index 0000000..01e08d4 --- /dev/null +++ b/public/models/fermier/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1faa8f43d3026dc0a49e52be425539ba761793cda4fe24a421004af5d44da4b7 +size 3146 diff --git a/public/models/galet/galet_basecolor.png b/public/models/galet/galet_basecolor.png new file mode 100644 index 0000000..a20f7df --- /dev/null +++ b/public/models/galet/galet_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d5d5745b6a621268d1d3d4e6da45c1b92c946ef8c43a865493bae855844c547f +size 492995 diff --git a/public/models/galet/galet_normal.png b/public/models/galet/galet_normal.png new file mode 100644 index 0000000..d8f29af --- /dev/null +++ b/public/models/galet/galet_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:044bed9c465d55e5be571862e46aaf5f48172a8572665286068bd005847a5f17 +size 2613811 diff --git a/public/models/galet/galet_occlusionroughnessmetallic.png b/public/models/galet/galet_occlusionroughnessmetallic.png new file mode 100644 index 0000000..f262ab4 --- /dev/null +++ b/public/models/galet/galet_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:137ce434f528bd56a3a5eabc339173c5e8fb4f9306fb0ca624d996ee90b8d1f8 +size 16902 diff --git a/public/models/galet/model.gltf b/public/models/galet/model.gltf new file mode 100644 index 0000000..e2324f3 --- /dev/null +++ b/public/models/galet/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15a4dcd7c5faf03913dd79f1ebbc0970c9db4f2733c36dcf53bb5ef652974c9c +size 3495 diff --git a/public/models/gant_l/gant_basecolor.png b/public/models/gant_l/gant_basecolor.png new file mode 100644 index 0000000..51d12c4 --- /dev/null +++ b/public/models/gant_l/gant_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99011cfdde0fed73e7d8927bce22f38a4f33decf00ccf6eaaa2aadc5ef940b4f +size 330807 diff --git a/public/models/gant_l/gant_normal.png b/public/models/gant_l/gant_normal.png new file mode 100644 index 0000000..95e5e61 --- /dev/null +++ b/public/models/gant_l/gant_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82a45f350f230fafcd51c9e19db9f7cab4b86f08cb9b46ce9529517e17c53046 +size 2937255 diff --git a/public/models/gant_l/gant_occlusionroughnessmetallic.png b/public/models/gant_l/gant_occlusionroughnessmetallic.png new file mode 100644 index 0000000..f262ab4 --- /dev/null +++ b/public/models/gant_l/gant_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:137ce434f528bd56a3a5eabc339173c5e8fb4f9306fb0ca624d996ee90b8d1f8 +size 16902 diff --git a/public/models/gant_l/hanf_l.bin b/public/models/gant_l/hanf_l.bin new file mode 100644 index 0000000..56ed2f6 --- /dev/null +++ b/public/models/gant_l/hanf_l.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47a09e932f77bcd6d621caefd216ba3347b7ba3b3ccafad4d321d45bcb58eadf +size 486972 diff --git a/public/models/gant_l/model.gltf b/public/models/gant_l/model.gltf new file mode 100644 index 0000000..da03db6 --- /dev/null +++ b/public/models/gant_l/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01cdac724dfe936d112bd19202694a16196f54b6726b9e7e4e5102235fd41980 +size 10303 diff --git a/public/models/gant_l_pad/galet_basecolor.png b/public/models/gant_l_pad/galet_basecolor.png new file mode 100644 index 0000000..33f9861 --- /dev/null +++ b/public/models/gant_l_pad/galet_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8230f08a07b4a5cad22e68c563192a664741db2eaa9c6ac481b7b6e2c1f00a5 +size 492994 diff --git a/public/models/gant_l_pad/galet_normal.png b/public/models/gant_l_pad/galet_normal.png new file mode 100644 index 0000000..d8f29af --- /dev/null +++ b/public/models/gant_l_pad/galet_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:044bed9c465d55e5be571862e46aaf5f48172a8572665286068bd005847a5f17 +size 2613811 diff --git a/public/models/gant_l_pad/galet_occlusionroughnessmetallic.png b/public/models/gant_l_pad/galet_occlusionroughnessmetallic.png new file mode 100644 index 0000000..f262ab4 --- /dev/null +++ b/public/models/gant_l_pad/galet_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:137ce434f528bd56a3a5eabc339173c5e8fb4f9306fb0ca624d996ee90b8d1f8 +size 16902 diff --git a/public/models/gant_l_pad/gant_basecolor.png b/public/models/gant_l_pad/gant_basecolor.png new file mode 100644 index 0000000..51d12c4 --- /dev/null +++ b/public/models/gant_l_pad/gant_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99011cfdde0fed73e7d8927bce22f38a4f33decf00ccf6eaaa2aadc5ef940b4f +size 330807 diff --git a/public/models/gant_l_pad/gant_normal.png b/public/models/gant_l_pad/gant_normal.png new file mode 100644 index 0000000..95e5e61 --- /dev/null +++ b/public/models/gant_l_pad/gant_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82a45f350f230fafcd51c9e19db9f7cab4b86f08cb9b46ce9529517e17c53046 +size 2937255 diff --git a/public/models/gant_l_pad/gant_occlusionroughnessmetallic.png b/public/models/gant_l_pad/gant_occlusionroughnessmetallic.png new file mode 100644 index 0000000..f262ab4 --- /dev/null +++ b/public/models/gant_l_pad/gant_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:137ce434f528bd56a3a5eabc339173c5e8fb4f9306fb0ca624d996ee90b8d1f8 +size 16902 diff --git a/public/models/gants/gants.bin b/public/models/gant_l_pad/gants.bin similarity index 100% rename from public/models/gants/gants.bin rename to public/models/gant_l_pad/gants.bin diff --git a/public/models/gant_l_pad/model.gltf b/public/models/gant_l_pad/model.gltf new file mode 100644 index 0000000..846cf49 --- /dev/null +++ b/public/models/gant_l_pad/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fee94fb22e76ebc51ebc30fdd9415eb7db02f4298355965d99889b4329301393 +size 6192 diff --git a/public/models/gant_r/galet_baseColor.png b/public/models/gant_r/galet_baseColor.png new file mode 100644 index 0000000..33f9861 --- /dev/null +++ b/public/models/gant_r/galet_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8230f08a07b4a5cad22e68c563192a664741db2eaa9c6ac481b7b6e2c1f00a5 +size 492994 diff --git a/public/models/gant_r/galet_normal.png b/public/models/gant_r/galet_normal.png new file mode 100644 index 0000000..d8f29af --- /dev/null +++ b/public/models/gant_r/galet_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:044bed9c465d55e5be571862e46aaf5f48172a8572665286068bd005847a5f17 +size 2613811 diff --git a/public/models/gant_r/galet_occlusionRoughnessMetallic.png b/public/models/gant_r/galet_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..f262ab4 --- /dev/null +++ b/public/models/gant_r/galet_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:137ce434f528bd56a3a5eabc339173c5e8fb4f9306fb0ca624d996ee90b8d1f8 +size 16902 diff --git a/public/models/gant_r/gant_basecolor.png b/public/models/gant_r/gant_basecolor.png new file mode 100644 index 0000000..51d12c4 --- /dev/null +++ b/public/models/gant_r/gant_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99011cfdde0fed73e7d8927bce22f38a4f33decf00ccf6eaaa2aadc5ef940b4f +size 330807 diff --git a/public/models/gant_r/gant_normal.png b/public/models/gant_r/gant_normal.png new file mode 100644 index 0000000..95e5e61 --- /dev/null +++ b/public/models/gant_r/gant_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82a45f350f230fafcd51c9e19db9f7cab4b86f08cb9b46ce9529517e17c53046 +size 2937255 diff --git a/public/models/gant_r/gant_occlusionroughnessmetallic.png b/public/models/gant_r/gant_occlusionroughnessmetallic.png new file mode 100644 index 0000000..f262ab4 --- /dev/null +++ b/public/models/gant_r/gant_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:137ce434f528bd56a3a5eabc339173c5e8fb4f9306fb0ca624d996ee90b8d1f8 +size 16902 diff --git a/public/models/gant_r/model.bin b/public/models/gant_r/model.bin new file mode 100644 index 0000000..ddaf087 --- /dev/null +++ b/public/models/gant_r/model.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94caa72fe32b36c373174f83aad4658df02ddd55de862b5f62357e879597b592 +size 1384136 diff --git a/public/models/gant_r/model.glb b/public/models/gant_r/model.glb new file mode 100644 index 0000000..bd52ef8 --- /dev/null +++ b/public/models/gant_r/model.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09384178466e1dc10ae2db681655117d34ee8010a06a469cc07c9078bfaf512b +size 7815820 diff --git a/public/models/gant_r/model.gltf b/public/models/gant_r/model.gltf new file mode 100644 index 0000000..3618596 --- /dev/null +++ b/public/models/gant_r/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c82eb9596e0829193b8c860670ff9cad959dfcced8d17183c2347346870d267b +size 31499 diff --git a/public/models/gant_r_pad/galet_basecolor.png b/public/models/gant_r_pad/galet_basecolor.png new file mode 100644 index 0000000..33f9861 --- /dev/null +++ b/public/models/gant_r_pad/galet_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8230f08a07b4a5cad22e68c563192a664741db2eaa9c6ac481b7b6e2c1f00a5 +size 492994 diff --git a/public/models/gant_r_pad/galet_normal.png b/public/models/gant_r_pad/galet_normal.png new file mode 100644 index 0000000..d8f29af --- /dev/null +++ b/public/models/gant_r_pad/galet_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:044bed9c465d55e5be571862e46aaf5f48172a8572665286068bd005847a5f17 +size 2613811 diff --git a/public/models/gant_r_pad/galet_occlusionroughnessmetallic.png b/public/models/gant_r_pad/galet_occlusionroughnessmetallic.png new file mode 100644 index 0000000..f262ab4 --- /dev/null +++ b/public/models/gant_r_pad/galet_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:137ce434f528bd56a3a5eabc339173c5e8fb4f9306fb0ca624d996ee90b8d1f8 +size 16902 diff --git a/public/models/gant_r_pad/gant_basecolor.png b/public/models/gant_r_pad/gant_basecolor.png new file mode 100644 index 0000000..51d12c4 --- /dev/null +++ b/public/models/gant_r_pad/gant_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99011cfdde0fed73e7d8927bce22f38a4f33decf00ccf6eaaa2aadc5ef940b4f +size 330807 diff --git a/public/models/gant_r_pad/gant_normal.png b/public/models/gant_r_pad/gant_normal.png new file mode 100644 index 0000000..95e5e61 --- /dev/null +++ b/public/models/gant_r_pad/gant_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:82a45f350f230fafcd51c9e19db9f7cab4b86f08cb9b46ce9529517e17c53046 +size 2937255 diff --git a/public/models/gant_r_pad/gant_occlusionroughnessmetallic.png b/public/models/gant_r_pad/gant_occlusionroughnessmetallic.png new file mode 100644 index 0000000..f262ab4 --- /dev/null +++ b/public/models/gant_r_pad/gant_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:137ce434f528bd56a3a5eabc339173c5e8fb4f9306fb0ca624d996ee90b8d1f8 +size 16902 diff --git a/public/models/gant_r_pad/model.gltf b/public/models/gant_r_pad/model.gltf new file mode 100644 index 0000000..ade1881 --- /dev/null +++ b/public/models/gant_r_pad/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e4e97e95e1f38f6d76cc49e28e9a10d4d5d0e703511018e5933548faca3cd67b +size 6900 diff --git a/public/models/gerant/defaultmaterial_base_color.png b/public/models/gerant/defaultmaterial_base_color.png new file mode 100644 index 0000000..d87452f --- /dev/null +++ b/public/models/gerant/defaultmaterial_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc495d4822681d079139c794303c93aa6465f10b9cdf6e958f5b89c5932d2eb3 +size 834657 diff --git a/public/models/gerant/defaultmaterial_basecolor.png b/public/models/gerant/defaultmaterial_basecolor.png new file mode 100644 index 0000000..ecb4e45 --- /dev/null +++ b/public/models/gerant/defaultmaterial_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:531aaf4d7871c30e05cdc45a8bb665dcf1a101cfb4ff5c182af3384c18c03e21 +size 839128 diff --git a/public/models/gerant/defaultmaterial_height.png b/public/models/gerant/defaultmaterial_height.png new file mode 100644 index 0000000..30158eb --- /dev/null +++ b/public/models/gerant/defaultmaterial_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f1cc29dfc5b14bbf16af1fd36e461e0b5bb3936fdddaf2807b56b4c2e9f71ee8 +size 12819 diff --git a/public/models/gerant/defaultmaterial_metallic.png b/public/models/gerant/defaultmaterial_metallic.png new file mode 100644 index 0000000..42f1206 --- /dev/null +++ b/public/models/gerant/defaultmaterial_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b0d3feb024b0cea2d5d8d2aee54bc18eaed203e166a9f53b5455b66e3e0f9d3 +size 238091 diff --git a/public/models/gerant/defaultmaterial_normal.png b/public/models/gerant/defaultmaterial_normal.png new file mode 100644 index 0000000..075e61b --- /dev/null +++ b/public/models/gerant/defaultmaterial_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8509d8874bbab587777f149efbde35c88201c56b6b452f17a793d4afce8320e6 +size 3446765 diff --git a/public/models/gerant/defaultmaterial_normal_opengl.png b/public/models/gerant/defaultmaterial_normal_opengl.png new file mode 100644 index 0000000..6c17dbb --- /dev/null +++ b/public/models/gerant/defaultmaterial_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6f0b5352703be3e02c5ae8ed00462168052c58b2dae8255829fcd960c8accaf9 +size 7201168 diff --git a/public/models/gerant/defaultmaterial_occlusionroughnessmetallic.png b/public/models/gerant/defaultmaterial_occlusionroughnessmetallic.png new file mode 100644 index 0000000..d0b5bd5 --- /dev/null +++ b/public/models/gerant/defaultmaterial_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:097dbffd0cbc2290359072e275c5d9979638bb8907bd12feeed17498ba5a0e42 +size 912914 diff --git a/public/models/gerant/defaultmaterial_roughness.png b/public/models/gerant/defaultmaterial_roughness.png new file mode 100644 index 0000000..f27a80c --- /dev/null +++ b/public/models/gerant/defaultmaterial_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:49db8c795dd162186490fd639c600c85cfdbaf6dac2a9b9b2f7a3eb3262098e2 +size 571947 diff --git a/public/models/gerant/model.gltf b/public/models/gerant/model.gltf new file mode 100644 index 0000000..bba9e92 --- /dev/null +++ b/public/models/gerant/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:143af47426c600085097223fb27f7ac8f3ab2e23071b90cda6840f5eabef7a62 +size 3141 diff --git a/public/models/immeuble1/fenetre_baseColor.png b/public/models/immeuble1/fenetre_baseColor.png new file mode 100644 index 0000000..e9ff418 --- /dev/null +++ b/public/models/immeuble1/fenetre_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0333ccfd6a8b93765faa75b9e4de74219c2c9aea6322d2739179d46a4a428599 +size 438684 diff --git a/public/models/immeuble1/fenetre_normal.png b/public/models/immeuble1/fenetre_normal.png new file mode 100644 index 0000000..2162385 --- /dev/null +++ b/public/models/immeuble1/fenetre_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ec655e8917d20496f4b817e683644be638bd6ce8dda607257a7873edb974d82f +size 2152600 diff --git a/public/models/immeuble1/fenetre_occlusionRoughnessMetallic.png b/public/models/immeuble1/fenetre_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..b70c3be --- /dev/null +++ b/public/models/immeuble1/fenetre_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6171b80ff86434c9aca5dd7432bd02124b7a794d747084512dca66ed33b1fbf4 +size 156923 diff --git a/public/models/immeuble1/immeuble1.bin b/public/models/immeuble1/immeuble1.bin new file mode 100644 index 0000000..818eace --- /dev/null +++ b/public/models/immeuble1/immeuble1.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e047ba0f4242c619be71a33482914a9baa747fb53bf630facddb49d15a2bd214 +size 280656 diff --git a/public/models/immeuble1/maison_baseColor.png b/public/models/immeuble1/maison_baseColor.png new file mode 100644 index 0000000..1129d97 --- /dev/null +++ b/public/models/immeuble1/maison_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47a4bb98cf55e631dde6454338a21a18e8001427b605b0ef1456a438aafdfed1 +size 1342311 diff --git a/public/models/immeuble1/maison_normal.png b/public/models/immeuble1/maison_normal.png new file mode 100644 index 0000000..43f7096 --- /dev/null +++ b/public/models/immeuble1/maison_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d6666c7bc78a0c0d44239e831feba5c89c0b59b6a2ecd91029e15a733718267 +size 3387063 diff --git a/public/models/immeuble1/maison_occlusionRoughnessMetallic.png b/public/models/immeuble1/maison_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..d3f60a9 --- /dev/null +++ b/public/models/immeuble1/maison_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6c00c1afbaf784c4ee1fecaaa1d0ce70179151786ff4076e16ad6f85076b786c +size 847795 diff --git a/public/models/immeuble1/model.gltf b/public/models/immeuble1/model.gltf new file mode 100644 index 0000000..61bdca2 --- /dev/null +++ b/public/models/immeuble1/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:12038659fd8f1f307b3944dd85bb49b7dbae7d4d743ac2691cf8799ce28d2289 +size 21200262 diff --git a/public/models/immeuble1/panneau_baseColor.png b/public/models/immeuble1/panneau_baseColor.png new file mode 100644 index 0000000..612d3f2 --- /dev/null +++ b/public/models/immeuble1/panneau_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5395a39476a7b70e41ddbebf59ee9708ffe47ca394e335c0eef6c8d75593a545 +size 1694296 diff --git a/public/models/immeuble1/panneau_normal.png b/public/models/immeuble1/panneau_normal.png new file mode 100644 index 0000000..f84126e --- /dev/null +++ b/public/models/immeuble1/panneau_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f56909948a9d0a6a9cb54f0a6954a7261d3a22278a6f1898dd043c6bd8f8e076 +size 2114513 diff --git a/public/models/immeuble1/panneau_occlusionRoughnessMetallic.png b/public/models/immeuble1/panneau_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..7f9d8a3 --- /dev/null +++ b/public/models/immeuble1/panneau_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:967588a06b49fd51fb96e13bd87371586de467a2ca4d68e83f59e58abc51f928 +size 16902 diff --git a/public/models/immeuble1/porte_baseColor.png b/public/models/immeuble1/porte_baseColor.png new file mode 100644 index 0000000..10a3e61 --- /dev/null +++ b/public/models/immeuble1/porte_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2fa0656f9c2b5e5d9ebf00b4fbd53367ae94e394529599dda2b3fc85bfa2dcc8 +size 18733 diff --git a/public/models/immeuble1/porte_normal.png b/public/models/immeuble1/porte_normal.png new file mode 100644 index 0000000..7d38fd6 --- /dev/null +++ b/public/models/immeuble1/porte_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:87ad68ab55f27a0cf8e33899831521af30fbc323414df48f548532830328fd93 +size 1863657 diff --git a/public/models/immeuble1/porte_occlusionRoughnessMetallic.png b/public/models/immeuble1/porte_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..3a0a7ca --- /dev/null +++ b/public/models/immeuble1/porte_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8e5ccad40ed15664a16bcb6b3668a306f51d9fec1a580797a5afd9f8f0872a2 +size 20423 diff --git a/public/models/lafabrik/anneaux_base_color.png b/public/models/lafabrik/anneaux_base_color.png new file mode 100644 index 0000000..2fbdd54 --- /dev/null +++ b/public/models/lafabrik/anneaux_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53f37341d07663c2a9572d29dcade18e8b91ba32656578b359214d402ac47df8 +size 29467 diff --git a/public/models/lafabrik/anneaux_basecolor.png b/public/models/lafabrik/anneaux_basecolor.png new file mode 100644 index 0000000..cc33c8b --- /dev/null +++ b/public/models/lafabrik/anneaux_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f73e6bfe28e93608d9a6edcd105448cb34d96515b2a918a4e0fece15b814468 +size 532789 diff --git a/public/models/lafabrik/anneaux_height.png b/public/models/lafabrik/anneaux_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/anneaux_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/anneaux_metallic.png b/public/models/lafabrik/anneaux_metallic.png new file mode 100644 index 0000000..9384d55 --- /dev/null +++ b/public/models/lafabrik/anneaux_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7ffded4f64bceb29f858e3f9462813f9d774174aca87ff7c49277bb37bf5e923 +size 12819 diff --git a/public/models/lafabrik/anneaux_mixed_ao.png b/public/models/lafabrik/anneaux_mixed_ao.png new file mode 100644 index 0000000..b30ee0f --- /dev/null +++ b/public/models/lafabrik/anneaux_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dee7c471c5cc3dafe941065326003df584b1256c5dfbd646a4f1a83faa91426d +size 520611 diff --git a/public/models/lafabrik/anneaux_normal.png b/public/models/lafabrik/anneaux_normal.png new file mode 100644 index 0000000..1e89761 --- /dev/null +++ b/public/models/lafabrik/anneaux_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d457c6ff4fbebf0c5b45480891a16a224140663026ad4a166ef22934af76dff6 +size 2829035 diff --git a/public/models/lafabrik/anneaux_normal_opengl.png b/public/models/lafabrik/anneaux_normal_opengl.png new file mode 100644 index 0000000..648f914 --- /dev/null +++ b/public/models/lafabrik/anneaux_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2394e539f3a4a3f8e52eafe30cb54ba5147b262d473ca1c66b3a71be99f4908 +size 475520 diff --git a/public/models/lafabrik/anneaux_occlusionroughnessmetallic.png b/public/models/lafabrik/anneaux_occlusionroughnessmetallic.png new file mode 100644 index 0000000..244620e --- /dev/null +++ b/public/models/lafabrik/anneaux_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90971d6a4d158daa5f19634d7c0b1e30af7891210415727de2828f55537a18c7 +size 1105974 diff --git a/public/models/lafabrik/anneaux_roughness.png b/public/models/lafabrik/anneaux_roughness.png new file mode 100644 index 0000000..f3dd692 --- /dev/null +++ b/public/models/lafabrik/anneaux_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:428157d1d553d359d25696ec5cdebb0a191dccc08b513f6f8a0a08edccadd8bf +size 12819 diff --git a/public/models/lafabrik/bat_base_color.png b/public/models/lafabrik/bat_base_color.png new file mode 100644 index 0000000..7c6dd4f --- /dev/null +++ b/public/models/lafabrik/bat_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8fbb61332773aff8ee65fab755abce883996654c11f4ce40e6ce66d8e2a937de +size 1728398 diff --git a/public/models/lafabrik/bat_basecolor.png b/public/models/lafabrik/bat_basecolor.png new file mode 100644 index 0000000..6a780f4 --- /dev/null +++ b/public/models/lafabrik/bat_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:be2e62b2e7a3c9a17c4898f6f9d29ca702196d500571635ae031cb2e377ca23a +size 1210857 diff --git a/public/models/lafabrik/bat_height.png b/public/models/lafabrik/bat_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/bat_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/bat_metallic.png b/public/models/lafabrik/bat_metallic.png new file mode 100644 index 0000000..353dceb --- /dev/null +++ b/public/models/lafabrik/bat_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537c59bf6206c8a29d89a0f0433ae285254a2b7deac15ba730f547b6d678ca33 +size 8243 diff --git a/public/models/lafabrik/bat_mixed_ao.png b/public/models/lafabrik/bat_mixed_ao.png new file mode 100644 index 0000000..7df491c --- /dev/null +++ b/public/models/lafabrik/bat_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f724b7d24a420bdd99df5ec6baebacaa8442b1e84db034cb3390425b58deca9c +size 755091 diff --git a/public/models/lafabrik/bat_normal.png b/public/models/lafabrik/bat_normal.png new file mode 100644 index 0000000..52e5c50 --- /dev/null +++ b/public/models/lafabrik/bat_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a4dbe8b4a0b23bf5b5e44bc88e86ee5a92e157a39670c690ebe7f548a7a82ad +size 2403625 diff --git a/public/models/lafabrik/bat_normal_opengl.png b/public/models/lafabrik/bat_normal_opengl.png new file mode 100644 index 0000000..2c74cb7 --- /dev/null +++ b/public/models/lafabrik/bat_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:457844aaf45faafa9dd538839648e1bd88c4e9b0c544ad7d112b857dced44952 +size 733512 diff --git a/public/models/lafabrik/bat_occlusionroughnessmetallic.png b/public/models/lafabrik/bat_occlusionroughnessmetallic.png new file mode 100644 index 0000000..f3de26a --- /dev/null +++ b/public/models/lafabrik/bat_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:629b883b0c7f3d1d7da370d3204dbe3fe63616c42ea4f8fe2794b9660a9f80bb +size 1277896 diff --git a/public/models/lafabrik/bat_roughness.png b/public/models/lafabrik/bat_roughness.png new file mode 100644 index 0000000..052f3b1 --- /dev/null +++ b/public/models/lafabrik/bat_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4b2972c7d79f72f8cc484a0b45075325a2b61cc09ea59e4867f01b749a57d66 +size 172975 diff --git a/public/models/lafabrik/comptoir_base_color.png b/public/models/lafabrik/comptoir_base_color.png new file mode 100644 index 0000000..d86eeef --- /dev/null +++ b/public/models/lafabrik/comptoir_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1aa545d402e5f8fe8da5016a3c56f07bf5bc028923c5267fbd81b19b4cfdf278 +size 2863835 diff --git a/public/models/lafabrik/comptoir_basecolor.png b/public/models/lafabrik/comptoir_basecolor.png new file mode 100644 index 0000000..2c9c9da --- /dev/null +++ b/public/models/lafabrik/comptoir_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce482f3dedea2e359f7ad7ca342405a2bc39fa06e4ed5a40153421974810219e +size 2163973 diff --git a/public/models/lafabrik/comptoir_height.png b/public/models/lafabrik/comptoir_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/comptoir_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/comptoir_metallic.png b/public/models/lafabrik/comptoir_metallic.png new file mode 100644 index 0000000..353dceb --- /dev/null +++ b/public/models/lafabrik/comptoir_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537c59bf6206c8a29d89a0f0433ae285254a2b7deac15ba730f547b6d678ca33 +size 8243 diff --git a/public/models/lafabrik/comptoir_mixed_ao.png b/public/models/lafabrik/comptoir_mixed_ao.png new file mode 100644 index 0000000..6d45fb8 --- /dev/null +++ b/public/models/lafabrik/comptoir_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e2327b567772ca587796a0cfe5ba7627d3fd159b82509b340a80f027bf07885b +size 420863 diff --git a/public/models/lafabrik/comptoir_normal.png b/public/models/lafabrik/comptoir_normal.png new file mode 100644 index 0000000..456d843 --- /dev/null +++ b/public/models/lafabrik/comptoir_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfe1fe00767d0e31c086eed0e33e08449c5d5d598c52399a8dcc96696e350b03 +size 2001159 diff --git a/public/models/lafabrik/comptoir_normal_opengl.png b/public/models/lafabrik/comptoir_normal_opengl.png new file mode 100644 index 0000000..52f3c77 --- /dev/null +++ b/public/models/lafabrik/comptoir_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad8c5ca698fb98318f3f957d6e1d930fedf1a0f9c3167b3955a42ea87f6c6f0c +size 225093 diff --git a/public/models/lafabrik/comptoir_occlusionroughnessmetallic.png b/public/models/lafabrik/comptoir_occlusionroughnessmetallic.png new file mode 100644 index 0000000..cde3d83 --- /dev/null +++ b/public/models/lafabrik/comptoir_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d88b06666a337587b686fb31033f8a0729850418e2d01255f08d43a69aa8d9a1 +size 737294 diff --git a/public/models/lafabrik/comptoir_roughness.png b/public/models/lafabrik/comptoir_roughness.png new file mode 100644 index 0000000..ebf3115 --- /dev/null +++ b/public/models/lafabrik/comptoir_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85ddd3777aa48eee4ee54457c660ef337198918472ef9056dd2fa1622766ee7b +size 26345 diff --git a/public/models/lafabrik/dashboard_base_color.png b/public/models/lafabrik/dashboard_base_color.png new file mode 100644 index 0000000..794b9c5 --- /dev/null +++ b/public/models/lafabrik/dashboard_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd15c2193adc9bda3caa5a60a8dce7d8ad472abb77f9fda16714ec5ab57b2db8 +size 29467 diff --git a/public/models/lafabrik/dashboard_basecolor.png b/public/models/lafabrik/dashboard_basecolor.png new file mode 100644 index 0000000..e221f5b --- /dev/null +++ b/public/models/lafabrik/dashboard_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f68b75f9433beb193c5d3fc4e3ea9ab61f43c061cf3dd109120d4a2ab7e01012 +size 43662 diff --git a/public/models/lafabrik/dashboard_height.png b/public/models/lafabrik/dashboard_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/dashboard_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/dashboard_metallic.png b/public/models/lafabrik/dashboard_metallic.png new file mode 100644 index 0000000..353dceb --- /dev/null +++ b/public/models/lafabrik/dashboard_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537c59bf6206c8a29d89a0f0433ae285254a2b7deac15ba730f547b6d678ca33 +size 8243 diff --git a/public/models/lafabrik/dashboard_mixed_ao.png b/public/models/lafabrik/dashboard_mixed_ao.png new file mode 100644 index 0000000..2d868b8 --- /dev/null +++ b/public/models/lafabrik/dashboard_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:295f092b90ee1eb726722d342785605e750030fc7bf2f655b2ef8adc94d6af11 +size 748061 diff --git a/public/models/lafabrik/dashboard_normal.png b/public/models/lafabrik/dashboard_normal.png new file mode 100644 index 0000000..dedbbd4 --- /dev/null +++ b/public/models/lafabrik/dashboard_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:df545a97e90b13a35c85405a55d70c9afa828060bdc1366272eef1bcc9ef4fac +size 1856014 diff --git a/public/models/lafabrik/dashboard_normal_opengl.png b/public/models/lafabrik/dashboard_normal_opengl.png new file mode 100644 index 0000000..424a43a --- /dev/null +++ b/public/models/lafabrik/dashboard_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f5d50f352eec25661022033cb205d3e14c179531a0d59d58bc2e28e0fad7a20 +size 29466 diff --git a/public/models/lafabrik/dashboard_occlusionroughnessmetallic.png b/public/models/lafabrik/dashboard_occlusionroughnessmetallic.png new file mode 100644 index 0000000..b61ad3f --- /dev/null +++ b/public/models/lafabrik/dashboard_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bbac8f9c13fbf2ab21c256e365448220f7ca678df5d6287d7151842b8f22a2c5 +size 894264 diff --git a/public/models/lafabrik/dashboard_roughness.png b/public/models/lafabrik/dashboard_roughness.png new file mode 100644 index 0000000..f3dd692 --- /dev/null +++ b/public/models/lafabrik/dashboard_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:428157d1d553d359d25696ec5cdebb0a191dccc08b513f6f8a0a08edccadd8bf +size 12819 diff --git a/public/models/lafabrik/fenetre_0_base_color.png b/public/models/lafabrik/fenetre_0_base_color.png new file mode 100644 index 0000000..8947b77 --- /dev/null +++ b/public/models/lafabrik/fenetre_0_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35a2dc58024f7c002d28477ea808cac85f13c3434363e15091f0216b025eb0d5 +size 478515 diff --git a/public/models/lafabrik/fenetre_0_basecolor.png b/public/models/lafabrik/fenetre_0_basecolor.png new file mode 100644 index 0000000..c8c4111 --- /dev/null +++ b/public/models/lafabrik/fenetre_0_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c36f58ae9eaf0dbc20abec9aa4d1e09e7fb5629e312041deaad1455bd73f59bd +size 356476 diff --git a/public/models/lafabrik/fenetre_0_height.png b/public/models/lafabrik/fenetre_0_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/fenetre_0_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/fenetre_0_metallic.png b/public/models/lafabrik/fenetre_0_metallic.png new file mode 100644 index 0000000..353dceb --- /dev/null +++ b/public/models/lafabrik/fenetre_0_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537c59bf6206c8a29d89a0f0433ae285254a2b7deac15ba730f547b6d678ca33 +size 8243 diff --git a/public/models/lafabrik/fenetre_0_mixed_ao.png b/public/models/lafabrik/fenetre_0_mixed_ao.png new file mode 100644 index 0000000..b75fca3 --- /dev/null +++ b/public/models/lafabrik/fenetre_0_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8af3dd1a5235c2fdc972065fa86d0308395896b08433eab24732a2229c08fcf +size 305028 diff --git a/public/models/lafabrik/fenetre_0_normal.png b/public/models/lafabrik/fenetre_0_normal.png new file mode 100644 index 0000000..ab81f52 --- /dev/null +++ b/public/models/lafabrik/fenetre_0_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f025eaf205443cf90ee0cd019519e924751b54a207ac453ff482b88d2e50c09f +size 2180272 diff --git a/public/models/lafabrik/fenetre_0_normal_opengl.png b/public/models/lafabrik/fenetre_0_normal_opengl.png new file mode 100644 index 0000000..d360120 --- /dev/null +++ b/public/models/lafabrik/fenetre_0_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34f14ee3c574c084326265ba02e506905c6bfff647dcfc9661ee9426f26cacff +size 31073 diff --git a/public/models/lafabrik/fenetre_0_occlusionroughnessmetallic.png b/public/models/lafabrik/fenetre_0_occlusionroughnessmetallic.png new file mode 100644 index 0000000..11b01bb --- /dev/null +++ b/public/models/lafabrik/fenetre_0_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:815a8f6fe3077d32227e0be86b973fb83c0ae83cf4a11fec8a0638a171638bc6 +size 455042 diff --git a/public/models/lafabrik/fenetre_0_roughness.png b/public/models/lafabrik/fenetre_0_roughness.png new file mode 100644 index 0000000..f3dd692 --- /dev/null +++ b/public/models/lafabrik/fenetre_0_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:428157d1d553d359d25696ec5cdebb0a191dccc08b513f6f8a0a08edccadd8bf +size 12819 diff --git a/public/models/lafabrik/model.bin b/public/models/lafabrik/model.bin new file mode 100644 index 0000000..3383765 --- /dev/null +++ b/public/models/lafabrik/model.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9e4b582136b91210549880ba151a0a5c58ca35ae99a23eca4d9bbfd4277c6c11 +size 1240608 diff --git a/public/models/lafabrik/model.gltf b/public/models/lafabrik/model.gltf index 13639cd..cb63296 100644 --- a/public/models/lafabrik/model.gltf +++ b/public/models/lafabrik/model.gltf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d623439755187553ac394395a4e8734e4ea7ca950c94b50649d2b00e6461387e -size 80888 +oid sha256:615bf4ed9c84530bdec465a6bf97262f6e1fc55dd5846bd8c3e698b82309fc68 +size 124737 diff --git a/public/models/lafabrik/panneau_base_color.png b/public/models/lafabrik/panneau_base_color.png new file mode 100644 index 0000000..729e1d9 --- /dev/null +++ b/public/models/lafabrik/panneau_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cd4a33fcd267d793fe531bf64874d42c9fc4d1f5e59e7b899e5e1df294b65d1b +size 1635967 diff --git a/public/models/lafabrik/panneau_basecolor.png b/public/models/lafabrik/panneau_basecolor.png new file mode 100644 index 0000000..1e0a604 --- /dev/null +++ b/public/models/lafabrik/panneau_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d7b9f0e6e1967bde9e127ccd047459bd9c228c2872aa6999d745e3bbbbc97a16 +size 751023 diff --git a/public/models/lafabrik/panneau_height.png b/public/models/lafabrik/panneau_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/panneau_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/panneau_metallic.png b/public/models/lafabrik/panneau_metallic.png new file mode 100644 index 0000000..353dceb --- /dev/null +++ b/public/models/lafabrik/panneau_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537c59bf6206c8a29d89a0f0433ae285254a2b7deac15ba730f547b6d678ca33 +size 8243 diff --git a/public/models/lafabrik/panneau_mixed_ao.png b/public/models/lafabrik/panneau_mixed_ao.png new file mode 100644 index 0000000..510e8d9 --- /dev/null +++ b/public/models/lafabrik/panneau_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa0b8c95e9f6b230ed6eac3c20ca040bfda21e57e16fe955d038cc284f5eba28 +size 948009 diff --git a/public/models/lafabrik/panneau_normal.png b/public/models/lafabrik/panneau_normal.png new file mode 100644 index 0000000..8d99132 --- /dev/null +++ b/public/models/lafabrik/panneau_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:efe381ab55bf16f6eb1210ec73a34218083379673f7f1a8dd208e68bf1de4291 +size 2817900 diff --git a/public/models/lafabrik/panneau_normal_opengl.png b/public/models/lafabrik/panneau_normal_opengl.png new file mode 100644 index 0000000..bcb470c --- /dev/null +++ b/public/models/lafabrik/panneau_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac4096ec4e956ddf3d1f998d43ca670e1025d5ddf0651e082d9cd7b48dc53626 +size 735202 diff --git a/public/models/lafabrik/panneau_occlusionroughnessmetallic.png b/public/models/lafabrik/panneau_occlusionroughnessmetallic.png new file mode 100644 index 0000000..c6b1bb3 --- /dev/null +++ b/public/models/lafabrik/panneau_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34067efc057afefbc87666b5ee55d436fdedbb29e33ec70e200cb0c39a5a4e7a +size 1203760 diff --git a/public/models/lafabrik/panneau_roughness.png b/public/models/lafabrik/panneau_roughness.png new file mode 100644 index 0000000..b405879 --- /dev/null +++ b/public/models/lafabrik/panneau_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51c60554690fec241be70aa9b2b56592bdaa3be58d9f9bacd95785e3571feeab +size 22482 diff --git a/public/models/lafabrik/plan_de_travail_base_color.png b/public/models/lafabrik/plan_de_travail_base_color.png new file mode 100644 index 0000000..d2f1ee6 --- /dev/null +++ b/public/models/lafabrik/plan_de_travail_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:764be1db58dd52c9cd87359b631aec6bafba7a858d075a67796c38482e5b4bf8 +size 1530465 diff --git a/public/models/lafabrik/plan_de_travail_basecolor.png b/public/models/lafabrik/plan_de_travail_basecolor.png new file mode 100644 index 0000000..8f42cc5 --- /dev/null +++ b/public/models/lafabrik/plan_de_travail_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c6655eeaa9958faac0452d63a8607ba8a7bd942caddf5c5a835ddc27ece9a2f9 +size 904256 diff --git a/public/models/lafabrik/plan_de_travail_height.png b/public/models/lafabrik/plan_de_travail_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/plan_de_travail_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/plan_de_travail_metallic.png b/public/models/lafabrik/plan_de_travail_metallic.png new file mode 100644 index 0000000..353dceb --- /dev/null +++ b/public/models/lafabrik/plan_de_travail_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537c59bf6206c8a29d89a0f0433ae285254a2b7deac15ba730f547b6d678ca33 +size 8243 diff --git a/public/models/lafabrik/plan_de_travail_mixed_ao.png b/public/models/lafabrik/plan_de_travail_mixed_ao.png new file mode 100644 index 0000000..c1b9686 --- /dev/null +++ b/public/models/lafabrik/plan_de_travail_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06d26d72c7f4fe867ea426dcf65f8ca0217118c743a0b6c435963f9bb6f35fe0 +size 532506 diff --git a/public/models/lafabrik/plan_de_travail_normal.png b/public/models/lafabrik/plan_de_travail_normal.png new file mode 100644 index 0000000..2ac2fd4 --- /dev/null +++ b/public/models/lafabrik/plan_de_travail_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b311b70ab688e432cff1832db9aeb822e0fbba3d82b5b3edbc30ccff9f9571ef +size 173105 diff --git a/public/models/lafabrik/plan_de_travail_normal_opengl.png b/public/models/lafabrik/plan_de_travail_normal_opengl.png new file mode 100644 index 0000000..7345aaf --- /dev/null +++ b/public/models/lafabrik/plan_de_travail_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:34cfde7361c3f27819da5907ba475668e313aa01b177cb1a12832b86c6ae9457 +size 166055 diff --git a/public/models/lafabrik/plan_de_travail_occlusionroughnessmetallic.png b/public/models/lafabrik/plan_de_travail_occlusionroughnessmetallic.png new file mode 100644 index 0000000..fcf18d8 --- /dev/null +++ b/public/models/lafabrik/plan_de_travail_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f3e540d37d816e12dfad945e9482dc146d1cbc18efc3788e0d7eaacc9b51e3e +size 870633 diff --git a/public/models/lafabrik/plan_de_travail_roughness.png b/public/models/lafabrik/plan_de_travail_roughness.png new file mode 100644 index 0000000..0a510ff --- /dev/null +++ b/public/models/lafabrik/plan_de_travail_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:39171a7a15cb7032fa4a9e15694f7f70105c5d0d458b23b642a5e9079ebfb768 +size 31254 diff --git a/public/models/lafabrik/porte_base_color.png b/public/models/lafabrik/porte_base_color.png new file mode 100644 index 0000000..82308db --- /dev/null +++ b/public/models/lafabrik/porte_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21a8b51dd41807b48a4ba12e963552dee18cf61263a1b84ba1e89493e62bdae9 +size 711076 diff --git a/public/models/lafabrik/porte_basecolor.png b/public/models/lafabrik/porte_basecolor.png new file mode 100644 index 0000000..6ef305f --- /dev/null +++ b/public/models/lafabrik/porte_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f8113d63fde96700d5cfc937ea2a84b0cadba745da432bbddec099cae3ce3fe9 +size 601365 diff --git a/public/models/lafabrik/porte_height.png b/public/models/lafabrik/porte_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/porte_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/porte_metallic.png b/public/models/lafabrik/porte_metallic.png new file mode 100644 index 0000000..353dceb --- /dev/null +++ b/public/models/lafabrik/porte_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537c59bf6206c8a29d89a0f0433ae285254a2b7deac15ba730f547b6d678ca33 +size 8243 diff --git a/public/models/lafabrik/porte_mixed_ao.png b/public/models/lafabrik/porte_mixed_ao.png new file mode 100644 index 0000000..40a663b --- /dev/null +++ b/public/models/lafabrik/porte_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2695f10aa8b88e30a2a9b29a9a3bdfa77700368e493733c4372729b0d57ab27c +size 539406 diff --git a/public/models/lafabrik/porte_normal.png b/public/models/lafabrik/porte_normal.png new file mode 100644 index 0000000..259ff9d --- /dev/null +++ b/public/models/lafabrik/porte_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:46173406135afe7ffa4318196893f8cfe1b0aa7b292e64ed93cb6302392b3dd2 +size 2480991 diff --git a/public/models/lafabrik/porte_normal_opengl.png b/public/models/lafabrik/porte_normal_opengl.png new file mode 100644 index 0000000..62acdfd --- /dev/null +++ b/public/models/lafabrik/porte_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d08801f9d46b86af871fd890afa8cda49f69abc5588e961badd3ad0d843f83b2 +size 260513 diff --git a/public/models/lafabrik/porte_occlusionroughnessmetallic.png b/public/models/lafabrik/porte_occlusionroughnessmetallic.png new file mode 100644 index 0000000..a6a1fa6 --- /dev/null +++ b/public/models/lafabrik/porte_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4f24311e5c1a3d9caacc34bebd628258fed45c279ac9760b13baa38b15356a7a +size 735539 diff --git a/public/models/lafabrik/porte_roughness.png b/public/models/lafabrik/porte_roughness.png new file mode 100644 index 0000000..ae229dd --- /dev/null +++ b/public/models/lafabrik/porte_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:94117088d96bd2a2aa2c149269f9672b8b2f0c1a4580df9b9dfdb7128c654c9b +size 70513 diff --git a/public/models/lafabrik/porte_stock_base_color.png b/public/models/lafabrik/porte_stock_base_color.png new file mode 100644 index 0000000..6af3f7e --- /dev/null +++ b/public/models/lafabrik/porte_stock_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6af1af828108a27cff317cc91747c297acd6e44237bbc691c58c11132272fdcb +size 128309 diff --git a/public/models/lafabrik/porte_stock_basecolor.png b/public/models/lafabrik/porte_stock_basecolor.png new file mode 100644 index 0000000..50459d6 --- /dev/null +++ b/public/models/lafabrik/porte_stock_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78405d3af140658de85de17767f336f746cc98961694d7ce918c5379677bbe82 +size 64589 diff --git a/public/models/lafabrik/porte_stock_height.png b/public/models/lafabrik/porte_stock_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/porte_stock_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/porte_stock_metallic.png b/public/models/lafabrik/porte_stock_metallic.png new file mode 100644 index 0000000..d3378cf --- /dev/null +++ b/public/models/lafabrik/porte_stock_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3de096ecaa8b16d76f5d3feb75ca111738ae23e3ff4f5a1de384cc5f4a8dbc27 +size 41077 diff --git a/public/models/lafabrik/porte_stock_mixed_ao.png b/public/models/lafabrik/porte_stock_mixed_ao.png new file mode 100644 index 0000000..e9efda2 --- /dev/null +++ b/public/models/lafabrik/porte_stock_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:00d3c917b768b4cd6bcdf6b1987436a209ad8a0fcc124594880fb9b47559d14e +size 9471 diff --git a/public/models/lafabrik/porte_stock_normal.png b/public/models/lafabrik/porte_stock_normal.png new file mode 100644 index 0000000..24fac91 --- /dev/null +++ b/public/models/lafabrik/porte_stock_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e8963241a9954ad1fb77174ae5fd54a9412e4827a23b17d72d253d29b48e1c3 +size 45527 diff --git a/public/models/lafabrik/porte_stock_normal_opengl.png b/public/models/lafabrik/porte_stock_normal_opengl.png new file mode 100644 index 0000000..a315580 --- /dev/null +++ b/public/models/lafabrik/porte_stock_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:27c879ae9d20f2062e9f95ccad0d9e81c4291cbad52c4c95be60bbe3e767297d +size 46420 diff --git a/public/models/lafabrik/porte_stock_occlusionroughnessmetallic.png b/public/models/lafabrik/porte_stock_occlusionroughnessmetallic.png new file mode 100644 index 0000000..89877a7 --- /dev/null +++ b/public/models/lafabrik/porte_stock_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a40cc9bdbf324dc0464798f0570a83dc871cc3307c2b3a2a6b53293e9a3f415f +size 50302 diff --git a/public/models/lafabrik/porte_stock_roughness.png b/public/models/lafabrik/porte_stock_roughness.png new file mode 100644 index 0000000..e70646f --- /dev/null +++ b/public/models/lafabrik/porte_stock_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:32d6f618a212c2d338e83150902550a61597de2447cd5fe65d91b9f89c4a23e5 +size 20796 diff --git a/public/models/lafabrik/stock_0_base_color.png b/public/models/lafabrik/stock_0_base_color.png new file mode 100644 index 0000000..5417094 --- /dev/null +++ b/public/models/lafabrik/stock_0_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca9617c3d3373b6b4c394b7a2de6b692d5561702ea895aea14c619c4d4abd20b +size 1173929 diff --git a/public/models/lafabrik/stock_0_basecolor.png b/public/models/lafabrik/stock_0_basecolor.png new file mode 100644 index 0000000..0bc382c --- /dev/null +++ b/public/models/lafabrik/stock_0_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f3d00e332756571cf0bbc4a600964f8b61c678924ff16f4785e5578cbb2df66 +size 924793 diff --git a/public/models/lafabrik/stock_0_height.png b/public/models/lafabrik/stock_0_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/stock_0_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/stock_0_metallic.png b/public/models/lafabrik/stock_0_metallic.png new file mode 100644 index 0000000..4039703 --- /dev/null +++ b/public/models/lafabrik/stock_0_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da6065158325302d0532437e05a303258dbe26b72a10f58f966f3f07c934ceed +size 536927 diff --git a/public/models/lafabrik/stock_0_mixed_ao.png b/public/models/lafabrik/stock_0_mixed_ao.png new file mode 100644 index 0000000..de5cf83 --- /dev/null +++ b/public/models/lafabrik/stock_0_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:029d5e47254d07db85860b7254fa21e001d81f711a947e82148a1f5b2e3785a1 +size 591661 diff --git a/public/models/lafabrik/stock_0_normal.png b/public/models/lafabrik/stock_0_normal.png new file mode 100644 index 0000000..6d0c946 --- /dev/null +++ b/public/models/lafabrik/stock_0_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ac8b22757a518d7fdf166a35b85bf09b636ccf54185346d25cebbdebb220a37b +size 2328693 diff --git a/public/models/lafabrik/stock_0_normal_opengl.png b/public/models/lafabrik/stock_0_normal_opengl.png new file mode 100644 index 0000000..041bc9a --- /dev/null +++ b/public/models/lafabrik/stock_0_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6da2d6f12e1c61392e6f7648fbfeae38c1d0749cdf03f3f8e0c0a2cd63069dc7 +size 77507 diff --git a/public/models/lafabrik/stock_0_occlusionroughnessmetallic.png b/public/models/lafabrik/stock_0_occlusionroughnessmetallic.png new file mode 100644 index 0000000..2c5f5c2 --- /dev/null +++ b/public/models/lafabrik/stock_0_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfb8f0c868e4aa1a51df12475de69b4754297767abceaaaaac14b01e65c13ec8 +size 1292405 diff --git a/public/models/lafabrik/stock_0_roughness.png b/public/models/lafabrik/stock_0_roughness.png new file mode 100644 index 0000000..f3dd692 --- /dev/null +++ b/public/models/lafabrik/stock_0_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:428157d1d553d359d25696ec5cdebb0a191dccc08b513f6f8a0a08edccadd8bf +size 12819 diff --git a/public/models/lafabrik/tiges_base_color.png b/public/models/lafabrik/tiges_base_color.png new file mode 100644 index 0000000..9c519e4 --- /dev/null +++ b/public/models/lafabrik/tiges_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c0671a54d36b101abea124afad01aa332b20f71abaf0bd55f3970c2944b9c360 +size 354282 diff --git a/public/models/lafabrik/tiges_basecolor.png b/public/models/lafabrik/tiges_basecolor.png new file mode 100644 index 0000000..cd25a14 --- /dev/null +++ b/public/models/lafabrik/tiges_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8a2400ea8904396f705c7587e8613e5c7b6922d66a9d0eee51ad1361fcddc47e +size 210469 diff --git a/public/models/lafabrik/tiges_height.png b/public/models/lafabrik/tiges_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/tiges_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/tiges_metallic.png b/public/models/lafabrik/tiges_metallic.png new file mode 100644 index 0000000..353dceb --- /dev/null +++ b/public/models/lafabrik/tiges_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537c59bf6206c8a29d89a0f0433ae285254a2b7deac15ba730f547b6d678ca33 +size 8243 diff --git a/public/models/lafabrik/tiges_mixed_ao.png b/public/models/lafabrik/tiges_mixed_ao.png new file mode 100644 index 0000000..aeafc39 --- /dev/null +++ b/public/models/lafabrik/tiges_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:56dc583b2c84b6991a6f9d488885c6857f81f8b911ac1676070838398ab30f21 +size 109095 diff --git a/public/models/lafabrik/tiges_normal.png b/public/models/lafabrik/tiges_normal.png new file mode 100644 index 0000000..3c14cf5 --- /dev/null +++ b/public/models/lafabrik/tiges_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:98460460fbfcf9185b93db02f56b95ab55d33776a93d057a561e20f1d60baaf6 +size 2300732 diff --git a/public/models/lafabrik/tiges_normal_opengl.png b/public/models/lafabrik/tiges_normal_opengl.png new file mode 100644 index 0000000..de08e22 --- /dev/null +++ b/public/models/lafabrik/tiges_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca5547c7d7b84139109d58992629be338f75becef2f0fb5616c6b195c0df588d +size 41343 diff --git a/public/models/lafabrik/tiges_occlusionroughnessmetallic.png b/public/models/lafabrik/tiges_occlusionroughnessmetallic.png new file mode 100644 index 0000000..19aabcd --- /dev/null +++ b/public/models/lafabrik/tiges_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3f1b6cffe503202069b3eb74c21c6d55821ce50595998131399048998f06e0d0 +size 139216 diff --git a/public/models/lafabrik/tiges_roughness.png b/public/models/lafabrik/tiges_roughness.png new file mode 100644 index 0000000..f3dd692 --- /dev/null +++ b/public/models/lafabrik/tiges_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:428157d1d553d359d25696ec5cdebb0a191dccc08b513f6f8a0a08edccadd8bf +size 12819 diff --git a/public/models/lafabrik/toit_base_color.png b/public/models/lafabrik/toit_base_color.png new file mode 100644 index 0000000..11b9196 --- /dev/null +++ b/public/models/lafabrik/toit_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c25c112e446005552faf39dd36588427fc8862985010d49a23f7f27845c991c +size 859915 diff --git a/public/models/lafabrik/toit_basecolor.png b/public/models/lafabrik/toit_basecolor.png new file mode 100644 index 0000000..88cc317 --- /dev/null +++ b/public/models/lafabrik/toit_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a37bd6dd564ed91204cb52ac8e15b4538a96e5534ad887e8942cc13250c595c +size 693601 diff --git a/public/models/lafabrik/toit_height.png b/public/models/lafabrik/toit_height.png new file mode 100644 index 0000000..9daf8da --- /dev/null +++ b/public/models/lafabrik/toit_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a65cfe0c3a454ccdc9a92c4a1f3dd791529aba0fe120bb1c1ccda4357dc973be +size 12816 diff --git a/public/models/lafabrik/toit_metallic.png b/public/models/lafabrik/toit_metallic.png new file mode 100644 index 0000000..353dceb --- /dev/null +++ b/public/models/lafabrik/toit_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:537c59bf6206c8a29d89a0f0433ae285254a2b7deac15ba730f547b6d678ca33 +size 8243 diff --git a/public/models/lafabrik/toit_mixed_ao.png b/public/models/lafabrik/toit_mixed_ao.png new file mode 100644 index 0000000..5db1248 --- /dev/null +++ b/public/models/lafabrik/toit_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cf924c03af4f85d59bbd990865f2aa3400876a0a97a69c88ee49d65026f9bc89 +size 349548 diff --git a/public/models/lafabrik/toit_normal.png b/public/models/lafabrik/toit_normal.png new file mode 100644 index 0000000..067baa9 --- /dev/null +++ b/public/models/lafabrik/toit_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66c3acf157d8bc160f3f2d97a536cf98350ff6170ce9912b0ddff62954bfdb99 +size 2429181 diff --git a/public/models/lafabrik/toit_normal_opengl.png b/public/models/lafabrik/toit_normal_opengl.png new file mode 100644 index 0000000..e8770c1 --- /dev/null +++ b/public/models/lafabrik/toit_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:02f0ffecc48765defa40eec93ea43f349f3458d0310a1ae93e7885d8cff1094f +size 462395 diff --git a/public/models/lafabrik/toit_occlusionroughnessmetallic.png b/public/models/lafabrik/toit_occlusionroughnessmetallic.png new file mode 100644 index 0000000..04151cd --- /dev/null +++ b/public/models/lafabrik/toit_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a472ac98d398f511fba3d2518202e92371092bc34f597f79975b946b1d9f57c1 +size 754338 diff --git a/public/models/lafabrik/toit_roughness.png b/public/models/lafabrik/toit_roughness.png new file mode 100644 index 0000000..5d5c166 --- /dev/null +++ b/public/models/lafabrik/toit_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:146c2eaab113e24bca61833fcbe64a9f02f7c77dcc41975cef8d97ec8a23c93c +size 35132 diff --git a/public/models/lafabrik/tuyaux_base_color.png b/public/models/lafabrik/tuyaux_base_color.png new file mode 100644 index 0000000..66b12c1 --- /dev/null +++ b/public/models/lafabrik/tuyaux_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d84502af791ef0e062e59939e8c8df61b9697edcd972f3479dd5caf948ee27e +size 37945 diff --git a/public/models/lafabrik/tuyaux_basecolor.png b/public/models/lafabrik/tuyaux_basecolor.png new file mode 100644 index 0000000..a972f9f --- /dev/null +++ b/public/models/lafabrik/tuyaux_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecef5b234187cf0ea6811b7c4391a30ebd270716c6898737048574b8e91df6a4 +size 985402 diff --git a/public/models/lafabrik/tuyaux_height.png b/public/models/lafabrik/tuyaux_height.png new file mode 100644 index 0000000..5b5097a --- /dev/null +++ b/public/models/lafabrik/tuyaux_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90c60d0b0bdee17032df4fca741b6fffef5f8f7d3ea6d812b38a3c7182081348 +size 21246 diff --git a/public/models/lafabrik/tuyaux_metallic.png b/public/models/lafabrik/tuyaux_metallic.png new file mode 100644 index 0000000..5eb723e --- /dev/null +++ b/public/models/lafabrik/tuyaux_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7539ab53d58dbd6a3847ce0055806931569d9c43d37c04bd8c935c0983c23ec0 +size 16408 diff --git a/public/models/lafabrik/tuyaux_mixed_ao.png b/public/models/lafabrik/tuyaux_mixed_ao.png new file mode 100644 index 0000000..13172ba --- /dev/null +++ b/public/models/lafabrik/tuyaux_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d29f3cde5df3e61c74f2991b791f66894f7f5dd78cf9dd3d4e1c74c8db6864f8 +size 488217 diff --git a/public/models/lafabrik/tuyaux_normal.png b/public/models/lafabrik/tuyaux_normal.png new file mode 100644 index 0000000..ea8f469 --- /dev/null +++ b/public/models/lafabrik/tuyaux_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb63b22af905381525e94db42df33e962fa4438e6df7fc4b135fea66aff3d8ef +size 2733817 diff --git a/public/models/lafabrik/tuyaux_normal_opengl.png b/public/models/lafabrik/tuyaux_normal_opengl.png new file mode 100644 index 0000000..57c301c --- /dev/null +++ b/public/models/lafabrik/tuyaux_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2248bd2d602f2fa747ae8946aab269f58332f0485de6d36ae7addf1b179b3712 +size 601094 diff --git a/public/models/lafabrik/tuyaux_occlusionroughnessmetallic.png b/public/models/lafabrik/tuyaux_occlusionroughnessmetallic.png new file mode 100644 index 0000000..45e36fe --- /dev/null +++ b/public/models/lafabrik/tuyaux_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fa1106f03322eb77da04566add258c040fe02f12745077250fdedc511b051329 +size 727564 diff --git a/public/models/lafabrik/tuyaux_roughness.png b/public/models/lafabrik/tuyaux_roughness.png new file mode 100644 index 0000000..ca04062 --- /dev/null +++ b/public/models/lafabrik/tuyaux_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8437db5f5dff9cd445e74195d68da20fcec1e5cfebb50ce71a99d586e28fc09b +size 21248 diff --git a/public/models/lafabrik/verre_fenetre_base_color.png b/public/models/lafabrik/verre_fenetre_base_color.png new file mode 100644 index 0000000..66b12c1 --- /dev/null +++ b/public/models/lafabrik/verre_fenetre_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d84502af791ef0e062e59939e8c8df61b9697edcd972f3479dd5caf948ee27e +size 37945 diff --git a/public/models/lafabrik/verre_fenetre_basecolor.png b/public/models/lafabrik/verre_fenetre_basecolor.png new file mode 100644 index 0000000..d7d07d3 --- /dev/null +++ b/public/models/lafabrik/verre_fenetre_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e7efa341e9d62aab680a8bfa040ea0ef9516cd89f44fd67ad76166ff6a6ba867 +size 219055 diff --git a/public/models/lafabrik/verre_fenetre_height.png b/public/models/lafabrik/verre_fenetre_height.png new file mode 100644 index 0000000..5b5097a --- /dev/null +++ b/public/models/lafabrik/verre_fenetre_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:90c60d0b0bdee17032df4fca741b6fffef5f8f7d3ea6d812b38a3c7182081348 +size 21246 diff --git a/public/models/lafabrik/verre_fenetre_metallic.png b/public/models/lafabrik/verre_fenetre_metallic.png new file mode 100644 index 0000000..5eb723e --- /dev/null +++ b/public/models/lafabrik/verre_fenetre_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7539ab53d58dbd6a3847ce0055806931569d9c43d37c04bd8c935c0983c23ec0 +size 16408 diff --git a/public/models/lafabrik/verre_fenetre_mixed_ao.png b/public/models/lafabrik/verre_fenetre_mixed_ao.png new file mode 100644 index 0000000..5da09c5 --- /dev/null +++ b/public/models/lafabrik/verre_fenetre_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8836e7e2a32d99efce5fe81842423c81e151f35938916ee10460bd6d811f56d5 +size 863299 diff --git a/public/models/lafabrik/verre_fenetre_normal.png b/public/models/lafabrik/verre_fenetre_normal.png new file mode 100644 index 0000000..543d4bd --- /dev/null +++ b/public/models/lafabrik/verre_fenetre_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a7c4e3a495cac4c984bc0ee50435bd4f52e90ebf1c5cdbd22c3f3b392b07f354 +size 2366782 diff --git a/public/models/lafabrik/verre_fenetre_normal_opengl.png b/public/models/lafabrik/verre_fenetre_normal_opengl.png new file mode 100644 index 0000000..55c23b9 --- /dev/null +++ b/public/models/lafabrik/verre_fenetre_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58e64c8e335e92f76bebae1e0bf9bac8ce9d339dc896223f1be0f2d8223d30f0 +size 37652 diff --git a/public/models/lafabrik/verre_fenetre_occlusionroughnessmetallic.png b/public/models/lafabrik/verre_fenetre_occlusionroughnessmetallic.png new file mode 100644 index 0000000..72000d9 --- /dev/null +++ b/public/models/lafabrik/verre_fenetre_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:85607499851e3dc3ebbff19886c40609dc81a3167940ffadd469731c222d56b3 +size 1021100 diff --git a/public/models/lafabrik/verre_fenetre_roughness.png b/public/models/lafabrik/verre_fenetre_roughness.png new file mode 100644 index 0000000..ca04062 --- /dev/null +++ b/public/models/lafabrik/verre_fenetre_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8437db5f5dff9cd445e74195d68da20fcec1e5cfebb50ce71a99d586e28fc09b +size 21248 diff --git a/public/models/maison1/contours_baseColor.png b/public/models/maison1/contours_baseColor.png new file mode 100644 index 0000000..278ef0d --- /dev/null +++ b/public/models/maison1/contours_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ed22c250b879f0e66e30e2baf16ab290eea6c894f93e0105a45da960b26e5f21 +size 131187 diff --git a/public/models/maison1/contours_normal.png b/public/models/maison1/contours_normal.png new file mode 100644 index 0000000..642bd3b --- /dev/null +++ b/public/models/maison1/contours_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c93319fc83c2304d0b09ddaea32a33c32c5405b4340348ae2c45c0177df06b75 +size 2511652 diff --git a/public/models/maison1/contours_occlusionRoughnessMetallic.png b/public/models/maison1/contours_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..04535d6 --- /dev/null +++ b/public/models/maison1/contours_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d0c8332caf3085222d4ffa4296cf454f5006605f686c750a0f6b7ca4b6ea3c6b +size 160217 diff --git a/public/models/maison1/fenetre_baseColor.png b/public/models/maison1/fenetre_baseColor.png new file mode 100644 index 0000000..80c71ce --- /dev/null +++ b/public/models/maison1/fenetre_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b1ba9976d7416ace83e7ae729fed9f6e012254e75616405c7a60ed9436c50205 +size 216048 diff --git a/public/models/maison1/fenetre_normal.png b/public/models/maison1/fenetre_normal.png new file mode 100644 index 0000000..23fdaff --- /dev/null +++ b/public/models/maison1/fenetre_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c73191bf8151222ab91994ba282f78ca5b12cd2b3a6967e4259899802c526e62 +size 2389204 diff --git a/public/models/maison1/fenetre_occlusionRoughnessMetallic.png b/public/models/maison1/fenetre_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..eaf10e8 --- /dev/null +++ b/public/models/maison1/fenetre_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5f9ed0f001f98c1f7c6549e118cfae46c2cbddfd998338c0c2f298f9cfaf55b9 +size 366670 diff --git a/public/models/maison1/maison_baseColor.png b/public/models/maison1/maison_baseColor.png new file mode 100644 index 0000000..0c3cc07 --- /dev/null +++ b/public/models/maison1/maison_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:71c03de33eda3c95e56652d86950ecbce978e6f224785e7f2bfe8bb8c462382f +size 452807 diff --git a/public/models/maison1/maison_normal.png b/public/models/maison1/maison_normal.png new file mode 100644 index 0000000..a775c1b --- /dev/null +++ b/public/models/maison1/maison_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:06f73d59d07820ba9a7934955fb47e30066724996bb6ac138ff94733d314043c +size 2588052 diff --git a/public/models/maison1/maison_occlusionRoughnessMetallic.png b/public/models/maison1/maison_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..39f8fd5 --- /dev/null +++ b/public/models/maison1/maison_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:07db7e6bf0f396669bccd8361a4deec0b7faccc528163e8e748e7333eed530b6 +size 1043188 diff --git a/public/models/maison1/model.gltf b/public/models/maison1/model.gltf new file mode 100644 index 0000000..4f61689 --- /dev/null +++ b/public/models/maison1/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e21381ca52401e439a97d898358cf8d0ea62c3b6aaf45efd625c4572de89319e +size 26605137 diff --git a/public/models/maison1/panneau_baseColor.png b/public/models/maison1/panneau_baseColor.png new file mode 100644 index 0000000..866ba7f --- /dev/null +++ b/public/models/maison1/panneau_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:499e858e82bb910f251386f57bb751743b0a557a70383a68e5b534a8e8e30854 +size 1138223 diff --git a/public/models/maison1/panneau_normal.png b/public/models/maison1/panneau_normal.png new file mode 100644 index 0000000..f513b6d --- /dev/null +++ b/public/models/maison1/panneau_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e7db9b77efbfb0c62ec4924b2522babb191ec4a5e51687dc4de8971f044a8f5 +size 2487930 diff --git a/public/models/maison1/panneau_occlusionRoughnessMetallic.png b/public/models/maison1/panneau_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..2604685 --- /dev/null +++ b/public/models/maison1/panneau_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d091dfbc9d62ae4a2bd978a66bb9efe0ad82e3cbcb9c01b07cd92cc16061ef22 +size 220552 diff --git a/public/models/maison1/porte_baseColor.png b/public/models/maison1/porte_baseColor.png new file mode 100644 index 0000000..a134b08 --- /dev/null +++ b/public/models/maison1/porte_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73f7d6de8d7e25c3c467d3629db998700f3174f0f72c54853fb8fdb5e57e08f6 +size 75625 diff --git a/public/models/maison1/porte_normal.png b/public/models/maison1/porte_normal.png new file mode 100644 index 0000000..98e8af4 --- /dev/null +++ b/public/models/maison1/porte_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db6673d76ec56a40ae3cfeb5618106698e61af67640da37d3c2bdb83fae1bd62 +size 1958641 diff --git a/public/models/maison1/porte_occlusionRoughnessMetallic.png b/public/models/maison1/porte_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..439356d --- /dev/null +++ b/public/models/maison1/porte_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b177a895acb638a7f2afd94b33dae973d0295ca1a4ab2ae591bb570b9465185 +size 99517 diff --git a/public/models/maison1/toit_baseColor.png b/public/models/maison1/toit_baseColor.png new file mode 100644 index 0000000..5fafc94 --- /dev/null +++ b/public/models/maison1/toit_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6e3ba3cf444b3f8f93c95a0152595c1aed06f29e33e2222ebc129ee264489595 +size 837804 diff --git a/public/models/maison1/toit_normal.png b/public/models/maison1/toit_normal.png new file mode 100644 index 0000000..f711d78 --- /dev/null +++ b/public/models/maison1/toit_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0664dcc0ab1332c29cef088788981340d8244c5d6707a89a9fee25061945e021 +size 2795898 diff --git a/public/models/maison1/toit_occlusionRoughnessMetallic.png b/public/models/maison1/toit_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..3e356ba --- /dev/null +++ b/public/models/maison1/toit_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6b4b5b1127a02b617fc739bc3736f12f4fd9cfae19aca5c4e82b4d495b1f6ea1 +size 1027685 diff --git a/public/models/packderelance/cabledroit_base_color.png b/public/models/packderelance/cabledroit_base_color.png new file mode 100644 index 0000000..17a1e8c --- /dev/null +++ b/public/models/packderelance/cabledroit_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:613f4ed9175f554bf1ec4b8425ecb2b81fde584414caaaab865bc47582f1ea61 +size 20078 diff --git a/public/models/packderelance/cabledroit_height.png b/public/models/packderelance/cabledroit_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/cabledroit_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/cabledroit_metallic.png b/public/models/packderelance/cabledroit_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/packderelance/cabledroit_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/packderelance/cabledroit_mixed_ao.png b/public/models/packderelance/cabledroit_mixed_ao.png new file mode 100644 index 0000000..5addc6e --- /dev/null +++ b/public/models/packderelance/cabledroit_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4808a2bb7e3ae292484eab89442fe12ec00f0c9e60df1f0a3c0a07cd60d31d92 +size 100286 diff --git a/public/models/packderelance/cabledroit_normal.png b/public/models/packderelance/cabledroit_normal.png new file mode 100644 index 0000000..573e9ce --- /dev/null +++ b/public/models/packderelance/cabledroit_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2870a832300161a35a832511aa6401a0ef8b301acf79d67eeb8aea6a6f0c6470 +size 144969 diff --git a/public/models/packderelance/cabledroit_normal_opengl.png b/public/models/packderelance/cabledroit_normal_opengl.png new file mode 100644 index 0000000..5f329f3 --- /dev/null +++ b/public/models/packderelance/cabledroit_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:300804d6b7edc1d1375366f4a88c78d5f5f11bceb404be860144041c638fd0e6 +size 145487 diff --git a/public/models/packderelance/cabledroit_roughness.png b/public/models/packderelance/cabledroit_roughness.png new file mode 100644 index 0000000..ad7f319 --- /dev/null +++ b/public/models/packderelance/cabledroit_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c284c7d004b8ac903385f47bd837da38d89bd62d6cb0ca373d0e7fb13ccebf90 +size 53658 diff --git a/public/models/packderelance/cablegauche_base_color.png b/public/models/packderelance/cablegauche_base_color.png new file mode 100644 index 0000000..d9adfcb --- /dev/null +++ b/public/models/packderelance/cablegauche_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eb15c724f623830d464d72abecd429406c7a4338e6e4a6bf1afd841dbdd0c6f5 +size 31886 diff --git a/public/models/packderelance/cablegauche_height.png b/public/models/packderelance/cablegauche_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/cablegauche_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/cablegauche_metallic.png b/public/models/packderelance/cablegauche_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/packderelance/cablegauche_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/packderelance/cablegauche_mixed_ao.png b/public/models/packderelance/cablegauche_mixed_ao.png new file mode 100644 index 0000000..c421b49 --- /dev/null +++ b/public/models/packderelance/cablegauche_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:daf9d86a1f29600e4af115eb0d3f429240c4f8cdfb773dfc7ce7bff2785b6cd6 +size 98979 diff --git a/public/models/packderelance/cablegauche_normal.png b/public/models/packderelance/cablegauche_normal.png new file mode 100644 index 0000000..816c578 --- /dev/null +++ b/public/models/packderelance/cablegauche_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:050b424b60d026327146d44bf02cf5f8f3c06525b1ca99b234ade11bc6114ad2 +size 144355 diff --git a/public/models/packderelance/cablegauche_normal_opengl.png b/public/models/packderelance/cablegauche_normal_opengl.png new file mode 100644 index 0000000..8d99c85 --- /dev/null +++ b/public/models/packderelance/cablegauche_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1ab8fd8bff205eea0af8292bc13ba4687b75e140645a654cdb3247c533ab646c +size 144797 diff --git a/public/models/packderelance/cablegauche_roughness.png b/public/models/packderelance/cablegauche_roughness.png new file mode 100644 index 0000000..f90ec1c --- /dev/null +++ b/public/models/packderelance/cablegauche_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a252defdb7a8f50a89c6cdad3937776f4aaf10578a6134b8dc8957b25fced770 +size 53435 diff --git a/public/models/packderelance/charnie_res_base_color.png b/public/models/packderelance/charnie_res_base_color.png new file mode 100644 index 0000000..c42f5fd --- /dev/null +++ b/public/models/packderelance/charnie_res_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ea3df019860e60a2201d9d6caa374bb1500b9602153b1e3f08c48bfd016aff20 +size 25427 diff --git a/public/models/packderelance/charnie_res_height.png b/public/models/packderelance/charnie_res_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/charnie_res_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/charnie_res_metallic.png b/public/models/packderelance/charnie_res_metallic.png new file mode 100644 index 0000000..b5efe7f --- /dev/null +++ b/public/models/packderelance/charnie_res_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a2ed466f79c723385da4cdf7cd5f1ed962e7523ff364a5df53336c57f925ae48 +size 3179 diff --git a/public/models/packderelance/charnie_res_mixed_ao.png b/public/models/packderelance/charnie_res_mixed_ao.png new file mode 100644 index 0000000..a599712 --- /dev/null +++ b/public/models/packderelance/charnie_res_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b22bc2d3bae0f4bafc2b8bde962baa91eb911aba02b61737e17bc356497ab2be +size 433143 diff --git a/public/models/packderelance/charnie_res_normal.png b/public/models/packderelance/charnie_res_normal.png new file mode 100644 index 0000000..656cd34 --- /dev/null +++ b/public/models/packderelance/charnie_res_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:38ec0d30ce672b32199200e164eee640c7b168a3784a4ebce582eba63cb13bae +size 224792 diff --git a/public/models/packderelance/charnie_res_normal_opengl.png b/public/models/packderelance/charnie_res_normal_opengl.png new file mode 100644 index 0000000..51500ab --- /dev/null +++ b/public/models/packderelance/charnie_res_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9980c45e2e90cf6414249536d1df806e9ff550cfc88b31621680d833e99fad60 +size 224132 diff --git a/public/models/packderelance/charnie_res_roughness.png b/public/models/packderelance/charnie_res_roughness.png new file mode 100644 index 0000000..61b122d --- /dev/null +++ b/public/models/packderelance/charnie_res_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c386172f879e0a97ed4168bc2fa242430ae41bb256e97c08157e429c6915a389 +size 101620 diff --git a/public/models/packderelance/height_cabledroit.png b/public/models/packderelance/height_cabledroit.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_cabledroit.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/height_cablegauche.png b/public/models/packderelance/height_cablegauche.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_cablegauche.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/height_charnie_res.png b/public/models/packderelance/height_charnie_res.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_charnie_res.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/height_lock.png b/public/models/packderelance/height_lock.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_lock.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/height_manchemart.png b/public/models/packderelance/height_manchemart.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_manchemart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/height_mousse.png b/public/models/packderelance/height_mousse.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_mousse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/height_mousse_bas.png b/public/models/packderelance/height_mousse_bas.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_mousse_bas.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/height_patinf.png b/public/models/packderelance/height_patinf.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_patinf.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/height_patsup.png b/public/models/packderelance/height_patsup.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_patsup.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/height_puces.png b/public/models/packderelance/height_puces.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_puces.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/height_tetemart.png b/public/models/packderelance/height_tetemart.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/packderelance/height_tetemart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/packderelance/lock_base_color.png b/public/models/packderelance/lock_base_color.png new file mode 100644 index 0000000..4713e11 --- /dev/null +++ b/public/models/packderelance/lock_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b069014a3c3a8cec31e89eab2a3e5551be8719a923ab6631d68e35a339027de +size 23570 diff --git a/public/models/packderelance/lock_height.png b/public/models/packderelance/lock_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/lock_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/lock_metallic.png b/public/models/packderelance/lock_metallic.png new file mode 100644 index 0000000..9a54f06 --- /dev/null +++ b/public/models/packderelance/lock_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0f2ae19c75124d18889a4682d0ef5681e6dc93b0ed764171edaa5bdfea147af5 +size 3179 diff --git a/public/models/packderelance/lock_mixed_ao.png b/public/models/packderelance/lock_mixed_ao.png new file mode 100644 index 0000000..2520a22 --- /dev/null +++ b/public/models/packderelance/lock_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:defceee926a30a842e6e3cc687f6aed1a725d23a113c4a0dc9043ccf60974b23 +size 169856 diff --git a/public/models/packderelance/lock_normal.png b/public/models/packderelance/lock_normal.png new file mode 100644 index 0000000..94ab739 --- /dev/null +++ b/public/models/packderelance/lock_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:35dc1c655b8e0f8715eff72e36a8b69ae8145cc91c96bce23cad9fa8e429e9e1 +size 113730 diff --git a/public/models/packderelance/lock_normal_opengl.png b/public/models/packderelance/lock_normal_opengl.png new file mode 100644 index 0000000..739c551 --- /dev/null +++ b/public/models/packderelance/lock_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c90b0b6aaadf6cd80eaf61e8981d6f0f81ec6f1cc6d28ad9623b1d589da1aa64 +size 114262 diff --git a/public/models/packderelance/lock_roughness.png b/public/models/packderelance/lock_roughness.png new file mode 100644 index 0000000..a238764 --- /dev/null +++ b/public/models/packderelance/lock_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5e0dd0eb573b833b9507e9f5d36c0f5d696974699c48918feda6ee493633502 +size 78421 diff --git a/public/models/packderelance/manchemart_base_color.png b/public/models/packderelance/manchemart_base_color.png new file mode 100644 index 0000000..fc643a5 --- /dev/null +++ b/public/models/packderelance/manchemart_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:622a39812f202a2e5b3963af40b7d4998bc33cb5b25cbcd357c12dfda816f77b +size 41453 diff --git a/public/models/packderelance/manchemart_height.png b/public/models/packderelance/manchemart_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/manchemart_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/manchemart_metallic.png b/public/models/packderelance/manchemart_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/packderelance/manchemart_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/packderelance/manchemart_mixed_ao.png b/public/models/packderelance/manchemart_mixed_ao.png new file mode 100644 index 0000000..78ecb78 --- /dev/null +++ b/public/models/packderelance/manchemart_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:15e963bea1bf721725a3e64685f373c63c0de664ce4128b9554666bae6b76349 +size 185302 diff --git a/public/models/packderelance/manchemart_normal.png b/public/models/packderelance/manchemart_normal.png new file mode 100644 index 0000000..5999a0e --- /dev/null +++ b/public/models/packderelance/manchemart_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:01c8a610171b36fb12e26696818ec942c75bb47f7cfda34066f5d63dfcaf344c +size 164783 diff --git a/public/models/packderelance/manchemart_normal_opengl.png b/public/models/packderelance/manchemart_normal_opengl.png new file mode 100644 index 0000000..a9cac6e --- /dev/null +++ b/public/models/packderelance/manchemart_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c4461d87006c85001498c5377c5228f4d83c496ef809acc8ec5e1747515eb7b1 +size 165827 diff --git a/public/models/packderelance/manchemart_roughness.png b/public/models/packderelance/manchemart_roughness.png new file mode 100644 index 0000000..eb0669e --- /dev/null +++ b/public/models/packderelance/manchemart_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c7570bd18e98f42919a20d83d06cb3dcd2a11c4e2eb8e8d7a9b1806a43bf1e6d +size 71115 diff --git a/public/models/packderelance/metalness_cabledroit.png b/public/models/packderelance/metalness_cabledroit.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/packderelance/metalness_cabledroit.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/packderelance/metalness_cablegauche.png b/public/models/packderelance/metalness_cablegauche.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/packderelance/metalness_cablegauche.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/packderelance/metalness_manchemart.png b/public/models/packderelance/metalness_manchemart.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/packderelance/metalness_manchemart.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/packderelance/metalness_mousse.png b/public/models/packderelance/metalness_mousse.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/packderelance/metalness_mousse.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/packderelance/metalness_mousse_bas.png b/public/models/packderelance/metalness_mousse_bas.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/packderelance/metalness_mousse_bas.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/packderelance/metalness_puces.png b/public/models/packderelance/metalness_puces.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/packderelance/metalness_puces.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/packderelance/model.gltf b/public/models/packderelance/model.gltf new file mode 100644 index 0000000..ebf8a47 --- /dev/null +++ b/public/models/packderelance/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fb94679c14d1b0019b98fa04bbb66d9bc77b31b944201734e25c4a2d6104772d +size 4435656 diff --git a/public/models/packderelance/mousse_bas_base_color.png b/public/models/packderelance/mousse_bas_base_color.png new file mode 100644 index 0000000..09ee7d0 --- /dev/null +++ b/public/models/packderelance/mousse_bas_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:21b609193f25d95233a4d4edf7b6bf90e73537370949d40c2d923425a589476c +size 13843 diff --git a/public/models/packderelance/mousse_bas_height.png b/public/models/packderelance/mousse_bas_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/mousse_bas_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/mousse_bas_metallic.png b/public/models/packderelance/mousse_bas_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/packderelance/mousse_bas_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/packderelance/mousse_bas_mixed_ao.png b/public/models/packderelance/mousse_bas_mixed_ao.png new file mode 100644 index 0000000..7c94204 --- /dev/null +++ b/public/models/packderelance/mousse_bas_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bebff7465f570ccd48063d37e1ace0eec9b8db8715360992acaf7dbbf63804d6 +size 251328 diff --git a/public/models/packderelance/mousse_bas_normal.png b/public/models/packderelance/mousse_bas_normal.png new file mode 100644 index 0000000..0ac089c --- /dev/null +++ b/public/models/packderelance/mousse_bas_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2c704ef890feb0fb1c46b671f8e8a6230371dad7a13c4e4b18e342aec560cbb7 +size 175208 diff --git a/public/models/packderelance/mousse_bas_normal_opengl.png b/public/models/packderelance/mousse_bas_normal_opengl.png new file mode 100644 index 0000000..6d76b50 --- /dev/null +++ b/public/models/packderelance/mousse_bas_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fdf523b3fda14ef39dfa2006cc66088f75228e555a842859d6bb45b5d8d12036 +size 177660 diff --git a/public/models/packderelance/mousse_bas_roughness.png b/public/models/packderelance/mousse_bas_roughness.png new file mode 100644 index 0000000..e493c11 --- /dev/null +++ b/public/models/packderelance/mousse_bas_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3435c1e95fefd08d123099c3a1a88e5cda7f8d5d9787d8e007312267f3d35386 +size 185557 diff --git a/public/models/packderelance/mousse_base_color.png b/public/models/packderelance/mousse_base_color.png new file mode 100644 index 0000000..3c8843d --- /dev/null +++ b/public/models/packderelance/mousse_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ce5d4eedb0f41f260baa236aa45e5f96443d8f8cd11756ae6054c0f9a5aea937 +size 8751 diff --git a/public/models/packderelance/mousse_height.png b/public/models/packderelance/mousse_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/mousse_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/mousse_metallic.png b/public/models/packderelance/mousse_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/packderelance/mousse_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/packderelance/mousse_mixed_ao.png b/public/models/packderelance/mousse_mixed_ao.png new file mode 100644 index 0000000..ba99c9a --- /dev/null +++ b/public/models/packderelance/mousse_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e3a86a57b95d13c5028c2a4b5f7b7d9720de33fe46890fc759b72eac37dbc64f +size 238031 diff --git a/public/models/packderelance/mousse_normal.png b/public/models/packderelance/mousse_normal.png new file mode 100644 index 0000000..4653be8 --- /dev/null +++ b/public/models/packderelance/mousse_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f44adbf23be3bb97904dbf1bcf5ba654899e02d08eb6a5e121815770473629a +size 193683 diff --git a/public/models/packderelance/mousse_normal_opengl.png b/public/models/packderelance/mousse_normal_opengl.png new file mode 100644 index 0000000..de2f4de --- /dev/null +++ b/public/models/packderelance/mousse_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:22199dddbb6b1f581fa45dfd52f9edd523f2836ee2ee626c573c0705a62ce768 +size 193969 diff --git a/public/models/packderelance/mousse_roughness.png b/public/models/packderelance/mousse_roughness.png new file mode 100644 index 0000000..dc7b8ab --- /dev/null +++ b/public/models/packderelance/mousse_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:59787e816503401eaa8c20fe8ab472283e09523dac5f5f689c200dad5763a10b +size 215919 diff --git a/public/models/packderelance/patinf_base_color.png b/public/models/packderelance/patinf_base_color.png new file mode 100644 index 0000000..bbcac5e --- /dev/null +++ b/public/models/packderelance/patinf_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a27fdc53a87e373739863a6bb87b5de2e744f9d5ef230260f166c88ab3ce962d +size 19530 diff --git a/public/models/packderelance/patinf_height.png b/public/models/packderelance/patinf_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/patinf_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/patinf_metallic.png b/public/models/packderelance/patinf_metallic.png new file mode 100644 index 0000000..d1c34c7 --- /dev/null +++ b/public/models/packderelance/patinf_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:501418a6e2d02b552799edd80e8c5a53198ff3d499eee9b783bddb5d72afd603 +size 3179 diff --git a/public/models/packderelance/patinf_mixed_ao.png b/public/models/packderelance/patinf_mixed_ao.png new file mode 100644 index 0000000..e8bf2ec --- /dev/null +++ b/public/models/packderelance/patinf_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ae589f2edea4fc2147a57b5fb9e33a25a63f16d2aef7f4c9fc71a5ca6ae5bac5 +size 90431 diff --git a/public/models/packderelance/patinf_normal.png b/public/models/packderelance/patinf_normal.png new file mode 100644 index 0000000..2711e4d --- /dev/null +++ b/public/models/packderelance/patinf_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8ebb2add69c6a08441a30c8975cc4f6b7e5b69c165def6b1bf42b98a420a606b +size 146695 diff --git a/public/models/packderelance/patinf_normal_opengl.png b/public/models/packderelance/patinf_normal_opengl.png new file mode 100644 index 0000000..377c13b --- /dev/null +++ b/public/models/packderelance/patinf_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5b9d4baedf21c6ed4fec8a6e80fea2b8db3e9107bc0721fad63e90ecb309bbd8 +size 146723 diff --git a/public/models/packderelance/patinf_roughness.png b/public/models/packderelance/patinf_roughness.png new file mode 100644 index 0000000..b517e25 --- /dev/null +++ b/public/models/packderelance/patinf_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:50749697660eff0a5ebbb8c9d6c4182ed2b7cf847fb366da756551f9d828c2ba +size 135722 diff --git a/public/models/packderelance/patsup_base_color.png b/public/models/packderelance/patsup_base_color.png new file mode 100644 index 0000000..ead3f2a --- /dev/null +++ b/public/models/packderelance/patsup_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cc8e2bd801f75f272838e441eb2784457e38b8aae9483ea0f697adb85f12b0b5 +size 30583 diff --git a/public/models/packderelance/patsup_height.png b/public/models/packderelance/patsup_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/patsup_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/patsup_metallic.png b/public/models/packderelance/patsup_metallic.png new file mode 100644 index 0000000..892f4d3 --- /dev/null +++ b/public/models/packderelance/patsup_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:768bcad38062d5d33b6e4a8c9f012a199deb6a05366efa280fd6e4e093e8d35b +size 3178 diff --git a/public/models/packderelance/patsup_mixed_ao.png b/public/models/packderelance/patsup_mixed_ao.png new file mode 100644 index 0000000..038a8f7 --- /dev/null +++ b/public/models/packderelance/patsup_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d7eb9f5b370d007ff868c46817f65d23b0a613e683a95b421d037f59ab5e481 +size 201541 diff --git a/public/models/packderelance/patsup_normal.png b/public/models/packderelance/patsup_normal.png new file mode 100644 index 0000000..e0eedac --- /dev/null +++ b/public/models/packderelance/patsup_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:edad5421cdd8c87b3310743fd24ea2649ede92d4d598f7a5511ec14a280477ba +size 182455 diff --git a/public/models/packderelance/patsup_normal_opengl.png b/public/models/packderelance/patsup_normal_opengl.png new file mode 100644 index 0000000..5755f0c --- /dev/null +++ b/public/models/packderelance/patsup_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:05668e2a74f62600f5d6e2737c402600e7381a36b4f83f69d1df216d8df77369 +size 184924 diff --git a/public/models/packderelance/patsup_roughness.png b/public/models/packderelance/patsup_roughness.png new file mode 100644 index 0000000..befe7d9 --- /dev/null +++ b/public/models/packderelance/patsup_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:062b461aad1c49a752ed767ec8f1dbb70c5d6e8b4824a55e740c945163620c9b +size 131459 diff --git a/public/models/packderelance/puces_base_color.png b/public/models/packderelance/puces_base_color.png new file mode 100644 index 0000000..6c91328 --- /dev/null +++ b/public/models/packderelance/puces_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4945a42ce365fecb6b64549cae5519a141ff9a7e14d1ab834182ac9737c05a82 +size 46976 diff --git a/public/models/packderelance/puces_height.png b/public/models/packderelance/puces_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/puces_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/puces_metallic.png b/public/models/packderelance/puces_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/packderelance/puces_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/packderelance/puces_mixed_ao.png b/public/models/packderelance/puces_mixed_ao.png new file mode 100644 index 0000000..e3507ef --- /dev/null +++ b/public/models/packderelance/puces_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4e9cd7f981995050b483e59ac123b397d7ec5ca3d30d10215b4a9ec01a27a69 +size 222566 diff --git a/public/models/packderelance/puces_normal.png b/public/models/packderelance/puces_normal.png new file mode 100644 index 0000000..fd77f2d --- /dev/null +++ b/public/models/packderelance/puces_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9be38b03c2aa41d54235e0bf6fa491c13a24ff2ecb4db609ce62c2e83fbf6c19 +size 149845 diff --git a/public/models/packderelance/puces_normal_opengl.png b/public/models/packderelance/puces_normal_opengl.png new file mode 100644 index 0000000..aa432ed --- /dev/null +++ b/public/models/packderelance/puces_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b991ea9ce0ec7d61e33bafdae0526a0f9285777685a8e98b4e69fd22234a67a6 +size 152096 diff --git a/public/models/packderelance/puces_roughness.png b/public/models/packderelance/puces_roughness.png new file mode 100644 index 0000000..0855db0 --- /dev/null +++ b/public/models/packderelance/puces_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d89d63628794f450ce8f6503010aaf9e257b3839242a41f92a472a9ca75a3af +size 101983 diff --git a/public/models/packderelance/tetemart_base_color.png b/public/models/packderelance/tetemart_base_color.png new file mode 100644 index 0000000..6cc7455 --- /dev/null +++ b/public/models/packderelance/tetemart_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7c0bf42e601e8fd391b8a3e27db24c0d94d3cb0af794eb8bfa5ce9e011ee9bd9 +size 46981 diff --git a/public/models/packderelance/tetemart_height.png b/public/models/packderelance/tetemart_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/packderelance/tetemart_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/packderelance/tetemart_metallic.png b/public/models/packderelance/tetemart_metallic.png new file mode 100644 index 0000000..393212c --- /dev/null +++ b/public/models/packderelance/tetemart_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bf0ada122b6dd77e41fd6358ace63aea3aa9b6a328665e0bad4e3c2cdfcd7f3b +size 3179 diff --git a/public/models/packderelance/tetemart_mixed_ao.png b/public/models/packderelance/tetemart_mixed_ao.png new file mode 100644 index 0000000..597ea8e --- /dev/null +++ b/public/models/packderelance/tetemart_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a04252dab606affc6d82e133a650d94a4f75fe26bfb2c47ec9287610c157a393 +size 323501 diff --git a/public/models/packderelance/tetemart_normal.png b/public/models/packderelance/tetemart_normal.png new file mode 100644 index 0000000..611b71a --- /dev/null +++ b/public/models/packderelance/tetemart_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86c9801f4685f956cf607ee117b0c10aaf2030cf1889c8c923d20df74a97c77f +size 199509 diff --git a/public/models/packderelance/tetemart_normal_opengl.png b/public/models/packderelance/tetemart_normal_opengl.png new file mode 100644 index 0000000..db4d77f --- /dev/null +++ b/public/models/packderelance/tetemart_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:660f0f4985920305bbe62e5d6af0f1d2e00167136f7462cf71afbf33af29fe5f +size 199424 diff --git a/public/models/packderelance/tetemart_roughness.png b/public/models/packderelance/tetemart_roughness.png new file mode 100644 index 0000000..279c947 --- /dev/null +++ b/public/models/packderelance/tetemart_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7934ddff7acc3867e7f22ef450ee992c6e84a51c2f6175fbff76bb702a39f309 +size 114593 diff --git a/public/models/persoprincipal/defaultmaterial_basecolor.png b/public/models/persoprincipal/defaultmaterial_basecolor.png new file mode 100644 index 0000000..1e783b3 --- /dev/null +++ b/public/models/persoprincipal/defaultmaterial_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7cc0ae8aedd986a5b6a7d635c18760249deb991fd5169e08db95a8199dea6316 +size 567490 diff --git a/public/models/persoprincipal/defaultmaterial_normal.png b/public/models/persoprincipal/defaultmaterial_normal.png new file mode 100644 index 0000000..d89f970 --- /dev/null +++ b/public/models/persoprincipal/defaultmaterial_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc9f8d709231086437b89baf6877f856acc99a3d44e237c575ca4bfb93967c04 +size 3161415 diff --git a/public/models/persoprincipal/defaultmaterial_occlusionroughnessmetallic.png b/public/models/persoprincipal/defaultmaterial_occlusionroughnessmetallic.png new file mode 100644 index 0000000..f3c42a8 --- /dev/null +++ b/public/models/persoprincipal/defaultmaterial_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e688a68595bb24f65e30562eec2b70a2d97b279d3257b1284f6cd1d7035ba297 +size 698280 diff --git a/public/models/persoprincipal/model.gltf b/public/models/persoprincipal/model.gltf new file mode 100644 index 0000000..faa8ff2 --- /dev/null +++ b/public/models/persoprincipal/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:955c5c954519afef152989a1fb4d187e115fd5893a6a8f7119e4818bf87dc3ac +size 3136 diff --git a/public/models/potager/potager.bin b/public/models/potager/potager.bin new file mode 100644 index 0000000..2c41af6 --- /dev/null +++ b/public/models/potager/potager.bin @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6ba960011c92ed9d62232442d6244aaddffd76b0393679fcc8d99acbd0f2d708 +size 8208 diff --git a/public/models/potager/potager.gltf b/public/models/potager/potager.gltf new file mode 100644 index 0000000..b75caf5 --- /dev/null +++ b/public/models/potager/potager.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0a98064f56d0e27f8cdd66d616fce7f5efe9182e2558ec5273e7c5005bb0bbdf +size 2971 diff --git a/public/models/potager/potager_baseColor.png b/public/models/potager/potager_baseColor.png new file mode 100644 index 0000000..1525482 --- /dev/null +++ b/public/models/potager/potager_baseColor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7d303060d9b4c7b25697ecef91b94e85e3a7441e9338b4e5d63822522e92b1dd +size 572329 diff --git a/public/models/potager/potager_normal.png b/public/models/potager/potager_normal.png new file mode 100644 index 0000000..e9a7798 --- /dev/null +++ b/public/models/potager/potager_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:828b0d2fd954e6badc77023e5eddfce5bf583d0bb27a3b946e169b617af9c1f3 +size 2260045 diff --git a/public/models/potager/potager_occlusionRoughnessMetallic.png b/public/models/potager/potager_occlusionRoughnessMetallic.png new file mode 100644 index 0000000..ef86030 --- /dev/null +++ b/public/models/potager/potager_occlusionRoughnessMetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:92cf3d89aae778188dff99071d86e1c2ef911748c87f0ecec4eb5ef8d8149935 +size 16901 diff --git a/public/models/puce/model.gltf b/public/models/puce/model.gltf new file mode 100644 index 0000000..8be11e4 --- /dev/null +++ b/public/models/puce/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ecdc4def45c4fbc8c0b083edd70edac6970602d5a609ac7a1b5e8213272b8833 +size 517383 diff --git a/public/models/puce/puces_Base_color.png b/public/models/puce/puces_Base_color.png new file mode 100644 index 0000000..6c91328 --- /dev/null +++ b/public/models/puce/puces_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4945a42ce365fecb6b64549cae5519a141ff9a7e14d1ab834182ac9737c05a82 +size 46976 diff --git a/public/models/puce/puces_Height.png b/public/models/puce/puces_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/puce/puces_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/puce/puces_Metallic.png b/public/models/puce/puces_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/puce/puces_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/puce/puces_Mixed_AO.png b/public/models/puce/puces_Mixed_AO.png new file mode 100644 index 0000000..e3507ef --- /dev/null +++ b/public/models/puce/puces_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a4e9cd7f981995050b483e59ac123b397d7ec5ca3d30d10215b4a9ec01a27a69 +size 222566 diff --git a/public/models/puce/puces_Normal.png b/public/models/puce/puces_Normal.png new file mode 100644 index 0000000..fd77f2d --- /dev/null +++ b/public/models/puce/puces_Normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9be38b03c2aa41d54235e0bf6fa491c13a24ff2ecb4db609ce62c2e83fbf6c19 +size 149845 diff --git a/public/models/puce/puces_Normal_OpenGL.png b/public/models/puce/puces_Normal_OpenGL.png new file mode 100644 index 0000000..aa432ed --- /dev/null +++ b/public/models/puce/puces_Normal_OpenGL.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b991ea9ce0ec7d61e33bafdae0526a0f9285777685a8e98b4e69fd22234a67a6 +size 152096 diff --git a/public/models/puce/puces_Roughness.png b/public/models/puce/puces_Roughness.png new file mode 100644 index 0000000..0855db0 --- /dev/null +++ b/public/models/puce/puces_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4d89d63628794f450ce8f6503010aaf9e257b3839242a41f92a472a9ca75a3af +size 101983 diff --git a/public/models/pylone/cable1_base_color.png b/public/models/pylone/cable1_base_color.png index 92adffd..f1c5101 100644 --- a/public/models/pylone/cable1_base_color.png +++ b/public/models/pylone/cable1_base_color.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b155039aaf83f337711e07d0ac540baae13c9e3dcc238b663fbc736af8f9825f -size 157202 +oid sha256:e855a105690f232494d5f3959d8fd6e8512de53de6d1b8a7e13e79d44b455635 +size 170284 diff --git a/public/models/pylone/cable1_height.png b/public/models/pylone/cable1_height.png index f050ed5..713980d 100644 --- a/public/models/pylone/cable1_height.png +++ b/public/models/pylone/cable1_height.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/pylone/cable1_metallic.png b/public/models/pylone/cable1_metallic.png index c20148f..b46e54a 100644 --- a/public/models/pylone/cable1_metallic.png +++ b/public/models/pylone/cable1_metallic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/pylone/cable1_mixed_ao.png b/public/models/pylone/cable1_mixed_ao.png index 4c1d991..b21d620 100644 --- a/public/models/pylone/cable1_mixed_ao.png +++ b/public/models/pylone/cable1_mixed_ao.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:1423a670783541f882942169f160741ed545e8847a82aec826b3dc6cc2821c52 -size 140033 +oid sha256:2d3210319fea926e024d9d64c9440319550e548a7147f0998610293d05351411 +size 106768 diff --git a/public/models/pylone/cable1_normal.png b/public/models/pylone/cable1_normal.png index 29e88c2..707fa61 100644 --- a/public/models/pylone/cable1_normal.png +++ b/public/models/pylone/cable1_normal.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:679159f6bc31c9eee4e095daca90b58a7fb5cee1de6caf9a753ab0c25b428590 -size 133712 +oid sha256:d2d01588d749aa5fc4ca2598db56250d22381ca2cb5d4acf22f7e2075d9ee69f +size 145554 diff --git a/public/models/pylone/cable1_normal_opengl.png b/public/models/pylone/cable1_normal_opengl.png index 035a5f2..7fdc9e2 100644 --- a/public/models/pylone/cable1_normal_opengl.png +++ b/public/models/pylone/cable1_normal_opengl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6cf31032859a327e7743804660a35e5940212ce9f7173fbcaeffa03618a44ef7 -size 134502 +oid sha256:700e5261c9513fe08bf918e8e73c82b390bcd5b220427ae8a061150ace2bb39d +size 146495 diff --git a/public/models/pylone/cable1_roughness.png b/public/models/pylone/cable1_roughness.png index 7c49e61..59ffd1c 100644 --- a/public/models/pylone/cable1_roughness.png +++ b/public/models/pylone/cable1_roughness.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d6a0a0128f7b42a9983d766848b5651268ffbd82d4e0e11f560d09f36e3a4636 -size 68253 +oid sha256:6fee20587280c1bee1ed7a251c9584a48b4e159d45f674b6aabe58783c17049a +size 53738 diff --git a/public/models/pylone/cable2_base_color.png b/public/models/pylone/cable2_base_color.png index 3cbcd05..67aeedd 100644 --- a/public/models/pylone/cable2_base_color.png +++ b/public/models/pylone/cable2_base_color.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d29180fc40272c4dae7ff5decac7c60d0228eb58fdda3f9fd94bad5849891863 -size 134595 +oid sha256:fef27c0cae8e434723a7a200f6a490b96349a002af0e2ba583ab689a7501bb58 +size 152980 diff --git a/public/models/pylone/cable2_height.png b/public/models/pylone/cable2_height.png index f050ed5..713980d 100644 --- a/public/models/pylone/cable2_height.png +++ b/public/models/pylone/cable2_height.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/pylone/cable2_metallic.png b/public/models/pylone/cable2_metallic.png index c20148f..b46e54a 100644 --- a/public/models/pylone/cable2_metallic.png +++ b/public/models/pylone/cable2_metallic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/pylone/cable2_mixed_ao.png b/public/models/pylone/cable2_mixed_ao.png index e3f4026..d0c5f78 100644 --- a/public/models/pylone/cable2_mixed_ao.png +++ b/public/models/pylone/cable2_mixed_ao.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9efc97da8751d2a3b6887fe093de13d6efe454a6abbbf340050a81b3142bd2e7 -size 133980 +oid sha256:00fcdce71383ed2081696921fa6ef9592e653560bb7c3058f7d0ac4da6427a8c +size 100588 diff --git a/public/models/pylone/cable2_normal.png b/public/models/pylone/cable2_normal.png index 788b093..0aeb96a 100644 --- a/public/models/pylone/cable2_normal.png +++ b/public/models/pylone/cable2_normal.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:44c1aea71b9baf636f9dbae665d98639f55d4b3a16a415af43c0768ac96ebe6c -size 133445 +oid sha256:6187d87bcb23afd869017739161862832c6520754a0670c460cd326d85357c0f +size 145219 diff --git a/public/models/pylone/cable2_normal_opengl.png b/public/models/pylone/cable2_normal_opengl.png index 12e96cd..0b68af5 100644 --- a/public/models/pylone/cable2_normal_opengl.png +++ b/public/models/pylone/cable2_normal_opengl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:c81d8d9276646b9d992739e007698bc16878f0e350579e130c54f7b7074ad4fb -size 134382 +oid sha256:22660de1a0682b1abd1684f7e3fb5e2589b483eabe301f72f3e9d821fe82226e +size 146306 diff --git a/public/models/pylone/cable2_roughness.png b/public/models/pylone/cable2_roughness.png index a886d36..bdad05d 100644 --- a/public/models/pylone/cable2_roughness.png +++ b/public/models/pylone/cable2_roughness.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:51f56c6cbbce88923be6a70d4b55bd483cb7f655e0da1abf3e09b90b74752bee -size 66938 +oid sha256:603aa4f5dc13de2d56a150a3ebaf555b50d87e6928cb8f9f97d372035caf0123 +size 52660 diff --git a/public/models/pylone/chap_base_color.png b/public/models/pylone/chap_base_color.png index 7794578..747833f 100644 --- a/public/models/pylone/chap_base_color.png +++ b/public/models/pylone/chap_base_color.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:8c61605690170b80367e73e52b7b181fc46d49fdca4493ac4f0175b852f519a2 -size 75629 +oid sha256:92723a60f4f0fe39a6309fb3faec588c0178a67cf765c52646a776134d5086b6 +size 86318 diff --git a/public/models/pylone/chap_height.png b/public/models/pylone/chap_height.png index f050ed5..713980d 100644 --- a/public/models/pylone/chap_height.png +++ b/public/models/pylone/chap_height.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/pylone/chap_metallic.png b/public/models/pylone/chap_metallic.png index c20148f..b46e54a 100644 --- a/public/models/pylone/chap_metallic.png +++ b/public/models/pylone/chap_metallic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/pylone/chap_mixed_ao.png b/public/models/pylone/chap_mixed_ao.png index 907be7e..ae16438 100644 --- a/public/models/pylone/chap_mixed_ao.png +++ b/public/models/pylone/chap_mixed_ao.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a8ab5b25877815d817112d5c1bc673faa2e115689779dc89c45b9daa1eefabe3 -size 276769 +oid sha256:08db27428a9262caa0f45d814fe4e72e813cebe3ea2139417c34c749782b5071 +size 200657 diff --git a/public/models/pylone/chap_normal.png b/public/models/pylone/chap_normal.png index 8bbc4c7..a7fdf27 100644 --- a/public/models/pylone/chap_normal.png +++ b/public/models/pylone/chap_normal.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:bdd45c6ca434585f2f32ab567254cded16d8e2976a3709a090c789c771ef616d -size 166507 +oid sha256:81c90f031b04c4376d8d715f4b7087fba8174539e79270155c7ff56d3b5be726 +size 187794 diff --git a/public/models/pylone/chap_normal_opengl.png b/public/models/pylone/chap_normal_opengl.png index c687282..a31b821 100644 --- a/public/models/pylone/chap_normal_opengl.png +++ b/public/models/pylone/chap_normal_opengl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:5b74d22302e23a6f3d78c2f38267327ae5ede8d8203554260a58ff02e44be22e -size 166966 +oid sha256:7d9a52a596c1cafc8e299efcaf215b8d4501ae9ab09ed84ca36729451797ede0 +size 188092 diff --git a/public/models/pylone/chap_roughness.png b/public/models/pylone/chap_roughness.png index fb7eba7..1588b9f 100644 --- a/public/models/pylone/chap_roughness.png +++ b/public/models/pylone/chap_roughness.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b01a24b53830acbbe4a152d54070209e22129497b1933d3d882c00082d9dbbdc -size 96713 +oid sha256:cbccc4f4042014922faab436e859024a6e66656eb1b3a7aa2f80c4c48f112e76 +size 78815 diff --git a/public/models/pylone/lampe_base_color.png b/public/models/pylone/lampe_base_color.png index 874fa59..de93f3e 100644 --- a/public/models/pylone/lampe_base_color.png +++ b/public/models/pylone/lampe_base_color.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:79da86b1916ce01eb16b5b1e9dfa6ae98d57b08c3c4a34b4eb493410e99ac69c -size 411752 +oid sha256:3b1df0d30023f3f9be05c310f1d2c3fe2b80c9cc79b631f8ceee7df17bb0d7d6 +size 435213 diff --git a/public/models/pylone/lampe_height.png b/public/models/pylone/lampe_height.png index f050ed5..713980d 100644 --- a/public/models/pylone/lampe_height.png +++ b/public/models/pylone/lampe_height.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/pylone/lampe_metallic.png b/public/models/pylone/lampe_metallic.png index 878f0b9..a2a6ea5 100644 --- a/public/models/pylone/lampe_metallic.png +++ b/public/models/pylone/lampe_metallic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4587724a9ede8a283afc386b08e651f23c6d7a077ceb9e2e2401227f9f220fbe -size 151170 +oid sha256:73f0f1f9a2449135c3786b1e2a8b0308d91ce0b17e8ab419d42dbe12f6cd49ad +size 119101 diff --git a/public/models/pylone/lampe_mixed_ao.png b/public/models/pylone/lampe_mixed_ao.png index fe018b6..129ce8e 100644 --- a/public/models/pylone/lampe_mixed_ao.png +++ b/public/models/pylone/lampe_mixed_ao.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06d90cf3851058665ad5337e05d2c86b7fe7c42aadc5f1e77c9037fde772ad00 -size 423131 +oid sha256:79a620d8bf89c36ac579e361a0383f2e00cc0a46bd20af3866a272fbdb66cf44 +size 333234 diff --git a/public/models/pylone/lampe_normal.png b/public/models/pylone/lampe_normal.png index 1db418f..3fbc93b 100644 --- a/public/models/pylone/lampe_normal.png +++ b/public/models/pylone/lampe_normal.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:769112391a0c246ab27b97c9bdc9d24114858fc2fc89296f5a5a96950db54687 -size 378703 +oid sha256:670b8083516218cfa7fee2abfc4b5647bc7c97c513b6ffda6c81544078b190d1 +size 416583 diff --git a/public/models/pylone/lampe_normal_opengl.png b/public/models/pylone/lampe_normal_opengl.png index 40fdbba..ce6b274 100644 --- a/public/models/pylone/lampe_normal_opengl.png +++ b/public/models/pylone/lampe_normal_opengl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:d7e0775019367441e76c4e6cb39d00bfacc6ecf0ceb2821449de8372e10c9a4a -size 382039 +oid sha256:16f4756e77ffb2b96b4964dbf3ba1a455cc551ab04eedbad5f9b25476652e064 +size 420113 diff --git a/public/models/pylone/lampe_opacity.png b/public/models/pylone/lampe_opacity.png index b454bd4..377c715 100644 --- a/public/models/pylone/lampe_opacity.png +++ b/public/models/pylone/lampe_opacity.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4e51b3f78127bac9ff1b82245f0bf6e1b4349d4e683c03b1d47c14c643316455 -size 4567 +oid sha256:d3bdaa1be72aa14047f2a4c50e112e9e428a088bbbaa5153ad40ae2897decf2b +size 3179 diff --git a/public/models/pylone/lampe_roughness.png b/public/models/pylone/lampe_roughness.png index 7aa9f91..f25e00b 100644 --- a/public/models/pylone/lampe_roughness.png +++ b/public/models/pylone/lampe_roughness.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:95c9b1e3aeabc1a6cd3ec2af560b4935fb7970131a8300eb818b55d06b777e2f -size 219313 +oid sha256:23a8670ac6eb007f98005bf66c49168f20dbb89957478da0254a568e93b71b35 +size 176715 diff --git a/public/models/pylone/panneaux_base_color.png b/public/models/pylone/panneaux_base_color.png index 063f1cb..4b9de68 100644 --- a/public/models/pylone/panneaux_base_color.png +++ b/public/models/pylone/panneaux_base_color.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:75fecec2c06a57faaf5da0e7eb160dc5b085f9a99d0294bb0fe0d82db5fbb49f -size 142582 +oid sha256:86cd37f97c5a3f6d381c8aefee406e784e7827cd895d870354624384fe1b79e7 +size 156525 diff --git a/public/models/pylone/panneaux_height.png b/public/models/pylone/panneaux_height.png index f050ed5..713980d 100644 --- a/public/models/pylone/panneaux_height.png +++ b/public/models/pylone/panneaux_height.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/pylone/panneaux_metallic.png b/public/models/pylone/panneaux_metallic.png index c20148f..b46e54a 100644 --- a/public/models/pylone/panneaux_metallic.png +++ b/public/models/pylone/panneaux_metallic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/pylone/panneaux_mixed_ao.png b/public/models/pylone/panneaux_mixed_ao.png index 5720661..e2ac5c4 100644 --- a/public/models/pylone/panneaux_mixed_ao.png +++ b/public/models/pylone/panneaux_mixed_ao.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6f20561cddbc2a32f15bf88a97d7c2fcdf41bec8bc8af40bac63c0bc16432c14 -size 324805 +oid sha256:a73fc0135fbacb8be5a64251dabe071e402d48c9d0f4c2bd25fc033c92eafbc6 +size 237957 diff --git a/public/models/pylone/panneaux_normal.png b/public/models/pylone/panneaux_normal.png index 6180519..d910f65 100644 --- a/public/models/pylone/panneaux_normal.png +++ b/public/models/pylone/panneaux_normal.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:ec2c7197c0751cb42bb4da68dc9fdaf3972bd7af10acd970bc45ccd061f067c0 -size 71216 +oid sha256:54f044e90f7a96a9d9218733b9a4136c164f0c60f4389baa4d0f14b2cbef8270 +size 83209 diff --git a/public/models/pylone/panneaux_normal_opengl.png b/public/models/pylone/panneaux_normal_opengl.png index d06edc0..2956cf0 100644 --- a/public/models/pylone/panneaux_normal_opengl.png +++ b/public/models/pylone/panneaux_normal_opengl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:57f5c13fee27dca1476546b2042539723f3e8e9c1d0a18bda65dc77297a65661 -size 73816 +oid sha256:537b66ad9e53107bc4b577877ce2282d612de6e38241f5911a2f330ef9ed4c22 +size 86378 diff --git a/public/models/pylone/panneaux_roughness.png b/public/models/pylone/panneaux_roughness.png index 3a35685..3848015 100644 --- a/public/models/pylone/panneaux_roughness.png +++ b/public/models/pylone/panneaux_roughness.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:89c2fc84f78f474d9dc031ce8a24866dda3875fa53c3b83bea95d2b39d15f5ee -size 59503 +oid sha256:5a4c3430448c893a4c9b13c24b6ba450d2a54ecc19fe73f8a6e07244499f4f13 +size 47993 diff --git a/public/models/pylone/pied_base_color.png b/public/models/pylone/pied_base_color.png index 3436379..bf377ef 100644 --- a/public/models/pylone/pied_base_color.png +++ b/public/models/pylone/pied_base_color.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:065b88036d25235b9f4c9369bffdf93758534465962f26434795eac0fe16699e -size 201333 +oid sha256:d0175ecfec561cc3614884bfd2a06095715c799f148d20e86c136ef6a3b0d022 +size 220660 diff --git a/public/models/pylone/pied_height.png b/public/models/pylone/pied_height.png index f050ed5..713980d 100644 --- a/public/models/pylone/pied_height.png +++ b/public/models/pylone/pied_height.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/pylone/pied_metallic.png b/public/models/pylone/pied_metallic.png index c20148f..b46e54a 100644 --- a/public/models/pylone/pied_metallic.png +++ b/public/models/pylone/pied_metallic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/pylone/pied_mixed_ao.png b/public/models/pylone/pied_mixed_ao.png index c4f708b..e0b72f3 100644 --- a/public/models/pylone/pied_mixed_ao.png +++ b/public/models/pylone/pied_mixed_ao.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:2924f8ea9694d011c1066cfdb10b40c9a6d60eb78dfdac360125b85f912ad4b3 -size 373305 +oid sha256:cf789a1fdd11527c58d70fe288ad149f5f032e677805e914e8142a83895b6b63 +size 268116 diff --git a/public/models/pylone/pied_normal.png b/public/models/pylone/pied_normal.png index fbea87f..8b3b7bd 100644 --- a/public/models/pylone/pied_normal.png +++ b/public/models/pylone/pied_normal.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4904bd1c43d2cae3e34e566f6e6fe71bbc63e4c9b007a153c6eae3aa44f36352 -size 238878 +oid sha256:1070e5d8ae0b38b979bf34f80c03e00a628b21b53bfe64e2a801fccfb976847f +size 259296 diff --git a/public/models/pylone/pied_normal_opengl.png b/public/models/pylone/pied_normal_opengl.png index d312408..648434d 100644 --- a/public/models/pylone/pied_normal_opengl.png +++ b/public/models/pylone/pied_normal_opengl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a857112c1180219761f00ef2b564db2d350e51510cf1ccf415dc7bdf221269c4 -size 240485 +oid sha256:77678fa53d89918eefc61f1a6942075cb73e38ff30f9ace95d7916e250d20af3 +size 261233 diff --git a/public/models/pylone/pied_roughness.png b/public/models/pylone/pied_roughness.png index ae6c213..2d705d1 100644 --- a/public/models/pylone/pied_roughness.png +++ b/public/models/pylone/pied_roughness.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:06bd76e0adeda2bc94162ac0b9571ca5b7f4d949ccb87ac0291570742f6aa238 -size 136145 +oid sha256:919f981e76f106cf597b90ff0f0d175a3bb61beee039a92b370445f463d52516 +size 104005 diff --git a/public/models/pylone/puces_base_color.png b/public/models/pylone/puces_base_color.png index 7c7bae3..566ec43 100644 --- a/public/models/pylone/puces_base_color.png +++ b/public/models/pylone/puces_base_color.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:66fc6da61de4c66e3384a42bc079511aac12ed2db897b0f802d81faec1ba3fe9 -size 317992 +oid sha256:9e1b5e8e6c40fd84b7d1220990653359933880e478f9dd5122d2f8359d12fb97 +size 343406 diff --git a/public/models/pylone/puces_height.png b/public/models/pylone/puces_height.png index f050ed5..713980d 100644 --- a/public/models/pylone/puces_height.png +++ b/public/models/pylone/puces_height.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/pylone/puces_metallic.png b/public/models/pylone/puces_metallic.png index c20148f..b46e54a 100644 --- a/public/models/pylone/puces_metallic.png +++ b/public/models/pylone/puces_metallic.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/pylone/puces_mixed_ao.png b/public/models/pylone/puces_mixed_ao.png index 1fc379c..7c4ea3c 100644 --- a/public/models/pylone/puces_mixed_ao.png +++ b/public/models/pylone/puces_mixed_ao.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:96841cd44e0ba69f8f4a1b934f02461842851d3dcce2cde3f9862de86370db59 -size 368903 +oid sha256:c217f278d763ba946e5133c85d45295090cd9a790650af6f084bdd8d169bb5ab +size 262622 diff --git a/public/models/pylone/puces_normal.png b/public/models/pylone/puces_normal.png index d935a04..addb846 100644 --- a/public/models/pylone/puces_normal.png +++ b/public/models/pylone/puces_normal.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:b0b2075e3f00fec2223a9e38f651a59d6253ab5fc30d466b4c3445d82462cdc7 -size 112673 +oid sha256:d4f066202057a3edcdf154c9174f1520ec44bf4ce9bab75a24c515b4c4cd3b52 +size 129597 diff --git a/public/models/pylone/puces_normal_opengl.png b/public/models/pylone/puces_normal_opengl.png index 6f47f2f..fb4e86d 100644 --- a/public/models/pylone/puces_normal_opengl.png +++ b/public/models/pylone/puces_normal_opengl.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:9830ebcaf275c64eacf7352498ad9189bf0c9a17c1ea02b160a93865a1b094cf -size 116788 +oid sha256:4f4e1e08446160b90a55c8f3f7b478cbcf7ea2084add0ad406fe25c1f3b92175 +size 133187 diff --git a/public/models/pylone/puces_roughness.png b/public/models/pylone/puces_roughness.png index a9457c0..50a2a9b 100644 --- a/public/models/pylone/puces_roughness.png +++ b/public/models/pylone/puces_roughness.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:a716ccfd19bd441e5fbc34d8ac5bbf9c89c7d64b357a865c66a671a533465789 -size 77791 +oid sha256:814dccc984084f46d5e09a62f5001441d96aa6aa928f3dcbf2b14e73ad975cb6 +size 63405 diff --git a/public/models/refroidisseur/height_refroidisseur.png b/public/models/refroidisseur/height_refroidisseur.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/refroidisseur/height_refroidisseur.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/refroidisseur/model.gltf b/public/models/refroidisseur/model.gltf new file mode 100644 index 0000000..06003c7 --- /dev/null +++ b/public/models/refroidisseur/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a73bf75ca13f413baeb14cf582801f8a5e91bd2d579d0f164e168a06cdd21591 +size 5443 diff --git a/public/models/refroidisseur/refroidisseur_base_color.png b/public/models/refroidisseur/refroidisseur_base_color.png new file mode 100644 index 0000000..d2b432c --- /dev/null +++ b/public/models/refroidisseur/refroidisseur_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:db7b8f995889058dcd455939d00ace96a81b19d18819246bfbc7b7149b43d00c +size 459805 diff --git a/public/models/refroidisseur/refroidisseur_height.png b/public/models/refroidisseur/refroidisseur_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/refroidisseur/refroidisseur_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/refroidisseur/refroidisseur_metallic.png b/public/models/refroidisseur/refroidisseur_metallic.png new file mode 100644 index 0000000..b2057f8 --- /dev/null +++ b/public/models/refroidisseur/refroidisseur_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bc4e1bf8a2a60bd9e2499ec2368396003339a5d226baf0cf7eba560ae96730d2 +size 315061 diff --git a/public/models/refroidisseur/refroidisseur_mixed_ao.png b/public/models/refroidisseur/refroidisseur_mixed_ao.png new file mode 100644 index 0000000..be616b5 --- /dev/null +++ b/public/models/refroidisseur/refroidisseur_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e054fe664150576e4a7295baa72eee6d6cd8d9793906bb2700b04d0bcfd18843 +size 450738 diff --git a/public/models/refroidisseur/refroidisseur_normal.png b/public/models/refroidisseur/refroidisseur_normal.png new file mode 100644 index 0000000..07a427e --- /dev/null +++ b/public/models/refroidisseur/refroidisseur_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4aae16604ac46db6f50bc3931326a4b8aaf6e6ca5282bd0142a3347240e3107c +size 344439 diff --git a/public/models/refroidisseur/refroidisseur_normal_opengl.png b/public/models/refroidisseur/refroidisseur_normal_opengl.png new file mode 100644 index 0000000..f47ff7d --- /dev/null +++ b/public/models/refroidisseur/refroidisseur_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cec6fc9f03c3cbca3f59df127f1b4f00898d5856d6b60d9a1343b7f6bba018dd +size 344394 diff --git a/public/models/refroidisseur/refroidisseur_roughness.png b/public/models/refroidisseur/refroidisseur_roughness.png new file mode 100644 index 0000000..6d75f96 --- /dev/null +++ b/public/models/refroidisseur/refroidisseur_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de7b20fbb9a50c6028ae4f2b8fee66879e1d553421c4a99755fdf21f11eb9b74 +size 262573 diff --git a/public/models/sapin/mat.1_basecolor.png b/public/models/sapin/mat.1_basecolor.png new file mode 100644 index 0000000..6240aa1 --- /dev/null +++ b/public/models/sapin/mat.1_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b5d83cca6440eecb67ac2e87ad3a156985fabe746831f165370c9fc88c7d7b3d +size 388119 diff --git a/public/models/sapin/mat.1_normal.png b/public/models/sapin/mat.1_normal.png new file mode 100644 index 0000000..635fc57 --- /dev/null +++ b/public/models/sapin/mat.1_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e8fdcaeb984716286644ac178fa1eb519bb8e64d0873afaa3b33406ae037c51a +size 2727481 diff --git a/public/models/sapin/mat.1_occlusionroughnessmetallic.png b/public/models/sapin/mat.1_occlusionroughnessmetallic.png new file mode 100644 index 0000000..78d1a6e --- /dev/null +++ b/public/models/sapin/mat.1_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9d4e50b51b8c9d21af2ba47257a22d64fd92492686dc38bee94aa8f85660a01b +size 154331 diff --git a/public/models/sapin/mat_basecolor.png b/public/models/sapin/mat_basecolor.png new file mode 100644 index 0000000..c6f769d --- /dev/null +++ b/public/models/sapin/mat_basecolor.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2bc329c432869cece7f319a4b48bc55874eeca11905b94bdc6537692a92edb57 +size 267335 diff --git a/public/models/sapin/mat_normal.png b/public/models/sapin/mat_normal.png new file mode 100644 index 0000000..988577d --- /dev/null +++ b/public/models/sapin/mat_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:408c065a37a1092b8e0f54935e7c428650c640ec8d63391a6c5689804c9068f1 +size 2408254 diff --git a/public/models/sapin/mat_occlusionroughnessmetallic.png b/public/models/sapin/mat_occlusionroughnessmetallic.png new file mode 100644 index 0000000..0b2584b --- /dev/null +++ b/public/models/sapin/mat_occlusionroughnessmetallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e159b9b88d08812ffefe9f8a3b4605be01277038e89a37d0b1f9a7728a38cd0e +size 16901 diff --git a/public/models/sapin/model.gltf b/public/models/sapin/model.gltf new file mode 100644 index 0000000..df975c6 --- /dev/null +++ b/public/models/sapin/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:898e7cea4edeb0a5f3d46312fe6b63ec5f5db8d5642e2202ad86decf3817e40f +size 5811 diff --git a/public/models/sky/model.glb b/public/models/sky/model.glb new file mode 100644 index 0000000..0f3feb7 --- /dev/null +++ b/public/models/sky/model.glb @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8f2a39ec378538c2b28064437f794963fad4f3091dc960e5feca63dff7c60d85 +size 329420 diff --git a/public/models/talkie/antenne_Base_color.png b/public/models/talkie/antenne_Base_color.png new file mode 100644 index 0000000..db60934 --- /dev/null +++ b/public/models/talkie/antenne_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:fc5ba4130daed3b1edae078cc73ad5a4d9955c8c464abcbc6af2a80077842f7a +size 312866 diff --git a/public/models/talkie/antenne_Height.png b/public/models/talkie/antenne_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/antenne_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/antenne_Metallic.png b/public/models/talkie/antenne_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/antenne_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/antenne_Mixed_AO.png b/public/models/talkie/antenne_Mixed_AO.png new file mode 100644 index 0000000..3ba6e13 --- /dev/null +++ b/public/models/talkie/antenne_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f3ec5ee97080be475cf3f3da71ca440dac8ccbe104510f519d1b4ee928d5b2b9 +size 187817 diff --git a/public/models/talkie/antenne_Roughness.png b/public/models/talkie/antenne_Roughness.png new file mode 100644 index 0000000..e6233e4 --- /dev/null +++ b/public/models/talkie/antenne_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:91c3fb77f1204027e6d0d46e59dc6b68cd13fc68099b20612b75749460a3c8b8 +size 69233 diff --git a/public/models/talkie/antenne_normal.png b/public/models/talkie/antenne_normal.png new file mode 100644 index 0000000..bf16203 --- /dev/null +++ b/public/models/talkie/antenne_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:da8e995d1260a97d5f1c099aa51ccf35123316264751c940bb5e71e3d115c133 +size 205065 diff --git a/public/models/talkie/antenne_normal_opengl.png b/public/models/talkie/antenne_normal_opengl.png new file mode 100644 index 0000000..7c1dc2b --- /dev/null +++ b/public/models/talkie/antenne_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c1ec8c53b5e60fb3f13da3db4b787a6dd667f51c05eb92e925902b33c5fb68f5 +size 204007 diff --git a/public/models/talkie/boutona_Base_color.png b/public/models/talkie/boutona_Base_color.png new file mode 100644 index 0000000..f493f55 --- /dev/null +++ b/public/models/talkie/boutona_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ef47a91bfd020de0983e75bc8bc03277b651c894da0f006dc49d5bfb91e86623 +size 473199 diff --git a/public/models/talkie/boutona_Height.png b/public/models/talkie/boutona_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/boutona_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/boutona_Metallic.png b/public/models/talkie/boutona_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/boutona_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/boutona_Mixed_AO.png b/public/models/talkie/boutona_Mixed_AO.png new file mode 100644 index 0000000..d28322d --- /dev/null +++ b/public/models/talkie/boutona_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f45671cafcc91e40f67120f22f7b58c75a9bf5289f8dd67019d7c836253e8942 +size 244343 diff --git a/public/models/talkie/boutona_Roughness.png b/public/models/talkie/boutona_Roughness.png new file mode 100644 index 0000000..daa6677 --- /dev/null +++ b/public/models/talkie/boutona_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:adaedf0e287c99669b47a0e3e3b99ed2c6f1f5a761e69168418e56610d7d8f9a +size 54561 diff --git a/public/models/talkie/boutona_normal.png b/public/models/talkie/boutona_normal.png new file mode 100644 index 0000000..4cf6138 --- /dev/null +++ b/public/models/talkie/boutona_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9c0e761804d0546dc6cd9d929fdecab8f6852866a6f2025c03c76c34b2040ee0 +size 175939 diff --git a/public/models/talkie/boutona_normal_opengl.png b/public/models/talkie/boutona_normal_opengl.png new file mode 100644 index 0000000..80416e2 --- /dev/null +++ b/public/models/talkie/boutona_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:86c390222c74160382b92a5736664c37e3861937db2e2d58699643516fc52995 +size 176366 diff --git a/public/models/talkie/boutonb_Base_color.png b/public/models/talkie/boutonb_Base_color.png new file mode 100644 index 0000000..ed59d49 --- /dev/null +++ b/public/models/talkie/boutonb_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:84973c1c06bf83beacd0987c5d252560ec92e09701b3ac6b73289f39392c21da +size 496575 diff --git a/public/models/talkie/boutonb_Height.png b/public/models/talkie/boutonb_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/boutonb_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/boutonb_Metallic.png b/public/models/talkie/boutonb_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/boutonb_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/boutonb_Mixed_AO.png b/public/models/talkie/boutonb_Mixed_AO.png new file mode 100644 index 0000000..8292910 --- /dev/null +++ b/public/models/talkie/boutonb_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d58e8ec5e90125edd38f279ee1b9fee863b75d8396fef6a0c22a9af6a9c0a341 +size 239658 diff --git a/public/models/talkie/boutonb_Roughness.png b/public/models/talkie/boutonb_Roughness.png new file mode 100644 index 0000000..acba391 --- /dev/null +++ b/public/models/talkie/boutonb_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ad833228a99505d0fea7495970bfbf47d3942a86d457aca379b99d8224d8633f +size 54522 diff --git a/public/models/talkie/boutonb_normal.png b/public/models/talkie/boutonb_normal.png new file mode 100644 index 0000000..943917e --- /dev/null +++ b/public/models/talkie/boutonb_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:53e5d76fcd40986674d93f289cea51c6b839d720787d98ed4112164e20558bd2 +size 176052 diff --git a/public/models/talkie/boutonb_normal_opengl.png b/public/models/talkie/boutonb_normal_opengl.png new file mode 100644 index 0000000..47539e6 --- /dev/null +++ b/public/models/talkie/boutonb_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4a1ea79411217de422f6f7fd160c673e01a2a09ebce1d95a6b5e63c8c1e5de18 +size 176723 diff --git a/public/models/talkie/cable1_Base_color.png b/public/models/talkie/cable1_Base_color.png new file mode 100644 index 0000000..0aa378c --- /dev/null +++ b/public/models/talkie/cable1_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:967d8771fbcd5427bf0005b147ecae38ab53271c4a99980f34db1102d0cb35f0 +size 178767 diff --git a/public/models/talkie/cable1_Height.png b/public/models/talkie/cable1_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/cable1_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/cable1_Metallic.png b/public/models/talkie/cable1_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/cable1_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/cable1_Mixed_AO.png b/public/models/talkie/cable1_Mixed_AO.png new file mode 100644 index 0000000..2003ade --- /dev/null +++ b/public/models/talkie/cable1_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:73378e05b925c39d37e3cfdb1048d891b6216927fbd9eab111a61051d9c5fadd +size 142820 diff --git a/public/models/talkie/cable1_Roughness.png b/public/models/talkie/cable1_Roughness.png new file mode 100644 index 0000000..c1c9096 --- /dev/null +++ b/public/models/talkie/cable1_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6a2a10008bf8a90ca1e7ef831944d8e6b2c41d5aa9b5a1f20f49d7dcc942b9f2 +size 56819 diff --git a/public/models/talkie/cable1_normal.png b/public/models/talkie/cable1_normal.png new file mode 100644 index 0000000..8f1338d --- /dev/null +++ b/public/models/talkie/cable1_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:cb4d0e26c8d16fcb471e2812585fb27ddfbce4500c526fce512d61f7611c5b99 +size 186292 diff --git a/public/models/talkie/cable1_normal_opengl.png b/public/models/talkie/cable1_normal_opengl.png new file mode 100644 index 0000000..456bcdb --- /dev/null +++ b/public/models/talkie/cable1_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8854c9b53ac97ce6113d351aa528d9a6664e90947678aee05731695e034d1c79 +size 187073 diff --git a/public/models/talkie/cable2_Base_color.png b/public/models/talkie/cable2_Base_color.png new file mode 100644 index 0000000..ba3be72 --- /dev/null +++ b/public/models/talkie/cable2_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b1bdd610bf135a20471bc2b65e53f2a2333ab6e845380f55fed93d45dce1897 +size 210840 diff --git a/public/models/talkie/cable2_Height.png b/public/models/talkie/cable2_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/cable2_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/cable2_Metallic.png b/public/models/talkie/cable2_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/cable2_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/cable2_Mixed_AO.png b/public/models/talkie/cable2_Mixed_AO.png new file mode 100644 index 0000000..e3a64cc --- /dev/null +++ b/public/models/talkie/cable2_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:30e8e315f7950a91135bba6ac43d04563b1e501e83cfb4b57048320768602bc5 +size 167450 diff --git a/public/models/talkie/cable2_Roughness.png b/public/models/talkie/cable2_Roughness.png new file mode 100644 index 0000000..a9440d4 --- /dev/null +++ b/public/models/talkie/cable2_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0d9e3cc7a29c90c1712196c05915bea480124dddc0db47db9415f738f895660c +size 60898 diff --git a/public/models/talkie/cable2_normal.png b/public/models/talkie/cable2_normal.png new file mode 100644 index 0000000..acc99fd --- /dev/null +++ b/public/models/talkie/cable2_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b09eae40cd4d52c348933f49347691f08dc6f25d929ddadbeddd2157444c706f +size 195384 diff --git a/public/models/talkie/cable2_normal_opengl.png b/public/models/talkie/cable2_normal_opengl.png new file mode 100644 index 0000000..d184f94 --- /dev/null +++ b/public/models/talkie/cable2_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ff1ae64895328cae7bf8816a43eb38ca4db82b7979d02db927bc307fa7ec66c6 +size 196010 diff --git a/public/models/talkie/cadre_Base_color.png b/public/models/talkie/cadre_Base_color.png new file mode 100644 index 0000000..afbe925 --- /dev/null +++ b/public/models/talkie/cadre_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:637e73b56419d8390e8aeb27433fdee21264c9d5b28e1caaf7e1357f6c191fd3 +size 280049 diff --git a/public/models/talkie/cadre_Height.png b/public/models/talkie/cadre_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/cadre_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/cadre_Metallic.png b/public/models/talkie/cadre_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/cadre_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/cadre_Mixed_AO.png b/public/models/talkie/cadre_Mixed_AO.png new file mode 100644 index 0000000..0151384 --- /dev/null +++ b/public/models/talkie/cadre_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e1f9912860e5f508e0e29ef1e03943101cdb287a1c34bd0278ac237824255da5 +size 157683 diff --git a/public/models/talkie/cadre_Roughness.png b/public/models/talkie/cadre_Roughness.png new file mode 100644 index 0000000..264a6e4 --- /dev/null +++ b/public/models/talkie/cadre_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:afb28f17a6f419356f49088c8c5b8d12b6aaf2471ee7e35ef42e0fda3a5365f2 +size 53784 diff --git a/public/models/talkie/cadre_normal.png b/public/models/talkie/cadre_normal.png new file mode 100644 index 0000000..8d2a5a3 --- /dev/null +++ b/public/models/talkie/cadre_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:982a042d28061ce926c80293129985733aba79bc7115e0f5b55e4f4186808f5a +size 52817 diff --git a/public/models/talkie/cadre_normal_opengl.png b/public/models/talkie/cadre_normal_opengl.png new file mode 100644 index 0000000..46032a3 --- /dev/null +++ b/public/models/talkie/cadre_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:58d63de38e7fefca7ec94b4057b37256c477dbd2749f950f0bd373932b52cbf9 +size 52737 diff --git a/public/models/talkie/e_cran_base_color.png b/public/models/talkie/e_cran_base_color.png new file mode 100644 index 0000000..a8c2149 --- /dev/null +++ b/public/models/talkie/e_cran_base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f75363e70ffed07a182a3e61d7c301cb8fd053ac8ec784d56e9450335167dce8 +size 6502 diff --git a/public/models/talkie/e_cran_height.png b/public/models/talkie/e_cran_height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/e_cran_height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/e_cran_metallic.png b/public/models/talkie/e_cran_metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/e_cran_metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/e_cran_mixed_ao.png b/public/models/talkie/e_cran_mixed_ao.png new file mode 100644 index 0000000..e91eb6e --- /dev/null +++ b/public/models/talkie/e_cran_mixed_ao.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4f3fd92f328f0733f9cb9865209466c251f4edf4750654eb0385b519300cf34 +size 329712 diff --git a/public/models/talkie/e_cran_normal.png b/public/models/talkie/e_cran_normal.png new file mode 100644 index 0000000..175152b --- /dev/null +++ b/public/models/talkie/e_cran_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a07dd2bf8fe1d37b9a74d2ca09b8a77d8a97029d41a8483e34ba30bd8e9efc04 +size 74315 diff --git a/public/models/talkie/e_cran_normal_opengl.png b/public/models/talkie/e_cran_normal_opengl.png new file mode 100644 index 0000000..e17d9b3 --- /dev/null +++ b/public/models/talkie/e_cran_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca90a32ea8b1dadb11a5cf2e41d4d096920fd7a2ab493dec96682a479d4e7a8c +size 74316 diff --git a/public/models/talkie/e_cran_roughness.png b/public/models/talkie/e_cran_roughness.png new file mode 100644 index 0000000..ad642fa --- /dev/null +++ b/public/models/talkie/e_cran_roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:700f97e34547f14a62a45858218e56eb3715a278380c2f1f14be9ca6feaae959 +size 72768 diff --git a/public/models/talkie/hautparleur_Base_color.png b/public/models/talkie/hautparleur_Base_color.png new file mode 100644 index 0000000..9e43314 --- /dev/null +++ b/public/models/talkie/hautparleur_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:36168017b9c2d6961f869f461812a53ed4bdb49f24f350452f4604009acb6fe8 +size 658014 diff --git a/public/models/talkie/hautparleur_Height.png b/public/models/talkie/hautparleur_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/hautparleur_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/hautparleur_Metallic.png b/public/models/talkie/hautparleur_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/hautparleur_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/hautparleur_Mixed_AO.png b/public/models/talkie/hautparleur_Mixed_AO.png new file mode 100644 index 0000000..f2bfd28 --- /dev/null +++ b/public/models/talkie/hautparleur_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:29ac8737a9eccff201ad351b4b403e93ed65c7a082052c1070455bc7c795bcbb +size 201135 diff --git a/public/models/talkie/hautparleur_Roughness.png b/public/models/talkie/hautparleur_Roughness.png new file mode 100644 index 0000000..17ac038 --- /dev/null +++ b/public/models/talkie/hautparleur_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9f7c1e238150662981d8a4d003045021ee0cca21af14dc79a9180671c6a82621 +size 74349 diff --git a/public/models/talkie/hautparleur_normal.png b/public/models/talkie/hautparleur_normal.png new file mode 100644 index 0000000..5d89a1c --- /dev/null +++ b/public/models/talkie/hautparleur_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:65edaf688e31787da8deb864079aed068cc71775dbbde4c350481896c2d8a204 +size 98635 diff --git a/public/models/talkie/hautparleur_normal_opengl.png b/public/models/talkie/hautparleur_normal_opengl.png new file mode 100644 index 0000000..814a2b3 --- /dev/null +++ b/public/models/talkie/hautparleur_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c689c9d28d984f54e5647de38423f34da442b8e8cac076052bfa5df07457fb1c +size 98768 diff --git a/public/models/talkie/height_antenne.png b/public/models/talkie/height_antenne.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_antenne.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/height_boutona.png b/public/models/talkie/height_boutona.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_boutona.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/height_boutonb.png b/public/models/talkie/height_boutonb.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_boutonb.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/height_cable1.png b/public/models/talkie/height_cable1.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_cable1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/height_cable2.png b/public/models/talkie/height_cable2.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_cable2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/height_cadre.png b/public/models/talkie/height_cadre.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_cadre.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/height_e_cran.png b/public/models/talkie/height_e_cran.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_e_cran.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/height_hautparleur.png b/public/models/talkie/height_hautparleur.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_hautparleur.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/height_prise.png b/public/models/talkie/height_prise.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_prise.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/height_talkie.png b/public/models/talkie/height_talkie.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_talkie.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/height_touches.png b/public/models/talkie/height_touches.png deleted file mode 100644 index f050ed5..0000000 --- a/public/models/talkie/height_touches.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:26e889b7fb848ce986dbd1e0c748617611d77cb357efa400c10467b6e4e26939 -size 4566 diff --git a/public/models/talkie/metalness_antenne.png b/public/models/talkie/metalness_antenne.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_antenne.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/metalness_boutona.png b/public/models/talkie/metalness_boutona.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_boutona.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/metalness_boutonb.png b/public/models/talkie/metalness_boutonb.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_boutonb.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/metalness_cable1.png b/public/models/talkie/metalness_cable1.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_cable1.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/metalness_cable2.png b/public/models/talkie/metalness_cable2.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_cable2.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/metalness_cadre.png b/public/models/talkie/metalness_cadre.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_cadre.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/metalness_e_cran.png b/public/models/talkie/metalness_e_cran.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_e_cran.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/metalness_hautparleur.png b/public/models/talkie/metalness_hautparleur.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_hautparleur.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/metalness_prise.png b/public/models/talkie/metalness_prise.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_prise.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/metalness_talkie.png b/public/models/talkie/metalness_talkie.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_talkie.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/metalness_touches.png b/public/models/talkie/metalness_touches.png deleted file mode 100644 index c20148f..0000000 --- a/public/models/talkie/metalness_touches.png +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:f918964b8812946ee4b6a23cf8c9debf1617575bc6db6cd0dffb21a815d79213 -size 3150 diff --git a/public/models/talkie/model.gltf b/public/models/talkie/model.gltf new file mode 100644 index 0000000..5caa83b --- /dev/null +++ b/public/models/talkie/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:694acec3219e3cb0dbce0e9739bc3c6655dbf5360f104d50a52618e06d90c946 +size 63007 diff --git a/public/models/talkie/prise_Base_color.png b/public/models/talkie/prise_Base_color.png new file mode 100644 index 0000000..30d846f --- /dev/null +++ b/public/models/talkie/prise_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7e012c8775c6eb274a80856394fac6673f7beb754c2f78e1c51c842ac017fdd5 +size 472487 diff --git a/public/models/talkie/prise_Height.png b/public/models/talkie/prise_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/prise_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/prise_Metallic.png b/public/models/talkie/prise_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/prise_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/prise_Mixed_AO.png b/public/models/talkie/prise_Mixed_AO.png new file mode 100644 index 0000000..1ed1f71 --- /dev/null +++ b/public/models/talkie/prise_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a7ae156409544d00bf3332fb542aaec0711d4ce4c9d39d4bd573fb4f0212051 +size 230780 diff --git a/public/models/talkie/prise_Roughness.png b/public/models/talkie/prise_Roughness.png new file mode 100644 index 0000000..c827dba --- /dev/null +++ b/public/models/talkie/prise_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:161c97c6ad56619ad702cc955a26ea92203575f31bb35ebc8ca398b48aae9889 +size 100073 diff --git a/public/models/talkie/prise_normal.png b/public/models/talkie/prise_normal.png new file mode 100644 index 0000000..5bcffa1 --- /dev/null +++ b/public/models/talkie/prise_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3c00bec06b1bbd954eb91872fa8cd817f247b275c16e6c372db52189ba6f3778 +size 212856 diff --git a/public/models/talkie/prise_normal_opengl.png b/public/models/talkie/prise_normal_opengl.png new file mode 100644 index 0000000..6bc3741 --- /dev/null +++ b/public/models/talkie/prise_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aa8e8d378a595f8aafc4cd34ecac65426a03847a402f955b7b0280f0383d40eb +size 224961 diff --git a/public/models/talkie/talkie_Base_color.png b/public/models/talkie/talkie_Base_color.png new file mode 100644 index 0000000..295b322 --- /dev/null +++ b/public/models/talkie/talkie_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:aead25dde6c940f353fa4a53f43e37dde80cd924ccced3c4f88a45dcc5fb4751 +size 610827 diff --git a/public/models/talkie/talkie_Height.png b/public/models/talkie/talkie_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/talkie_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/talkie_Metallic.png b/public/models/talkie/talkie_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/talkie_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/talkie_Mixed_AO.png b/public/models/talkie/talkie_Mixed_AO.png new file mode 100644 index 0000000..a015f96 --- /dev/null +++ b/public/models/talkie/talkie_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:78a4e5bc8affb8c7f529712ddcc4958982729d4bbc64163d93b4e3df8192f3e9 +size 229809 diff --git a/public/models/talkie/talkie_Roughness.png b/public/models/talkie/talkie_Roughness.png new file mode 100644 index 0000000..091f911 --- /dev/null +++ b/public/models/talkie/talkie_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:638da789f9d21dfa546cf053c5f0c4e47fc18eef3d7ac412d39bdbdf3b3974b1 +size 134252 diff --git a/public/models/talkie/talkie_normal.png b/public/models/talkie/talkie_normal.png new file mode 100644 index 0000000..d3e9649 --- /dev/null +++ b/public/models/talkie/talkie_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3fba8c5bce232fd16f3d3da18228438443bfcfab6f1673884e2c6439a799a342 +size 285066 diff --git a/public/models/talkie/talkie_normal_opengl.png b/public/models/talkie/talkie_normal_opengl.png new file mode 100644 index 0000000..e58b36f --- /dev/null +++ b/public/models/talkie/talkie_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:708382f0b0340e845f0cd4127b84ec5f837f5ca3a51f0c4064ba790374643c21 +size 287356 diff --git a/public/models/talkie/touches_Base_color.png b/public/models/talkie/touches_Base_color.png new file mode 100644 index 0000000..eb7631c --- /dev/null +++ b/public/models/talkie/touches_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:47ef413967a461f9768b74d15a2ab1c8e3e3fe6fc9be027d8cf1e7268bb8a888 +size 126096 diff --git a/public/models/talkie/touches_Height.png b/public/models/talkie/touches_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/touches_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/touches_Metallic.png b/public/models/talkie/touches_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/touches_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/touches_Mixed_AO.png b/public/models/talkie/touches_Mixed_AO.png new file mode 100644 index 0000000..5673800 --- /dev/null +++ b/public/models/talkie/touches_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6884417f47afb4330b00f9f42fa1faf7b8bbd06d2ae9595cffe409a4d38cd461 +size 246760 diff --git a/public/models/talkie/touches_Roughness.png b/public/models/talkie/touches_Roughness.png new file mode 100644 index 0000000..bd73a19 --- /dev/null +++ b/public/models/talkie/touches_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5804a17a4fd8691a606cbb3e671234f2c876dfc0e88e16d2f781bd35785167cb +size 56002 diff --git a/public/models/talkie/touches_normal.png b/public/models/talkie/touches_normal.png new file mode 100644 index 0000000..07f83c4 --- /dev/null +++ b/public/models/talkie/touches_normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:09d922e17cd400c32ef51462723e9c5ee9dfbe4c668e88e6057f9e7d60c8830e +size 59216 diff --git a/public/models/talkie/touches_normal_opengl.png b/public/models/talkie/touches_normal_opengl.png new file mode 100644 index 0000000..ec98ce7 --- /dev/null +++ b/public/models/talkie/touches_normal_opengl.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8cdadc48d7d365fa0f8e4f3b64a61a6fa95cf9bcafaf50dc83ea7cf90173f68b +size 59178 diff --git a/public/models/talkie/écran_Base_color.png b/public/models/talkie/écran_Base_color.png new file mode 100644 index 0000000..b28a367 --- /dev/null +++ b/public/models/talkie/écran_Base_color.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:bfbf65890f6d5019bf113246dcecb83c97e31d6e10b0429d5e89df9df67a58bd +size 6498 diff --git a/public/models/talkie/écran_Height.png b/public/models/talkie/écran_Height.png new file mode 100644 index 0000000..713980d --- /dev/null +++ b/public/models/talkie/écran_Height.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:208daeea7306a6a576fbe1098c66d59571dd984635d7fb6c017fd767cde531ed +size 3178 diff --git a/public/models/talkie/écran_Metallic.png b/public/models/talkie/écran_Metallic.png new file mode 100644 index 0000000..b46e54a --- /dev/null +++ b/public/models/talkie/écran_Metallic.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:60041773ef2d493f3547aa1b0fbdf5b1bb548a3da39164384293ef5292b2c5b3 +size 1118 diff --git a/public/models/talkie/écran_Mixed_AO.png b/public/models/talkie/écran_Mixed_AO.png new file mode 100644 index 0000000..e91eb6e --- /dev/null +++ b/public/models/talkie/écran_Mixed_AO.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d4f3fd92f328f0733f9cb9865209466c251f4edf4750654eb0385b519300cf34 +size 329712 diff --git a/public/models/talkie/écran_Normal.png b/public/models/talkie/écran_Normal.png new file mode 100644 index 0000000..175152b --- /dev/null +++ b/public/models/talkie/écran_Normal.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a07dd2bf8fe1d37b9a74d2ca09b8a77d8a97029d41a8483e34ba30bd8e9efc04 +size 74315 diff --git a/public/models/talkie/écran_Normal_OpenGL.png b/public/models/talkie/écran_Normal_OpenGL.png new file mode 100644 index 0000000..e17d9b3 --- /dev/null +++ b/public/models/talkie/écran_Normal_OpenGL.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ca90a32ea8b1dadb11a5cf2e41d4d096920fd7a2ab493dec96682a479d4e7a8c +size 74316 diff --git a/public/models/talkie/écran_Roughness.png b/public/models/talkie/écran_Roughness.png new file mode 100644 index 0000000..d89bffa --- /dev/null +++ b/public/models/talkie/écran_Roughness.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d560c80d755fdfff917c63d96d664cc4c9be963cc38ac63533418f7df1b0642c +size 72772 diff --git a/public/models/terrain/model.gltf b/public/models/terrain/model.gltf new file mode 100644 index 0000000..b296aac --- /dev/null +++ b/public/models/terrain/model.gltf @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f554cc203748ddb5ec6c43e0761b9767f72177d94b388a6d9195cbdc8f5895f4 +size 84222 diff --git a/public/skybox/sky.exr b/public/skybox/sky.exr deleted file mode 100644 index c6ff8e1..0000000 --- a/public/skybox/sky.exr +++ /dev/null @@ -1,3 +0,0 @@ -version https://git-lfs.github.com/spec/v1 -oid sha256:904b303c98f865526b9524b955f440e630f29d8e18a57bb7bf443fcd9715add1 -size 83079911 diff --git a/public/sounds/dialogue/dialogues.json b/public/sounds/dialogue/dialogues.json new file mode 100644 index 0000000..ff0d23d --- /dev/null +++ b/public/sounds/dialogue/dialogues.json @@ -0,0 +1,187 @@ +{ + "version": 1, + "voices": [ + { + "id": "narrateur", + "speaker": "Narrateur", + "subtitles": { + "fr": "/sounds/dialogue/subtitles/fr/narrateur.srt", + "en": "/sounds/dialogue/subtitles/en/narrateur.srt" + } + }, + { + "id": "fermier", + "speaker": "Fermier", + "subtitles": { + "fr": "/sounds/dialogue/subtitles/fr/fermier.srt", + "en": "/sounds/dialogue/subtitles/en/fermier.srt" + } + }, + { + "id": "electricienne", + "speaker": "Electricienne", + "subtitles": { + "fr": "/sounds/dialogue/subtitles/fr/electricienne.srt", + "en": "/sounds/dialogue/subtitles/en/electricienne.srt" + } + } + ], + "dialogues": [ + { + "id": "narrateur_bienvenueaaltera", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_bienvenueaaltera.mp3", + "subtitleCueIndex": 1 + }, + { + "id": "narrateur_intro_prenom", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_intro_prenom.mp3", + "subtitleCueIndex": 2 + }, + { + "id": "narrateur_intro_apresprenom", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_intro_apresprenom.mp3", + "subtitleCueIndex": 3 + }, + { + "id": "narrateur_ordreebike", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_ordreebike.mp3", + "subtitleCueIndex": 4 + }, + { + "id": "narrateur_ebikecasse", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_ebikecassé.mp3", + "subtitleCueIndex": 5 + }, + { + "id": "narrateur_galetscan", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_galetscan.mp3", + "subtitleCueIndex": 6 + }, + { + "id": "narrateur_ebikerepare", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_ebikeréparé.mp3", + "subtitleCueIndex": 7 + }, + { + "id": "narrateur_ordredemandedelaide", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_ordredemandedelaide.mp3", + "subtitleCueIndex": 8 + }, + { + "id": "narrateur_coupureelec", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_coupureélec.mp3", + "subtitleCueIndex": 9 + }, + { + "id": "narrateur_poteaueleccasse", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_poteauéleccassé.mp3", + "subtitleCueIndex": 10 + }, + { + "id": "narrateur_courantrepare", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_courantréparé.mp3", + "subtitleCueIndex": 11 + }, + { + "id": "narrateur_routeversferme", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_routeversferme.mp3", + "subtitleCueIndex": 12 + }, + { + "id": "narrateur_arriveferme", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_arrivéferme.mp3", + "subtitleCueIndex": 13 + }, + { + "id": "narrateur_fouillelecentre", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_fouillelecentre.mp3", + "subtitleCueIndex": 14 + }, + { + "id": "narrateur_interactiontuyauxlac", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_interactiontuyauxlac.mp3", + "subtitleCueIndex": 15 + }, + { + "id": "narrateur_interactionrefroidisseur", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_interactionrefroidisseur.mp3", + "subtitleCueIndex": 16 + }, + { + "id": "narrateur_refroidisseurcasse", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_refroidisseurcassé.mp3", + "subtitleCueIndex": 17 + }, + { + "id": "narrateur_createurdepluiecree", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_createurdepluiecréé.mp3", + "subtitleCueIndex": 18 + }, + { + "id": "narrateur_remerciement", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_remerciement.mp3", + "subtitleCueIndex": 19 + }, + { + "id": "narrateur_bonnechance", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_bonnechance.mp3", + "subtitleCueIndex": 20 + }, + { + "id": "narrateur_presentationatelier", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_présentationatelier.mp3", + "subtitleCueIndex": 21 + }, + { + "id": "narrateur_presentationoutils", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_présentationoutils.mp3", + "subtitleCueIndex": 22 + }, + { + "id": "narrateur_histoireelectricienne", + "voice": "narrateur", + "audio": "/sounds/dialogue/narrateur_histoireelectricienne.mp3", + "subtitleCueIndex": 23 + }, + { + "id": "fermier_coupdemain", + "voice": "fermier", + "audio": "/sounds/dialogue/fermier_coupdemain.mp3", + "subtitleCueIndex": 1 + }, + { + "id": "fermier_coupdemain_2", + "voice": "fermier", + "audio": "/sounds/dialogue/fermier_coupdemain_2.mp3", + "subtitleCueIndex": 2 + }, + { + "id": "fermier_findemission", + "voice": "fermier", + "audio": "/sounds/dialogue/fermier_findemission.mp3", + "subtitleCueIndex": 3 + } + ] +} diff --git a/public/sounds/dialogue/fermier_coupdemain.mp3 b/public/sounds/dialogue/fermier_coupdemain.mp3 new file mode 100644 index 0000000..8e12e14 --- /dev/null +++ b/public/sounds/dialogue/fermier_coupdemain.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4767335bdefacbd4e0b8ea45b8ffe26ff5bcfc7312d1dfa75e552fb48a496ad4 +size 96667 diff --git a/public/sounds/dialogue/fermier_coupdemain_2.mp3 b/public/sounds/dialogue/fermier_coupdemain_2.mp3 new file mode 100644 index 0000000..90dda6c --- /dev/null +++ b/public/sounds/dialogue/fermier_coupdemain_2.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:728992dad4e5073ccba58956dafdd41f4cc820128f0624870195f8a77b4b60ab +size 106992 diff --git a/public/sounds/dialogue/fermier_findemission.mp3 b/public/sounds/dialogue/fermier_findemission.mp3 new file mode 100644 index 0000000..05ed588 --- /dev/null +++ b/public/sounds/dialogue/fermier_findemission.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f9095d211234b93dd83e8f49b5ca51e2598e1c9ecd8c9b53421708f4f61aa08c +size 197904 diff --git a/public/sounds/dialogue/narrateur_arrivéferme.mp3 b/public/sounds/dialogue/narrateur_arrivéferme.mp3 new file mode 100644 index 0000000..be19ff8 --- /dev/null +++ b/public/sounds/dialogue/narrateur_arrivéferme.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:af280daa0bd0ff8ebcbdcbc76be836491c55d341c97e6525a600272dd568e1b9 +size 319922 diff --git a/public/sounds/dialogue/narrateur_bienvenueaaltera.mp3 b/public/sounds/dialogue/narrateur_bienvenueaaltera.mp3 new file mode 100644 index 0000000..6d8d66f --- /dev/null +++ b/public/sounds/dialogue/narrateur_bienvenueaaltera.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:99728d683e5f3f74d84655895892df963c583a14c08c74a6099a8d741457b73f +size 75410 diff --git a/public/sounds/dialogue/narrateur_bonnechance.mp3 b/public/sounds/dialogue/narrateur_bonnechance.mp3 new file mode 100644 index 0000000..a7081a8 --- /dev/null +++ b/public/sounds/dialogue/narrateur_bonnechance.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5d2d41427237827c6f5788f720f3615236f89621a4218479710d74ec434249da +size 63169 diff --git a/public/sounds/dialogue/narrateur_coupureélec.mp3 b/public/sounds/dialogue/narrateur_coupureélec.mp3 new file mode 100644 index 0000000..e6188f0 --- /dev/null +++ b/public/sounds/dialogue/narrateur_coupureélec.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9137ebcf24a5899161a695b841a1d9f8e6c86d6bc75e8c66797cedce279c0931 +size 249409 diff --git a/public/sounds/dialogue/narrateur_courantréparé.mp3 b/public/sounds/dialogue/narrateur_courantréparé.mp3 new file mode 100644 index 0000000..d43d4e0 --- /dev/null +++ b/public/sounds/dialogue/narrateur_courantréparé.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c5258f576ffdaaf8235ae1eab8caecc6bc083654887b402bc102277ebb62663e +size 199873 diff --git a/public/sounds/dialogue/narrateur_createurdepluiecréé.mp3 b/public/sounds/dialogue/narrateur_createurdepluiecréé.mp3 new file mode 100644 index 0000000..f781a77 --- /dev/null +++ b/public/sounds/dialogue/narrateur_createurdepluiecréé.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a1742b6b4011af34e0e006a8d8b904f8eb6a68b5dc8466a121be720828a5099b +size 274418 diff --git a/public/sounds/dialogue/narrateur_ebikecassé.mp3 b/public/sounds/dialogue/narrateur_ebikecassé.mp3 new file mode 100644 index 0000000..e7ab4e9 --- /dev/null +++ b/public/sounds/dialogue/narrateur_ebikecassé.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9888daae0831bfe5d8241f752af757ddcf6f0772ddaf846e6c4889998b0e88f3 +size 345673 diff --git a/public/sounds/dialogue/narrateur_ebikeréparé.mp3 b/public/sounds/dialogue/narrateur_ebikeréparé.mp3 new file mode 100644 index 0000000..e4cebad --- /dev/null +++ b/public/sounds/dialogue/narrateur_ebikeréparé.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:88a27ae225b836c06f2ae24bf61185b33afa8a8b7cbed1f070091bfee6392f54 +size 136273 diff --git a/public/sounds/dialogue/narrateur_fouillelecentre.mp3 b/public/sounds/dialogue/narrateur_fouillelecentre.mp3 new file mode 100644 index 0000000..fb1609b --- /dev/null +++ b/public/sounds/dialogue/narrateur_fouillelecentre.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:271be4d67456da4d55d0b4d1a2573fac86df3e7afb624e40621eca01f0278e89 +size 126217 diff --git a/public/sounds/dialogue/narrateur_galetscan.mp3 b/public/sounds/dialogue/narrateur_galetscan.mp3 new file mode 100644 index 0000000..625e204 --- /dev/null +++ b/public/sounds/dialogue/narrateur_galetscan.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2f5a7b6f8db95d208991c295369f64e8de3eaecf86132be3f40670bf855a633f +size 129183 diff --git a/public/sounds/dialogue/narrateur_histoireelectricienne.mp3 b/public/sounds/dialogue/narrateur_histoireelectricienne.mp3 new file mode 100644 index 0000000..0720a84 --- /dev/null +++ b/public/sounds/dialogue/narrateur_histoireelectricienne.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3d035a908c418b0a9bf2e2d783b63562f49175b62aad0ca0ca4e077cb34fdb40 +size 864159 diff --git a/public/sounds/dialogue/narrateur_interactionrefroidisseur.mp3 b/public/sounds/dialogue/narrateur_interactionrefroidisseur.mp3 new file mode 100644 index 0000000..4955f0d --- /dev/null +++ b/public/sounds/dialogue/narrateur_interactionrefroidisseur.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f2830f29cea45a14cce19af337898a544c5e76263b5431d8ec271675688a53ef +size 175264 diff --git a/public/sounds/dialogue/narrateur_interactiontuyauxlac.mp3 b/public/sounds/dialogue/narrateur_interactiontuyauxlac.mp3 new file mode 100644 index 0000000..a544b06 --- /dev/null +++ b/public/sounds/dialogue/narrateur_interactiontuyauxlac.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7a50f7ddce924006ce4a52fd46885744727fea8b408fe5fbb2e2e666a51b5810 +size 109984 diff --git a/public/sounds/dialogue/narrateur_intro_apresprenom.mp3 b/public/sounds/dialogue/narrateur_intro_apresprenom.mp3 new file mode 100644 index 0000000..6f2f0e5 --- /dev/null +++ b/public/sounds/dialogue/narrateur_intro_apresprenom.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a3723695e427d8256e0d846363cea5314a9a82051aeefbee0c9ab96755577192 +size 173343 diff --git a/public/sounds/dialogue/narrateur_intro_prenom.mp3 b/public/sounds/dialogue/narrateur_intro_prenom.mp3 new file mode 100644 index 0000000..a8e240b --- /dev/null +++ b/public/sounds/dialogue/narrateur_intro_prenom.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d03f835b8fbbf11529fe8ffba18ff4c4e39d5ff68940bd4f93e5b50cb5c44ea9 +size 185631 diff --git a/public/sounds/dialogue/narrateur_ordredemandedelaide.mp3 b/public/sounds/dialogue/narrateur_ordredemandedelaide.mp3 new file mode 100644 index 0000000..63a659d --- /dev/null +++ b/public/sounds/dialogue/narrateur_ordredemandedelaide.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5189a8bee6af605b10896c97ee2afc0221f4fa1e4c98203039f9b6377e28ac2d +size 72351 diff --git a/public/sounds/dialogue/narrateur_ordreebike.mp3 b/public/sounds/dialogue/narrateur_ordreebike.mp3 new file mode 100644 index 0000000..6884f39 --- /dev/null +++ b/public/sounds/dialogue/narrateur_ordreebike.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:6960bb65986d0ae0377a30d50717004599da9df0dec2b4376ded72b70baae18f +size 97311 diff --git a/public/sounds/dialogue/narrateur_poteauéleccassé.mp3 b/public/sounds/dialogue/narrateur_poteauéleccassé.mp3 new file mode 100644 index 0000000..c3508b5 --- /dev/null +++ b/public/sounds/dialogue/narrateur_poteauéleccassé.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4b23172b44542d0c8d98214043f3c2858ad27876e6294192ae23ee77c7681e73 +size 157599 diff --git a/public/sounds/dialogue/narrateur_présentationatelier.mp3 b/public/sounds/dialogue/narrateur_présentationatelier.mp3 new file mode 100644 index 0000000..6ca1c5a --- /dev/null +++ b/public/sounds/dialogue/narrateur_présentationatelier.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:c3aea5ee659fbe5845435ab65287f5b87d2c9c7afa146cb1bb555a8aaa10b7db +size 537759 diff --git a/public/sounds/dialogue/narrateur_présentationoutils.mp3 b/public/sounds/dialogue/narrateur_présentationoutils.mp3 new file mode 100644 index 0000000..5d19d60 --- /dev/null +++ b/public/sounds/dialogue/narrateur_présentationoutils.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:9a3125a2212377d581293ed7cb88562fbc523f9831586185a3f8d1f74b6e93d2 +size 236319 diff --git a/public/sounds/dialogue/narrateur_refroidisseurcassé.mp3 b/public/sounds/dialogue/narrateur_refroidisseurcassé.mp3 new file mode 100644 index 0000000..fcabe15 --- /dev/null +++ b/public/sounds/dialogue/narrateur_refroidisseurcassé.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:66c1a53b72ff92d57bb1b412b3b2174d1060f438c3bd7e5847308d3b347e61fc +size 91551 diff --git a/public/sounds/dialogue/narrateur_remerciement.mp3 b/public/sounds/dialogue/narrateur_remerciement.mp3 new file mode 100644 index 0000000..f5ad231 --- /dev/null +++ b/public/sounds/dialogue/narrateur_remerciement.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:452927c3c28f5c05d2380b3af3022547187b0f9cd62a805c3d7ec089443ed356 +size 184480 diff --git a/public/sounds/dialogue/narrateur_routeversferme.mp3 b/public/sounds/dialogue/narrateur_routeversferme.mp3 new file mode 100644 index 0000000..44c908b --- /dev/null +++ b/public/sounds/dialogue/narrateur_routeversferme.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ba38769e5ff93779f16b2b3355753c42d20506fdb3be482e3e54ee7265eff63f +size 85791 diff --git a/public/sounds/dialogue/subtitles/en/README.md b/public/sounds/dialogue/subtitles/en/README.md new file mode 100644 index 0000000..04648de --- /dev/null +++ b/public/sounds/dialogue/subtitles/en/README.md @@ -0,0 +1,11 @@ +# English Subtitle Fallback + +English SRT files are intentionally optional for now. + +The dialogue runtime first tries the selected subtitle language, then falls back to French. Missing English files should therefore remain validation warnings, not blocking errors, until the English translation workflow is ready. + +Expected future files: + +- `narrateur.srt` +- `fermier.srt` +- `electricienne.srt` diff --git a/public/sounds/dialogue/subtitles/en/electricienne.srt b/public/sounds/dialogue/subtitles/en/electricienne.srt new file mode 100644 index 0000000..6965992 --- /dev/null +++ b/public/sounds/dialogue/subtitles/en/electricienne.srt @@ -0,0 +1,11 @@ +1 +00:00:00,000 --> 00:00:08,000 +Hey!! How are you? Do you need help placing the rollers? + +2 +00:00:00,000 --> 00:00:08,000 +Don't hesitate if you need anything else! + +3 +00:00:00,000 --> 00:00:08,000 +See you next time! diff --git a/public/sounds/dialogue/subtitles/en/fermier.srt b/public/sounds/dialogue/subtitles/en/fermier.srt new file mode 100644 index 0000000..a46afaa --- /dev/null +++ b/public/sounds/dialogue/subtitles/en/fermier.srt @@ -0,0 +1,11 @@ +1 +00:00:00,000 --> 00:00:04,032 +Wait, wait, young man! I'll give you a hand. + +2 +00:00:00,000 --> 00:00:03,744 +I did puzzles all through my youth. Try this! + +3 +00:00:00,000 --> 00:00:07,104 +If you need anything else, don't hesitate, my boy. I'm getting old, but my mind is still sharp, hehehe! diff --git a/public/sounds/dialogue/subtitles/en/narrateur.srt b/public/sounds/dialogue/subtitles/en/narrateur.srt new file mode 100644 index 0000000..b6f3ffd --- /dev/null +++ b/public/sounds/dialogue/subtitles/en/narrateur.srt @@ -0,0 +1,91 @@ +1 +00:00:00,000 --> 00:00:02,760 +Hello there, future resident of Altera! Today, you are going to discover the technician role at La Fabrik, which handles Low-Tech technologies and repairs. + +2 +00:00:00,000 --> 00:00:11,592 +Before we start, what's your name? + +3 +00:00:00,000 --> 00:00:10,824 +Very good! We'll begin step by step to show you how the workshop works. Then you'll start your day and see the positive impact La Fabrik has on the community and the neighborhood. + +4 +00:00:00,000 --> 00:00:06,072 +Let's go! You need to head to the farm, we're looking to improve something! Hop on your E-Bike. + +5 +00:00:00,000 --> 00:00:12,720 +What? Your E-Bike is broken? Well, that's not too serious, it happens! Use the two rollers on your gloves. They're real technological gems. Place one under the bike, and one above it. + +6 +00:00:00,000 --> 00:00:08,064 +So? Pretty amazing, right? Anyway, these rollers will scan the components to find out what we need to repair and/or replace. + +7 +00:00:00,000 --> 00:00:04,992 +Perfect! The cooler gave out, you can replace it with one of the components from your pack. Aaaand there we go! It runs like clockwork! Go on, hurry! + +8 +00:00:00,000 --> 00:00:04,512 +Don't hesitate to ask for help if you need it, everyone is super welcoming here. + +9 +00:00:00,000 --> 00:00:08,880 +Oh woooow!! Did you see that???? All the traffic lights, computers and lights went out!! Hurry to the Energy Center, we can't even send repaired devices back out! + +10 +00:00:00,000 --> 00:00:09,840 +Ah! A power pole fell down! Damn! Aaah, those little moles, they cause so much trouble... But they're so cuuuute! + +11 +00:00:00,000 --> 00:00:07,632 +Woohoo! Great! Power is back across the whole neighborhood! Well done! Now head to the farm. + +12 +00:00:00,000 --> 00:00:05,352 +Well, thanks to you I was able to finish my emergency! Oh, you're almost at the farm! + +13 +00:00:00,000 --> 00:00:11,760 +Okay, enough of the emotional moment haha! For the farm, as I told you, we need to change the irrigation here. During drought periods, residents complain about an issue. See what you can do. + +14 +00:00:00,000 --> 00:00:04,560 +Okay, perfect, you're there! Search the Center to find where the problem is coming from. + +15 +00:00:00,000 --> 00:00:06,864 +Yeees! That's it! We'd like to stop pumping water from the lake, otherwise we'll drain all its reserves. What do you suggest? + +16 +00:00:00,000 --> 00:00:10,944 +The old cooler from your E-Bike?? Yes!! Hahaha, great idea! Combined with the old lake pipes, we'll be able to make something cool! Put all that between your pads! + +17 +00:00:00,000 --> 00:00:05,712 +The cooler from your E-Bike is broken, but we can still make something useful out of it. + +18 +00:00:00,000 --> 00:00:10,032 +Ma-gni-fi-cent! I can see Gilbert helped you haha, he's such a sweetheart! You did a great job! And thanks to you, the neighborhood has been improved. + +19 +00:00:00,000 --> 00:00:11,520 +Thank you so much for what you've brought to the community. The electrician and Gilbert really enjoyed helping you and told me they're looking forward to the next village party to get to know you better. + +20 +00:00:00,000 --> 00:00:02,352 +Good luck! I've got work to do! + +21 +00:00:00,000 --> 00:00:33,600 +Welcome to your workshop!! So? Pretty impressive, right? Okay, quick tour of what's here: this is your workbench. In the pipes are items from neighborhood residents that broke down and are waiting to be repaired. Once repaired, you put the item in this pipe and it goes back to the right person. + +22 +00:00:00,000 --> 00:00:14,760 +Here, this is a dashboard. You can imagine that if your fridge or oven breaks down, you won't be able to put it in the pipe haha! So here, it tells you when residents have a bulky item that broke down, or when there's a problem in the city. Uh oh... I've got an emergency, I'll have to leave you soon! So here, take your tools to repair most things: a mini 3D printer powered by electronic waste, Push-Parts gloves to disassemble objects, and a Relaunch pack! + +23 +00:00:00,000 --> 00:00:54,000 +The electrician helped you at the Power Plant? Aaaaah, that's what I love here: everyone helps each other, nobody judges anyone, it's like a real little family. You should know the electrician has quite a special story. She was born in the north of the continent, in the city of Kalska. She grew up happily with her mother Edith, her father Jordan, and her two little brothers, Malo and Justin. A few years ago, as you know, the northern countries were, quite unexpectedly, the first ones forced to migrate. So they began their journey, country by country, city by city, village by village. On a day of walking like so many others after several months, a climate storm caught them off guard. Having split up to find food in the village, her father and one of her two brothers sadly disappeared. It's tragic. But one day, they happened upon this place during their journey. We welcomed them with open arms, and they were slowly able to rebuild their lives among us. Today, they are an integral part of the community. diff --git a/public/sounds/dialogue/subtitles/fr/electricienne.srt b/public/sounds/dialogue/subtitles/fr/electricienne.srt new file mode 100644 index 0000000..a1ed9dd --- /dev/null +++ b/public/sounds/dialogue/subtitles/fr/electricienne.srt @@ -0,0 +1,11 @@ +1 +00:00:00,000 --> 00:00:08,000 +Hey !! Comment ça va ? Tu as besoin d'aide pour poser les galets ? + +2 +00:00:00,000 --> 00:00:08,000 +N'hésite pas, si tu as besoin d'autre chose ! + +3 +00:00:00,000 --> 00:00:08,000 +À la prochaine ! diff --git a/public/sounds/dialogue/subtitles/fr/fermier.srt b/public/sounds/dialogue/subtitles/fr/fermier.srt new file mode 100644 index 0000000..763d4f1 --- /dev/null +++ b/public/sounds/dialogue/subtitles/fr/fermier.srt @@ -0,0 +1,11 @@ +1 +00:00:00,000 --> 00:00:04,032 +Attendez attendez jeune homme ! Je vais vous filer un coup de main. + +2 +00:00:00,000 --> 00:00:03,744 +J'ai fait des puzzles toute ma jeunesse. Essayez donc ça ! + +3 +00:00:00,000 --> 00:00:07,104 +Si vous avez besoin d'autre chose hésitez pas mon grand. Je me fais vieux mais j'ai encore toute ma tête hehehe ! diff --git a/public/sounds/dialogue/subtitles/fr/narrateur.srt b/public/sounds/dialogue/subtitles/fr/narrateur.srt new file mode 100644 index 0000000..ab3b902 --- /dev/null +++ b/public/sounds/dialogue/subtitles/fr/narrateur.srt @@ -0,0 +1,91 @@ +1 +00:00:00,000 --> 00:00:02,760 +Bonjour à toi, futur habitant d'Altéra ! Aujourd'hui tu vas découvrir le rôle de technicien au sein de La Fabrik qui s'occupe des technologies et réparation Low-Tech. + +2 +00:00:00,000 --> 00:00:11,592 +Avant de commencer, comment tu t'appelles ? + +3 +00:00:00,000 --> 00:00:10,824 +Très bien ! On va commencer pas à pas pour te montrer comment fonctionne l'atelier. Ensuite, tu commenceras ta journée et tu pourras te rendre compte de l'impact positif qu'a la Fabrik sur la communauté et le quartier. + +4 +00:00:00,000 --> 00:00:06,072 +Allez go ! Il faudrait que tu ailles à la ferme, on cherche à améliorer quelque chose ! Monte sur ton E-Bike. + +5 +00:00:00,000 --> 00:00:12,720 +Quoi ? Ton E-Bike est cassé ? Bon c'est pas très grave, ça arrive ! Utilise les deux galets qui sont sur tes gants. Ce sont de véritables bijoux technologiques. Poses en un en-dessous du vélo, et un au-dessus. + +6 +00:00:00,000 --> 00:00:08,064 +Alors ? Pas magnifique ça ? Enfin bref, ces galets vont scanner les composants pour savoir ce qu'on doit réparer et / ou changer. + +7 +00:00:00,000 --> 00:00:04,992 +Parfait ! C'est le refroidisseur qui a lâché, tu peux le remplacer avec un des composants de ton pack. Eeeet voilà ! Il fonctionne comme une horloge ! Allez fonce ! + +8 +00:00:00,000 --> 00:00:04,512 +N'hésite pas à aller demander de l'aide si tu as besoin, tout le monde est super accueillant ici. + +9 +00:00:00,000 --> 00:00:08,880 +Oh woooow !! T'as vu ça ???? Tous les feux, ordinateurs et lumières se sont éteints !! Faut vite que t'aille au Centre de l'Énergie, on ne peut même plus renvoyer les appareils réparés ! + +10 +00:00:00,000 --> 00:00:09,840 +Ah ! C'est un poteau d'alimentation qui est tombé ! Mince ! Alalaaa, ces petites taupes, elles en font des bêtises... Mais elles sont si chouuuu ! + +11 +00:00:00,000 --> 00:00:07,632 +Wouuuuhouuu ! Super ! Le courant est revenu dans tout le quartier ! Bien joué ! Allez, fonce à la ferme. + +12 +00:00:00,000 --> 00:00:05,352 +Booon, grâce à toi j'ai pu finir mon urgence ! Oh mais t'arrives bientôt à la ferme ! + +13 +00:00:00,000 --> 00:00:11,760 +Bon, fini le moment émotion haha ! Pour la ferme, comme je te l'ai dis, ici, il faut qu'on change l'irrigation. Durant les périodes de sécheresse, les habitants se plaignent d'un souci. Vois ce que tu peux faire. + +14 +00:00:00,000 --> 00:00:04,560 +Ok parfait tu y es ! Fouille le Centre pour voir d'où vient le problème. + +15 +00:00:00,000 --> 00:00:06,864 +Ouiii ! C'est ça ! On aimerait ne plus pomper l'eau dans le lac, sinon on va épuiser toutes ses réserves. Qu'est-ce que tu proposes ? + +16 +00:00:00,000 --> 00:00:10,944 +L'ancien refroidisseur de ton E-Bike ?? Mais oui !! Hahaha, très bonne idée ! Combiné aux anciens tuyaux du lac, on va pouvoir faire quelque chose de cool ! Met tout ça entre tes pads ! + +17 +00:00:00,000 --> 00:00:05,712 +Le refroidisseur de ton E-Bike est cassé, mais on peut encore en faire quelque chose d'utile. + +18 +00:00:00,000 --> 00:00:10,032 +Ma-gni-fique ! Je vois que Gilbert t'as aidé haha, il est adorable celui-là ! Tu as fait du super boulot ! Et grâce à toi, le quartier est amélioré. + +19 +00:00:00,000 --> 00:00:11,520 +Merci beaucoup pour ce que tu as apporté à la communauté. L'électricienne et Gilbert ont beaucoup apprécié t'aider et m'ont dit qu'ils avaient hâte de la prochaine fête de village pour mieux apprendre à te connaître. + +20 +00:00:00,000 --> 00:00:02,352 +Allez bonne chance ! J'ai du boulot ! + +21 +00:00:00,000 --> 00:00:33,600 +Bienvenue dans ton atelier !! Alors ? Ça claque hein ? Bon je te présente en rapide tout ce qu'il y a : ici c'est ton plan de travail. Dans les tuyaux, ce sont des objets des résidents du quartier qui sont tombés en panne qui attendent d'être réparés. Une fois réparé, tu mets l'objet dans ce tuyau et ça repart chez la bonne personne. + +22 +00:00:00,000 --> 00:00:14,760 +Ici, c'est un tableau de bord. T'imagines bien que si ton frigo ou ton four tombe en panne, tu ne vas pas pouvoir le mettre dans le tuyau haha ! Donc ici, ça te signale quand des résidents ont un objet volumineux tombé en panne, ou quand il y a un problème dans la ville. Oh oh... j'ai une urgence, il va bientôt falloir que je te laisse ! Donc tiens, tes outils pour pouvoir réparer la plupart des choses : une mini imprimante 3D à base de déchets électroniques, des gants Pousse Pièces pour désassembler les objets, ainsi qu'un pack de Relance ! + +23 +00:00:00,000 --> 00:00:54,000 +L'électricienne t'a aidé à la Centrale ? Aaaaah c'est ça que j'adore ici, tout le monde s'entraide, personne se juge, une vraie petite famille. Sache que l'électricienne a une histoire assez particulière. Elle est née au nord du continent, dans la ville de Kalska. Elle a grandit heureuse, avec sa mère Edith, son père Jordan et ses deux petits frères Malo et Justin. Il y a quelques années de ça, comme tu le sais, c'est les pays du Nord, qui par grande surprise, ont été obligés de migrer en premier. Ils ont alors entamé leur périple, pays par pays, ville par ville, village par village. Un jour de marche comme les autres depuis plusieurs mois, une tempête climatique les a pris de court. S'étant séparés pour trouver des vivres dans le village, le père et un des deux frères sont malheureusement partis. C'est tragique. Mais un beau jour, ils sont tombés ici, par hasard dans leur périple. On les a accueillis les bras ouverts et ils ont pu se reconstruire doucement parmi nous et font partie intégrante de la communauté aujourd'hui. diff --git a/public/sounds/effect/close-malette.mp3 b/public/sounds/effect/close-malette.mp3 new file mode 100644 index 0000000..1f3f1e8 --- /dev/null +++ b/public/sounds/effect/close-malette.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:4bb923d3b44ca6ebecdfcc45a6cba4a5666d7f7ecb66250fc427d7dcb6b5b3b1 +size 25077 diff --git a/public/sounds/fa.mp3 b/public/sounds/effect/fa.mp3 similarity index 100% rename from public/sounds/fa.mp3 rename to public/sounds/effect/fa.mp3 diff --git a/public/sounds/effect/open-malette.mp3 b/public/sounds/effect/open-malette.mp3 new file mode 100644 index 0000000..44433f6 --- /dev/null +++ b/public/sounds/effect/open-malette.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:93c7a033aa7eef8ce9fa012b5ad3ef1fa961e1f842e21641fc02025ee4d6f4fd +size 12288 diff --git a/public/sounds/musique/test.mp3 b/public/sounds/musique/test.mp3 new file mode 100644 index 0000000..d4095f6 --- /dev/null +++ b/public/sounds/musique/test.mp3 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:de4036838a022ff91e10dabf4db2c0e9e41f49c5fc6e59b571100d6aaba29cd2 +size 48225313 diff --git a/src/App.tsx b/src/App.tsx index 56524af..c6ccffa 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,47 +1,8 @@ -import { Suspense, useEffect } from "react"; -import { Canvas } from "@react-three/fiber"; -import { Crosshair } from "@/components/ui/Crosshair"; -import { InteractPrompt } from "@/components/ui/InteractPrompt"; -import { IntroUI, BienvenueDisplay } from "@/components/ui/IntroUI"; -import { DialogMessage } from "@/components/ui/DialogMessage"; -import { useGameStore } from "@/stores/gameStore"; -import { DebugPerf } from "@/utils/debug/DebugPerf"; -import { World } from "@/world/World"; +import { RouterProvider } from "@tanstack/react-router"; +import { router } from "@/router"; function App(): React.JSX.Element { - const dialogMessage = useGameStore((state) => state.dialogMessage); - const hideDialog = useGameStore((state) => state.hideDialog); - - useEffect(() => { - if (dialogMessage) { - const timer = setTimeout(() => { - hideDialog(); - }, 3000); - return () => clearTimeout(timer); - } - }, [dialogMessage, hideDialog]); - - return ( - <> - - - - - - - - - - - {dialogMessage && ( - - )} - - ); + return ; } export default App; diff --git a/src/components/3d/GrabbableObject.tsx b/src/components/3d/GrabbableObject.tsx deleted file mode 100644 index 0499484..0000000 --- a/src/components/3d/GrabbableObject.tsx +++ /dev/null @@ -1,140 +0,0 @@ -import { useRef } from "react"; -import { useFrame, useThree } from "@react-three/fiber"; -import { RigidBody } from "@react-three/rapier"; -import type { RapierRigidBody } from "@react-three/rapier"; -import * as THREE from "three"; -import { InteractableObject } from "@/components/3d/InteractableObject"; -import { - GRAB_DEFAULT_COLLIDERS, - GRAB_DEFAULT_LABEL, - GRAB_HOLD_DISTANCE_DEFAULT, - GRAB_HOLD_DISTANCE_MAX, - GRAB_HOLD_DISTANCE_MIN, - GRAB_HOLD_DISTANCE_STEP, - GRAB_STIFFNESS_DEFAULT, - GRAB_STIFFNESS_MAX, - GRAB_STIFFNESS_MIN, - GRAB_STIFFNESS_STEP, - GRAB_THROW_BOOST_DEFAULT, - GRAB_THROW_BOOST_MAX, - GRAB_THROW_BOOST_MIN, - GRAB_THROW_BOOST_STEP, -} from "@/data/grabConfig"; -import { useDebugFolder } from "@/hooks/debug/useDebugFolder"; -import type { ColliderShape, Vector3Tuple } from "@/types/3d"; - -interface GrabbableObjectProps { - position: Vector3Tuple; - children: React.ReactNode; - colliders?: ColliderShape; - label?: string; -} - -// Shared params let one debug folder drive every instance. -const params = { - stiffness: GRAB_STIFFNESS_DEFAULT, - throwBoost: GRAB_THROW_BOOST_DEFAULT, - holdDistance: GRAB_HOLD_DISTANCE_DEFAULT, -}; - -const ZERO_ANGULAR_VELOCITY = { x: 0, y: 0, z: 0 }; - -const _holdTarget = new THREE.Vector3(); -const _currentPos = new THREE.Vector3(); -const _velocity = new THREE.Vector3(); - -export function GrabbableObject({ - position, - children, - colliders = GRAB_DEFAULT_COLLIDERS, - label = GRAB_DEFAULT_LABEL, -}: GrabbableObjectProps): React.JSX.Element { - const camera = useThree((state) => state.camera); - const rbRef = useRef(null); - const isHolding = useRef(false); - - useDebugFolder("GrabbableObject", (folder) => { - folder - .add( - params, - "stiffness", - GRAB_STIFFNESS_MIN, - GRAB_STIFFNESS_MAX, - GRAB_STIFFNESS_STEP, - ) - .name("Hold stiffness"); - folder - .add( - params, - "throwBoost", - GRAB_THROW_BOOST_MIN, - GRAB_THROW_BOOST_MAX, - GRAB_THROW_BOOST_STEP, - ) - .name("Throw boost"); - folder - .add( - params, - "holdDistance", - GRAB_HOLD_DISTANCE_MIN, - GRAB_HOLD_DISTANCE_MAX, - GRAB_HOLD_DISTANCE_STEP, - ) - .name("Hold distance"); - }); - - useFrame(() => { - if (!isHolding.current || !rbRef.current) return; - - camera.getWorldDirection(_holdTarget); - _holdTarget.multiplyScalar(params.holdDistance).add(camera.position); - - const t = rbRef.current.translation(); - _currentPos.set(t.x, t.y, t.z); - - _velocity - .subVectors(_holdTarget, _currentPos) - .multiplyScalar(params.stiffness); - - rbRef.current.setLinvel( - { x: _velocity.x, y: _velocity.y, z: _velocity.z }, - true, - ); - rbRef.current.setAngvel(ZERO_ANGULAR_VELOCITY, true); - }); - - return ( - - { - isHolding.current = true; - }} - onRelease={() => { - isHolding.current = false; - if (!rbRef.current || params.throwBoost === GRAB_THROW_BOOST_DEFAULT) - return; - const v = rbRef.current.linvel(); - rbRef.current.setLinvel( - { - x: v.x * params.throwBoost, - y: v.y * params.throwBoost, - z: v.z * params.throwBoost, - }, - true, - ); - }} - > - {children} - - - ); -} diff --git a/src/components/debug/DebugPerf.tsx b/src/components/debug/DebugPerf.tsx new file mode 100644 index 0000000..f86f61a --- /dev/null +++ b/src/components/debug/DebugPerf.tsx @@ -0,0 +1,24 @@ +import { Suspense, lazy } from "react"; +import { useShowDebugPerf } from "@/hooks/debug/useShowDebugPerf"; + +const Perf = lazy(() => import("r3f-perf").then((m) => ({ default: m.Perf }))); + +const DEBUG_GUI_WIDTH = 245; +const DEBUG_PANEL_GAP = 20; + +export function DebugPerf(): React.JSX.Element | null { + const showDebugPerf = useShowDebugPerf(); + + if (!showDebugPerf) { + return null; + } + + return ( + + + + ); +} diff --git a/src/utils/debug/scene/DebugCameraControls.tsx b/src/components/debug/scene/DebugCameraControls.tsx similarity index 77% rename from src/utils/debug/scene/DebugCameraControls.tsx rename to src/components/debug/scene/DebugCameraControls.tsx index 9fc5f99..8a83c21 100644 --- a/src/utils/debug/scene/DebugCameraControls.tsx +++ b/src/components/debug/scene/DebugCameraControls.tsx @@ -3,17 +3,18 @@ import { DEBUG_CAMERA_DAMPING_FACTOR, DEBUG_CAMERA_MAX_DISTANCE, DEBUG_CAMERA_MIN_DISTANCE, -} from "@/data/debugConfig"; +} from "@/data/debug/debugConfig"; import { PLAYER_EYE_HEIGHT, PLAYER_SPAWN_POSITION_GAME, -} from "@/data/playerConfig"; +} from "@/data/player/playerConfig"; +import type { Vector3Tuple } from "@/types/three/three"; -const DEBUG_CAMERA_TARGET = [ +const DEBUG_CAMERA_TARGET: Vector3Tuple = [ PLAYER_SPAWN_POSITION_GAME[0], PLAYER_EYE_HEIGHT, PLAYER_SPAWN_POSITION_GAME[2], -] as const; +]; export function DebugCameraControls(): React.JSX.Element { return ( diff --git a/src/utils/debug/scene/DebugHelpers.tsx b/src/components/debug/scene/DebugHelpers.tsx similarity index 94% rename from src/utils/debug/scene/DebugHelpers.tsx rename to src/components/debug/scene/DebugHelpers.tsx index 738c46e..17b50ac 100644 --- a/src/utils/debug/scene/DebugHelpers.tsx +++ b/src/components/debug/scene/DebugHelpers.tsx @@ -5,7 +5,7 @@ import { DEBUG_GRID_SECONDARY_COLOR, DEBUG_GRID_SIZE, DEBUG_GRID_Y, -} from "@/data/debugConfig"; +} from "@/data/debug/debugConfig"; import { Debug } from "@/utils/debug/Debug"; export function DebugHelpers(): React.JSX.Element | null { diff --git a/src/components/docs/DocsDocument.tsx b/src/components/docs/DocsDocument.tsx new file mode 100644 index 0000000..379dbb9 --- /dev/null +++ b/src/components/docs/DocsDocument.tsx @@ -0,0 +1,51 @@ +import ReactMarkdown from "react-markdown"; +import remarkGfm from "remark-gfm"; +import { useDocsLanguage } from "@/hooks/docs/useDocsLanguage"; + +interface DocsDocumentProps { + title: string; + meta: string; + content: string; + frContent: string; +} + +export function DocsDocument({ + title, + meta, + content, + frContent, +}: DocsDocumentProps): React.JSX.Element { + const { language, toggleLanguage } = useDocsLanguage(); + const translatedContent = language === "fr" ? frContent : content; + + return ( +
+
+ {title} + +
+ +
+
+ {title} + {meta} +
+ + {translatedContent} + +
+
+ ); +} diff --git a/src/components/docs/DocsLayout.tsx b/src/components/docs/DocsLayout.tsx new file mode 100644 index 0000000..65fc3a5 --- /dev/null +++ b/src/components/docs/DocsLayout.tsx @@ -0,0 +1,53 @@ +import { Link, Outlet } from "@tanstack/react-router"; +import { Home } from "lucide-react"; +import { docGroups } from "@/data/docs/docsSections"; +import { DocsLanguageProvider } from "@/providers/docs/DocsLanguageProvider"; + +export function DocsLayout(): React.JSX.Element { + return ( + +
+ + + +
+
+ ); +} diff --git a/src/components/editor/EditorCinematicManifestPanel.tsx b/src/components/editor/EditorCinematicManifestPanel.tsx new file mode 100644 index 0000000..c380cb1 --- /dev/null +++ b/src/components/editor/EditorCinematicManifestPanel.tsx @@ -0,0 +1,665 @@ +import { useEffect, useState } from "react"; +import { Play, Plus, RefreshCw, Save, Trash2 } from "lucide-react"; +import type { + CinematicCameraKeyframe, + CinematicDefinition, + CinematicDialogueCue, + CinematicManifest, +} from "@/types/cinematics/cinematics"; +import type { + DialogueDefinition, + DialogueManifest, +} from "@/types/dialogues/dialogues"; +import type { Vector3Tuple } from "@/types/three/three"; +import { loadCinematicManifest } from "@/utils/cinematics/loadCinematicManifest"; +import { loadDialogueManifest } from "@/utils/dialogues/loadDialogueManifest"; + +type CinematicPatch = Partial> & { + timecode?: number | undefined; +}; + +type VectorAxis = 0 | 1 | 2; +const VECTOR_AXES: { label: "X" | "Y" | "Z"; axis: VectorAxis }[] = [ + { label: "X", axis: 0 }, + { label: "Y", axis: 1 }, + { label: "Z", axis: 2 }, +]; + +function createCinematic(index: number): CinematicDefinition { + return { + id: `new_cinematic_${index}`, + cameraKeyframes: [ + { time: 0, position: [0, 3, 8], target: [0, 1.5, 0] }, + { time: 3, position: [6, 3, 8], target: [0, 1.5, 0] }, + ], + }; +} + +function createKeyframe( + previousKeyframe: CinematicCameraKeyframe, +): CinematicCameraKeyframe { + return { + time: previousKeyframe.time + 3, + position: [...previousKeyframe.position], + target: [...previousKeyframe.target], + }; +} + +function createDialogueCue( + dialogues: DialogueDefinition[], + previousCue: CinematicDialogueCue | null, +): CinematicDialogueCue { + return { + time: previousCue ? previousCue.time + 1 : 0, + dialogueId: dialogues[0]?.id ?? "", + }; +} + +function getManifestErrors( + manifest: CinematicManifest | null, + dialogueIds: Set, +): string[] { + if (!manifest) return ["Manifeste absent."]; + + const errors: string[] = []; + const ids = new Set(); + + manifest.cinematics.forEach((cinematic, cinematicIndex) => { + const label = cinematic.id || `Cinematique ${cinematicIndex + 1}`; + + if (!cinematic.id.trim()) errors.push(`${label}: id obligatoire.`); + if (ids.has(cinematic.id)) errors.push(`${label}: id duplique.`); + ids.add(cinematic.id); + + if ( + cinematic.timecode !== undefined && + (!Number.isFinite(cinematic.timecode) || cinematic.timecode < 0) + ) { + errors.push(`${label}: timecode invalide.`); + } + + if (cinematic.cameraKeyframes.length < 2) { + errors.push(`${label}: au moins deux keyframes camera sont requises.`); + } + + cinematic.cameraKeyframes.forEach((keyframe, keyframeIndex) => { + const previousKeyframe = cinematic.cameraKeyframes[keyframeIndex - 1]; + + if (!Number.isFinite(keyframe.time) || keyframe.time < 0) { + errors.push(`${label}: keyframe ${keyframeIndex + 1} time invalide.`); + } + + if (previousKeyframe && keyframe.time <= previousKeyframe.time) { + errors.push(`${label}: les temps des keyframes doivent augmenter.`); + } + }); + + cinematic.dialogueCues?.forEach((cue, cueIndex) => { + if (!Number.isFinite(cue.time) || cue.time < 0) { + errors.push(`${label}: dialogue cue ${cueIndex + 1} time invalide.`); + } + + if (!cue.dialogueId.trim()) { + errors.push(`${label}: dialogue cue ${cueIndex + 1} id obligatoire.`); + } else if (dialogueIds.size > 0 && !dialogueIds.has(cue.dialogueId)) { + errors.push(`${label}: dialogue cue ${cueIndex + 1} dialogue inconnu.`); + } + }); + }); + + return errors; +} + +async function saveCinematicManifest( + manifest: CinematicManifest, +): Promise { + const response = await fetch("/api/save-cinematics", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(manifest), + }); + + if (!response.ok) { + const body = (await response.json().catch(() => null)) as { + error?: string; + } | null; + throw new Error(body?.error ?? "Sauvegarde des cinematics impossible"); + } +} + +function getPatchedCinematic( + cinematic: CinematicDefinition, + patch: CinematicPatch, +): CinematicDefinition { + const nextCinematic: CinematicDefinition = { + id: patch.id ?? cinematic.id, + cameraKeyframes: patch.cameraKeyframes ?? cinematic.cameraKeyframes, + }; + + const dialogueCues = patch.dialogueCues ?? cinematic.dialogueCues; + if (dialogueCues) { + nextCinematic.dialogueCues = dialogueCues; + } + + if ("timecode" in patch) { + if (patch.timecode !== undefined) nextCinematic.timecode = patch.timecode; + } else if (cinematic.timecode !== undefined) { + nextCinematic.timecode = cinematic.timecode; + } + + return nextCinematic; +} + +function updateVector( + vector: Vector3Tuple, + axis: VectorAxis, + value: number, +): Vector3Tuple { + const nextVector: Vector3Tuple = [...vector]; + nextVector[axis] = value; + return nextVector; +} + +interface EditorCinematicManifestPanelProps { + onPreviewCinematic?: ((cinematic: CinematicDefinition) => void) | undefined; +} + +export function EditorCinematicManifestPanel({ + onPreviewCinematic, +}: EditorCinematicManifestPanelProps): React.JSX.Element { + const [manifest, setManifest] = useState(null); + const [dialogueManifest, setDialogueManifest] = + useState(null); + const [selectedCinematicId, setSelectedCinematicId] = useState(""); + const [status, setStatus] = useState("Chargement des cinematics..."); + const [isSaving, setIsSaving] = useState(false); + const dialogueIds = new Set( + dialogueManifest?.dialogues.map((dialogue) => dialogue.id) ?? [], + ); + const errors = getManifestErrors(manifest, dialogueIds); + const selectedCinematic = + manifest?.cinematics.find( + (cinematic) => cinematic.id === selectedCinematicId, + ) ?? + manifest?.cinematics[0] ?? + null; + + async function handleLoad(): Promise { + setStatus("Chargement des cinematics..."); + + try { + const [loadedManifest, loadedDialogueManifest] = await Promise.all([ + loadCinematicManifest(), + loadDialogueManifest(), + ]); + setManifest(loadedManifest); + setDialogueManifest(loadedDialogueManifest); + setSelectedCinematicId(loadedManifest?.cinematics[0]?.id ?? ""); + setStatus( + loadedManifest + ? `Manifeste charge: ${loadedManifest.cinematics.length} cinematics.` + : "Manifeste cinematics introuvable ou invalide.", + ); + } catch (err) { + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(message); + setManifest(null); + } + } + + async function handleSave(): Promise { + if (!manifest) return; + if (errors.length > 0) { + setStatus("Corrige les erreurs avant de sauvegarder."); + return; + } + + setIsSaving(true); + setStatus("Sauvegarde des cinematics..."); + + try { + await saveCinematicManifest(manifest); + setStatus("Manifeste sauvegarde dans public/cinematics.json."); + } catch (err) { + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(message); + } finally { + setIsSaving(false); + } + } + + function handleAddCinematic(): void { + if (!manifest) return; + + const cinematic = createCinematic(manifest.cinematics.length + 1); + setManifest({ + ...manifest, + cinematics: [...manifest.cinematics, cinematic], + }); + setSelectedCinematicId(cinematic.id); + setStatus("Nouvelle cinematic ajoutee localement."); + } + + function handleRemoveCinematic(cinematicId: string): void { + if (!manifest) return; + + const nextCinematics = manifest.cinematics.filter( + (cinematic) => cinematic.id !== cinematicId, + ); + setManifest({ ...manifest, cinematics: nextCinematics }); + setSelectedCinematicId(nextCinematics[0]?.id ?? ""); + setStatus("Cinematic supprimee localement."); + } + + function updateSelectedCinematic( + patch: CinematicPatch, + nextId = selectedCinematicId, + ): void { + if (!manifest || !selectedCinematic) return; + + setManifest({ + ...manifest, + cinematics: manifest.cinematics.map((cinematic) => + cinematic.id === selectedCinematic.id + ? getPatchedCinematic(cinematic, patch) + : cinematic, + ), + }); + setSelectedCinematicId(nextId); + } + + function updateKeyframe( + keyframeIndex: number, + patch: Partial, + ): void { + if (!selectedCinematic) return; + + updateSelectedCinematic({ + cameraKeyframes: selectedCinematic.cameraKeyframes.map( + (keyframe, index) => + index === keyframeIndex ? { ...keyframe, ...patch } : keyframe, + ), + }); + } + + function handleAddKeyframe(): void { + if (!selectedCinematic) return; + + const previousKeyframe = + selectedCinematic.cameraKeyframes[ + selectedCinematic.cameraKeyframes.length - 1 + ]; + if (!previousKeyframe) return; + + updateSelectedCinematic({ + cameraKeyframes: [ + ...selectedCinematic.cameraKeyframes, + createKeyframe(previousKeyframe), + ], + }); + setStatus("Keyframe ajoutee localement."); + } + + function handleRemoveKeyframe(keyframeIndex: number): void { + if (!selectedCinematic) return; + + updateSelectedCinematic({ + cameraKeyframes: selectedCinematic.cameraKeyframes.filter( + (_keyframe, index) => index !== keyframeIndex, + ), + }); + setStatus("Keyframe supprimee localement."); + } + + function updateDialogueCue( + cueIndex: number, + patch: Partial, + ): void { + if (!selectedCinematic) return; + + const dialogueCues = selectedCinematic.dialogueCues ?? []; + updateSelectedCinematic({ + dialogueCues: dialogueCues.map((cue, index) => + index === cueIndex ? { ...cue, ...patch } : cue, + ), + }); + } + + function handleAddDialogueCue(): void { + if (!selectedCinematic) return; + + const dialogueCues = selectedCinematic.dialogueCues ?? []; + const previousCue = dialogueCues[dialogueCues.length - 1] ?? null; + updateSelectedCinematic({ + dialogueCues: [ + ...dialogueCues, + createDialogueCue(dialogueManifest?.dialogues ?? [], previousCue), + ], + }); + setStatus("Dialogue cue ajoutee localement."); + } + + function handleRemoveDialogueCue(cueIndex: number): void { + if (!selectedCinematic) return; + + updateSelectedCinematic({ + dialogueCues: (selectedCinematic.dialogueCues ?? []).filter( + (_cue, index) => index !== cueIndex, + ), + }); + setStatus("Dialogue cue supprimee localement."); + } + + useEffect(() => { + let mounted = true; + + void Promise.all([loadCinematicManifest(), loadDialogueManifest()]) + .then(([loadedManifest, loadedDialogueManifest]) => { + if (!mounted) return; + + setManifest(loadedManifest); + setDialogueManifest(loadedDialogueManifest); + setSelectedCinematicId(loadedManifest?.cinematics[0]?.id ?? ""); + setStatus( + loadedManifest + ? `Manifeste charge: ${loadedManifest.cinematics.length} cinematics.` + : "Manifeste cinematics introuvable ou invalide.", + ); + }) + .catch((err: unknown) => { + if (!mounted) return; + + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(message); + setManifest(null); + }); + + return () => { + mounted = false; + }; + }, []); + + return ( +
+
+

Cinematics

+ {manifest?.cinematics.length ?? 0} items +
+ +
+ + + +
+ + {manifest && ( + + )} + + {selectedCinematic && ( +
+ + + + +
+
+ Camera keyframes + +
+ + {selectedCinematic.cameraKeyframes.map( + (keyframe, keyframeIndex) => ( +
+
+ Keyframe {keyframeIndex + 1} + +
+ + + + + updateKeyframe(keyframeIndex, { + position: updateVector(keyframe.position, axis, value), + }) + } + /> + + + updateKeyframe(keyframeIndex, { + target: updateVector(keyframe.target, axis, value), + }) + } + /> +
+ ), + )} +
+ +
+
+ Dialogue cues + +
+ + {(selectedCinematic.dialogueCues ?? []).length === 0 ? ( +

Aucun dialogue synchronise avec cette cinematic.

+ ) : ( + (selectedCinematic.dialogueCues ?? []).map((cue, cueIndex) => ( +
+
+ Dialogue {cueIndex + 1} + +
+ + + + +
+ )) + )} +
+ + + + +
+ )} + +

{status}

+
+ + {errors.length === 0 + ? "Manifeste local valide." + : `${errors.length} erreur${errors.length > 1 ? "s" : ""} locale${errors.length > 1 ? "s" : ""}.`} + + {errors.length > 0 && ( +
    + {errors.map((error) => ( +
  • {error}
  • + ))} +
+ )} +
+
+ ); +} + +interface VectorInputsProps { + label: string; + value: Vector3Tuple; + onChange: (axis: VectorAxis, value: number) => void; +} + +function VectorInputs({ + label, + value, + onChange, +}: VectorInputsProps): React.JSX.Element { + return ( +
+ {label} + {VECTOR_AXES.map(({ label: axisLabel, axis }) => ( + + ))} +
+ ); +} diff --git a/src/components/editor/EditorControls.tsx b/src/components/editor/EditorControls.tsx new file mode 100644 index 0000000..b5cf0ee --- /dev/null +++ b/src/components/editor/EditorControls.tsx @@ -0,0 +1,319 @@ +import { + Box, + Braces, + Download, + Expand, + Keyboard, + Lock, + MousePointer2, + Move3D, + Redo2, + RotateCw, + Save, + Undo2, +} from "lucide-react"; +import { EditorCinematicManifestPanel } from "@/components/editor/EditorCinematicManifestPanel"; +import { EditorDialogueManifestPanel } from "@/components/editor/EditorDialogueManifestPanel"; +import { EditorSrtPanel } from "@/components/editor/EditorSrtPanel"; +import type { CinematicDefinition } from "@/types/cinematics/cinematics"; +import type { MapNode, TransformMode } from "@/types/editor/editor"; + +interface EditorControlsProps { + transformMode: TransformMode; + onTransformModeChange: (mode: TransformMode) => void; + selectedNodeIndex: number | null; + mapNodes: MapNode[]; + nodesCount: number; + selectedNodeName: string | null; + undoCount: number; + redoCount: number; + onUndo: () => void; + onRedo: () => void; + onExportJson: () => void; + onSaveToServer?: (() => void | Promise) | undefined; + onPlayerMode?: (() => void) | undefined; + onPreviewCinematic?: ((cinematic: CinematicDefinition) => void) | undefined; + isPlayerMode?: boolean; +} + +const TRANSFORM_OPTIONS = [ + { mode: "translate", label: "Translate", shortcut: "T", Icon: Move3D }, + { mode: "rotate", label: "Rotate", shortcut: "R", Icon: RotateCw }, + { mode: "scale", label: "Scale", shortcut: "S", Icon: Expand }, +] as const; + +const EDITOR_SHORTCUTS = [ + ["Click", "Select object"], + ["T / R / S", "Transform mode"], + ["Ctrl Z / Y", "Undo / redo"], + ["Esc", "Deselect"], + ["WASD", "Move when locked"], +] as const; + +export function EditorControls({ + transformMode, + onTransformModeChange, + selectedNodeIndex, + mapNodes, + nodesCount, + selectedNodeName, + undoCount, + redoCount, + onUndo, + onRedo, + onExportJson, + onSaveToServer, + onPlayerMode, + onPreviewCinematic, + isPlayerMode, +}: EditorControlsProps): React.JSX.Element { + const viewModeLabel = isPlayerMode ? "View locked" : "Lock view"; + const jsonPreview = getJsonPreview(mapNodes, selectedNodeIndex); + + return ( + <> + + + ); +} + +interface JsonPreviewLine { + number: number; + content: string; + isSelected: boolean; +} + +interface JsonPreview { + label: string; + lines: JsonPreviewLine[]; +} + +function getJsonPreview( + mapNodes: MapNode[], + selectedNodeIndex: number | null, +): JsonPreview { + const { lines, ranges } = formatMapNodesWithRanges(mapNodes); + + if (selectedNodeIndex === null || !ranges[selectedNodeIndex]) { + return { + label: `${lines.length} raw lines`, + lines: lines.map((content, index) => ({ + number: index + 1, + content, + isSelected: false, + })), + }; + } + + const range = ranges[selectedNodeIndex]; + const selectedLines = lines.slice(range.start - 1, range.end); + + return { + label: `Lines ${range.start}-${range.end}`, + lines: selectedLines.map((content, index) => ({ + number: range.start + index, + content, + isSelected: true, + })), + }; +} + +function formatMapNodesWithRanges(mapNodes: MapNode[]): { + lines: string[]; + ranges: Array<{ start: number; end: number }>; +} { + const lines = ["["]; + const ranges: Array<{ start: number; end: number }> = []; + + mapNodes.forEach((node, index) => { + const objectLines = JSON.stringify(node, null, 2) + .split("\n") + .map((line) => ` ${line}`); + + if (index < mapNodes.length - 1) { + objectLines[objectLines.length - 1] += ","; + } + + const start = lines.length + 1; + lines.push(...objectLines); + ranges.push({ start, end: lines.length }); + }); + + lines.push("]"); + + return { lines, ranges }; +} diff --git a/src/components/editor/EditorDialogueManifestPanel.tsx b/src/components/editor/EditorDialogueManifestPanel.tsx new file mode 100644 index 0000000..5ea1915 --- /dev/null +++ b/src/components/editor/EditorDialogueManifestPanel.tsx @@ -0,0 +1,554 @@ +import { useEffect, useRef, useState } from "react"; +import { Play, Plus, RefreshCw, Save, Trash2 } from "lucide-react"; +import type { + DialogueDefinition, + DialogueManifest, + DialogueSpeaker, + DialogueVoiceId, +} from "@/types/dialogues/dialogues"; +import { loadDialogueManifest } from "@/utils/dialogues/loadDialogueManifest"; +import { playDialogueById } from "@/utils/dialogues/playDialogue"; +import { parseSrt } from "@/utils/subtitles/parseSrt"; + +const DEFAULT_VOICE: DialogueVoiceId = "narrateur"; +type DialoguePatch = Partial> & { + timecode?: number | undefined; +}; + +function createDialogue( + index: number, + manifest: DialogueManifest, + voice: DialogueVoiceId, +): DialogueDefinition { + return { + id: `new_dialogue_${index}`, + voice, + audio: `/sounds/dialogue/new_dialogue_${index}.mp3`, + subtitleCueIndex: getNextCueIndex(manifest, voice), + }; +} + +function getNextCueIndex( + manifest: DialogueManifest, + voice: DialogueVoiceId, +): number { + const cueIndexes = manifest.dialogues + .filter((dialogue) => dialogue.voice === voice) + .map((dialogue) => dialogue.subtitleCueIndex); + + return Math.max(0, ...cueIndexes) + 1; +} + +function getVoiceSpeaker( + manifest: DialogueManifest, + voice: DialogueVoiceId, +): DialogueSpeaker { + return ( + manifest.voices.find((item) => item.id === voice)?.speaker ?? "Narrateur" + ); +} + +function getFrenchSrtPath(voice: DialogueVoiceId): string { + return `/sounds/dialogue/subtitles/fr/${voice}.srt`; +} + +function createSrtCueBlock(cueIndex: number, speaker: DialogueSpeaker): string { + return `${cueIndex}\n00:00:00,000 --> 00:00:02,000\n${speaker}: Nouveau sous-titre ${cueIndex} a definir`; +} + +function appendSrtCueIfMissing( + content: string, + cueIndex: number, + speaker: DialogueSpeaker, +): string { + const cues = parseSrt(content); + if (cues.some((cue) => cue.index === cueIndex)) return content; + + const trimmedContent = content.trim(); + const cueBlock = createSrtCueBlock(cueIndex, speaker); + return trimmedContent + ? `${trimmedContent}\n\n${cueBlock}\n` + : `${cueBlock}\n`; +} + +async function saveSrtFile( + voice: DialogueVoiceId, + content: string, +): Promise { + const response = await fetch("/api/save-srt", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ voice, language: "fr", content }), + }); + + if (!response.ok) { + const body = (await response.json().catch(() => null)) as { + error?: string; + } | null; + throw new Error(body?.error ?? "Sauvegarde SRT impossible"); + } +} + +async function createFrenchSrtCue( + manifest: DialogueManifest, + dialogue: DialogueDefinition, +): Promise { + const srtPath = getFrenchSrtPath(dialogue.voice); + const response = await fetch(srtPath); + const content = response.ok ? await response.text() : ""; + const nextContent = appendSrtCueIfMissing( + content, + dialogue.subtitleCueIndex, + getVoiceSpeaker(manifest, dialogue.voice), + ); + + await saveSrtFile(dialogue.voice, nextContent); +} + +function getManifestErrors(manifest: DialogueManifest | null): string[] { + if (!manifest) return ["Manifeste absent."]; + + const errors: string[] = []; + const ids = new Set(); + + manifest.dialogues.forEach((dialogue, index) => { + const label = dialogue.id || `Dialogue ${index + 1}`; + + if (!dialogue.id.trim()) errors.push(`${label}: id obligatoire.`); + if (ids.has(dialogue.id)) errors.push(`${label}: id duplique.`); + ids.add(dialogue.id); + + if (!dialogue.audio.startsWith("/sounds/dialogue/")) { + errors.push(`${label}: audio doit commencer par /sounds/dialogue/.`); + } + + if (!Number.isInteger(dialogue.subtitleCueIndex)) { + errors.push(`${label}: cue SRT invalide.`); + } + + if ( + dialogue.timecode !== undefined && + (!Number.isFinite(dialogue.timecode) || dialogue.timecode < 0) + ) { + errors.push(`${label}: timecode invalide.`); + } + }); + + return errors; +} + +async function saveDialogueManifest(manifest: DialogueManifest): Promise { + const response = await fetch("/api/save-dialogues", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify(manifest), + }); + + if (!response.ok) { + const body = (await response.json().catch(() => null)) as { + error?: string; + } | null; + throw new Error(body?.error ?? "Sauvegarde du manifeste impossible"); + } +} + +function getPatchedDialogue( + dialogue: DialogueDefinition, + patch: DialoguePatch, +): DialogueDefinition { + const nextDialogue: DialogueDefinition = { + id: patch.id ?? dialogue.id, + voice: patch.voice ?? dialogue.voice, + audio: patch.audio ?? dialogue.audio, + subtitleCueIndex: patch.subtitleCueIndex ?? dialogue.subtitleCueIndex, + }; + + if ("timecode" in patch) { + if (patch.timecode !== undefined) nextDialogue.timecode = patch.timecode; + } else if (dialogue.timecode !== undefined) { + nextDialogue.timecode = dialogue.timecode; + } + + return nextDialogue; +} + +export function EditorDialogueManifestPanel(): React.JSX.Element { + const previewAudioRef = useRef(null); + const [manifest, setManifest] = useState(null); + const [selectedDialogueId, setSelectedDialogueId] = useState(""); + const [status, setStatus] = useState("Chargement du manifeste..."); + const [isSaving, setIsSaving] = useState(false); + const [isPreviewing, setIsPreviewing] = useState(false); + const [isCreatingSrtCue, setIsCreatingSrtCue] = useState(false); + const errors = getManifestErrors(manifest); + const selectedDialogue = + manifest?.dialogues.find( + (dialogue) => dialogue.id === selectedDialogueId, + ) ?? + manifest?.dialogues[0] ?? + null; + const voices = manifest?.voices ?? []; + + async function handleLoad(): Promise { + setStatus("Chargement du manifeste..."); + + try { + const loadedManifest = await loadDialogueManifest(); + setManifest(loadedManifest); + setSelectedDialogueId(loadedManifest?.dialogues[0]?.id ?? ""); + setStatus( + loadedManifest + ? `Manifeste charge: ${loadedManifest.dialogues.length} dialogues.` + : "Manifeste introuvable ou invalide.", + ); + } catch (err) { + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(message); + setManifest(null); + } + } + + async function handleSave(): Promise { + if (!manifest) return; + if (errors.length > 0) { + setStatus("Corrige les erreurs avant de sauvegarder."); + return; + } + + setIsSaving(true); + setStatus("Sauvegarde du manifeste..."); + + try { + await saveDialogueManifest(manifest); + setStatus( + "Manifeste sauvegarde dans public/sounds/dialogue/dialogues.json.", + ); + } catch (err) { + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(message); + } finally { + setIsSaving(false); + } + } + + async function handleAddDialogue(): Promise { + if (!manifest) return; + + const voice = selectedDialogue?.voice ?? DEFAULT_VOICE; + const dialogue = createDialogue( + manifest.dialogues.length + 1, + manifest, + voice, + ); + const nextManifest = { + ...manifest, + dialogues: [...manifest.dialogues, dialogue], + }; + + setManifest(nextManifest); + setSelectedDialogueId(dialogue.id); + setIsCreatingSrtCue(true); + setStatus("Nouveau dialogue ajoute localement. Creation de la cue FR..."); + + try { + await createFrenchSrtCue(nextManifest, dialogue); + setStatus( + `Nouveau dialogue ajoute avec cue FR ${dialogue.subtitleCueIndex}. Sauvegarde le manifeste pour le garder.`, + ); + } catch (err) { + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus( + `Dialogue ajoute localement, mais cue FR non creee: ${message}`, + ); + } finally { + setIsCreatingSrtCue(false); + } + } + + function handleRemoveDialogue(dialogueId: string): void { + if (!manifest) return; + + const nextDialogues = manifest.dialogues.filter( + (dialogue) => dialogue.id !== dialogueId, + ); + setManifest({ ...manifest, dialogues: nextDialogues }); + setSelectedDialogueId(nextDialogues[0]?.id ?? ""); + setStatus("Dialogue supprime localement."); + } + + function updateSelectedDialogue( + patch: DialoguePatch, + nextId = selectedDialogueId, + ): void { + if (!manifest || !selectedDialogue) return; + + setManifest({ + ...manifest, + dialogues: manifest.dialogues.map((dialogue) => + dialogue.id === selectedDialogue.id + ? getPatchedDialogue(dialogue, patch) + : dialogue, + ), + }); + setSelectedDialogueId(nextId); + } + + async function handlePreviewDialogue(): Promise { + if (!manifest || !selectedDialogue) return; + if (errors.length > 0) { + setStatus("Corrige les erreurs avant de lancer la preview."); + return; + } + + previewAudioRef.current?.pause(); + previewAudioRef.current = null; + setIsPreviewing(true); + setStatus(`Preview dialogue: ${selectedDialogue.id}`); + + try { + const audio = await playDialogueById(manifest, selectedDialogue.id); + previewAudioRef.current = audio; + + if (!audio) { + setStatus("Dialogue introuvable pour la preview."); + return; + } + + const handleFinish = (): void => { + audio.removeEventListener("ended", handleFinish); + audio.removeEventListener("pause", handleFinish); + if (previewAudioRef.current === audio) previewAudioRef.current = null; + setIsPreviewing(false); + }; + + audio.addEventListener("ended", handleFinish); + audio.addEventListener("pause", handleFinish); + } catch (err) { + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(message); + setIsPreviewing(false); + } + } + + async function handleCreateFrenchSrtCue(): Promise { + if (!manifest || !selectedDialogue) return; + + setIsCreatingSrtCue(true); + setStatus(`Creation de la cue FR ${selectedDialogue.subtitleCueIndex}...`); + + try { + await createFrenchSrtCue(manifest, selectedDialogue); + setStatus(`Cue FR ${selectedDialogue.subtitleCueIndex} prete.`); + } catch (err) { + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(message); + } finally { + setIsCreatingSrtCue(false); + } + } + + useEffect(() => { + let mounted = true; + + void loadDialogueManifest() + .then((loadedManifest) => { + if (!mounted) return; + + setManifest(loadedManifest); + setSelectedDialogueId(loadedManifest?.dialogues[0]?.id ?? ""); + setStatus( + loadedManifest + ? `Manifeste charge: ${loadedManifest.dialogues.length} dialogues.` + : "Manifeste introuvable ou invalide.", + ); + }) + .catch((err: unknown) => { + if (!mounted) return; + + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(message); + setManifest(null); + }); + + return () => { + mounted = false; + previewAudioRef.current?.pause(); + previewAudioRef.current = null; + }; + }, []); + + return ( +
+
+

Dialogues

+ {manifest?.dialogues.length ?? 0} items +
+ +
+ + + +
+ + {manifest && ( + + )} + + {selectedDialogue && ( +
+ + + + + + + + + + + + + + + +
+ )} + +

{status}

+
+ + {errors.length === 0 + ? "Manifeste local valide." + : `${errors.length} erreur${errors.length > 1 ? "s" : ""} locale${errors.length > 1 ? "s" : ""}.`} + + {errors.length > 0 && ( +
    + {errors.map((error) => ( +
  • {error}
  • + ))} +
+ )} +
+
+ ); +} diff --git a/src/components/editor/EditorSrtPanel.tsx b/src/components/editor/EditorSrtPanel.tsx new file mode 100644 index 0000000..88c5f15 --- /dev/null +++ b/src/components/editor/EditorSrtPanel.tsx @@ -0,0 +1,743 @@ +import { useEffect, useRef, useState } from "react"; +import { Download, RefreshCw, Save } from "lucide-react"; +import type { SubtitleLanguage } from "@/managers/stores/useSettingsStore"; +import type { + DialogueDefinition, + DialogueManifest, + DialogueSpeaker, + DialogueVoiceId, +} from "@/types/dialogues/dialogues"; +import { loadDialogueManifest } from "@/utils/dialogues/loadDialogueManifest"; +import { parseSrt } from "@/utils/subtitles/parseSrt"; + +interface SrtVoiceOption { + id: DialogueVoiceId; + label: DialogueSpeaker; +} + +interface SrtDiagnostic { + cueCount: number; + expectedCueCount: number; + errors: string[]; +} + +interface TextRange { + start: number; + end: number; +} + +interface DialogueValidationResult { + valid: boolean; + errors: string[]; + warnings: string[]; +} + +type CueTimeEdge = "start" | "end"; +const CUE_NUDGE_SECONDS = 0.1; + +const SRT_VOICES: SrtVoiceOption[] = [ + { id: "narrateur", label: "Narrateur" }, + { id: "fermier", label: "Fermier" }, + { id: "electricienne", label: "Electricienne" }, +]; +const DEFAULT_SRT_VOICE: SrtVoiceOption = { + id: "narrateur", + label: "Narrateur", +}; + +const SRT_LANGUAGES: SubtitleLanguage[] = ["fr", "en"]; +const SRT_TIME_LINE_PATTERN = + /^\d{2}:\d{2}:\d{2},\d{3} --> \d{2}:\d{2}:\d{2},\d{3}$/; + +function getSrtPath( + voice: DialogueVoiceId, + language: SubtitleLanguage, +): string { + return `/sounds/dialogue/subtitles/${language}/${voice}.srt`; +} + +function createSrtTemplate( + speaker: DialogueSpeaker, + expectedCueIndexes: number[], +): string { + const cueIndexes = expectedCueIndexes.length > 0 ? expectedCueIndexes : [1]; + + return `${cueIndexes + .map((cueIndex, index) => { + const startTime = index * 3; + const endTime = startTime + 2; + + return `${cueIndex}\n${formatSrtTime(startTime)} --> ${formatSrtTime(endTime)}\n${speaker}: Sous-titre ${cueIndex} a definir`; + }) + .join("\n\n")}\n`; +} + +function formatSrtTime(totalSeconds: number): string { + const safeSeconds = Math.max(0, totalSeconds); + const totalMilliseconds = Math.round(safeSeconds * 1000); + const milliseconds = totalMilliseconds % 1000; + const totalWholeSeconds = Math.floor(totalMilliseconds / 1000); + const hours = Math.floor(totalWholeSeconds / 3600); + const minutes = Math.floor((totalWholeSeconds % 3600) / 60); + const seconds = totalWholeSeconds % 60; + + return `${padTime(hours)}:${padTime(minutes)}:${padTime(seconds)},${padMilliseconds(milliseconds)}`; +} + +function formatPreviewTime(totalSeconds: number): string { + return `${Math.max(0, totalSeconds).toFixed(1)}s`; +} + +function parseSrtTime(value: string): number | null { + const match = value.match(/^(\d{2}):(\d{2}):(\d{2}),(\d{3})$/); + if (!match) return null; + + const [, hours, minutes, seconds, milliseconds] = match; + if (!hours || !minutes || !seconds || !milliseconds) return null; + + return ( + Number(hours) * 3600 + + Number(minutes) * 60 + + Number(seconds) + + Number(milliseconds) / 1000 + ); +} + +function padTime(value: number): string { + return value.toString().padStart(2, "0"); +} + +function padMilliseconds(value: number): string { + return value.toString().padStart(3, "0"); +} + +function getSrtDiagnostic( + content: string, + expectedCueIndexes: number[], +): SrtDiagnostic { + const normalizedContent = content.replace(/^\uFEFF/, "").replace(/\r/g, ""); + const blocks = normalizedContent + .trim() + .split(/\n{2,}/) + .filter(Boolean); + const cues = parseSrt(content); + const errors: string[] = []; + const indexes = new Set(); + + if (blocks.length === 0) { + errors.push("Le fichier SRT est vide."); + } + + blocks.forEach((block, blockIndex) => { + const lines = block + .split("\n") + .map((line) => line.trim()) + .filter(Boolean); + const displayIndex = blockIndex + 1; + const cueIndex = Number(lines[0]); + + if (lines.length < 3) { + errors.push( + `Bloc ${displayIndex}: il manque un index, un timecode ou un texte.`, + ); + return; + } + + if (!Number.isInteger(cueIndex)) { + errors.push(`Bloc ${displayIndex}: l'index doit etre un nombre entier.`); + } else if (indexes.has(cueIndex)) { + errors.push(`Bloc ${displayIndex}: l'index ${cueIndex} est duplique.`); + } else { + indexes.add(cueIndex); + } + + if (!SRT_TIME_LINE_PATTERN.test(lines[1] ?? "")) { + errors.push( + `Bloc ${displayIndex}: le timecode doit utiliser HH:MM:SS,mmm --> HH:MM:SS,mmm.`, + ); + } + }); + + if (blocks.length > 0 && cues.length !== blocks.length) { + errors.push( + "Un ou plusieurs blocs ont une duree invalide ou un timecode illisible.", + ); + } + + const cueIndexes = new Set(cues.map((cue) => cue.index)); + const missingCueIndexes = expectedCueIndexes.filter( + (cueIndex) => !cueIndexes.has(cueIndex), + ); + + if (missingCueIndexes.length > 0) { + errors.push( + `Cues attendues par le manifeste manquantes: ${missingCueIndexes.join(", ")}.`, + ); + } + + return { + cueCount: cues.length, + expectedCueCount: expectedCueIndexes.length, + errors, + }; +} + +function getExpectedCueIndexes( + manifest: DialogueManifest | null, + voice: DialogueVoiceId, +): number[] { + return getExpectedDialogues(manifest, voice) + .map((dialogue) => dialogue.subtitleCueIndex) + .filter( + (cueIndex, index, cueIndexes) => cueIndexes.indexOf(cueIndex) === index, + ) + .sort((a, b) => a - b); +} + +function getExpectedDialogues( + manifest: DialogueManifest | null, + voice: DialogueVoiceId, +): DialogueDefinition[] { + if (!manifest) return []; + + return [...manifest.dialogues] + .filter((dialogue) => dialogue.voice === voice) + .sort((a, b) => a.subtitleCueIndex - b.subtitleCueIndex); +} + +function findCueBlockRange( + content: string, + cueIndex: number, +): TextRange | null { + const normalizedContent = content.replace(/\r/g, ""); + const cuePattern = new RegExp(`(^|\\n)${cueIndex}\\n`, "m"); + const match = normalizedContent.match(cuePattern); + + if (!match || match.index === undefined) return null; + + const start = match.index + (match[1] ? 1 : 0); + const nextBlockIndex = normalizedContent.indexOf("\n\n", start); + const end = nextBlockIndex === -1 ? normalizedContent.length : nextBlockIndex; + + return { start, end }; +} + +function updateCueTimecode( + content: string, + cueIndex: number, + edge: CueTimeEdge, + time: number, +): string | null { + const range = findCueBlockRange(content, cueIndex); + if (!range) return null; + + const block = content.slice(range.start, range.end); + const lines = block.split("\n"); + const timecodeLine = lines[1]; + if (!timecodeLine) return null; + + const [start, end] = timecodeLine.split(" --> "); + if (!start || !end) return null; + + lines[1] = + edge === "start" + ? `${formatSrtTime(time)} --> ${end}` + : `${start} --> ${formatSrtTime(time)}`; + + return `${content.slice(0, range.start)}${lines.join("\n")}${content.slice(range.end)}`; +} + +function nudgeCueTimecode( + content: string, + cueIndex: number, + delta: number, +): string | null { + const range = findCueBlockRange(content, cueIndex); + if (!range) return null; + + const block = content.slice(range.start, range.end); + const lines = block.split("\n"); + const timecodeLine = lines[1]; + if (!timecodeLine) return null; + + const [start, end] = timecodeLine.split(" --> "); + if (!start || !end) return null; + + const startTime = parseSrtTime(start); + const endTime = parseSrtTime(end); + if (startTime === null || endTime === null) return null; + + const nextStartTime = Math.max(0, startTime + delta); + const nextEndTime = Math.max(nextStartTime + 0.001, endTime + delta); + lines[1] = `${formatSrtTime(nextStartTime)} --> ${formatSrtTime(nextEndTime)}`; + + return `${content.slice(0, range.start)}${lines.join("\n")}${content.slice(range.end)}`; +} + +function downloadSrtFile( + voice: DialogueVoiceId, + language: SubtitleLanguage, + content: string, +): void { + const blob = new Blob([content], { type: "text/plain;charset=utf-8" }); + const url = URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.download = `${voice}.${language}.srt`; + link.click(); + window.setTimeout(() => URL.revokeObjectURL(url), 0); +} + +async function saveSrtFile( + voice: DialogueVoiceId, + language: SubtitleLanguage, + content: string, +): Promise { + const response = await fetch("/api/save-srt", { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ voice, language, content }), + }); + + if (!response.ok) { + const body = (await response.json().catch(() => null)) as { + error?: string; + } | null; + throw new Error(body?.error ?? "Sauvegarde SRT impossible"); + } +} + +async function validateDialogueAssets(): Promise { + const response = await fetch("/api/validate-dialogues"); + const body = (await response.json().catch(() => null)) as + | Partial + | { error?: string } + | null; + + if (!body) { + throw new Error("Validation dialogues impossible"); + } + + if ( + "valid" in body && + typeof body.valid === "boolean" && + Array.isArray(body.errors) && + Array.isArray(body.warnings) + ) { + return { + valid: body.valid, + errors: body.errors.filter((item) => typeof item === "string"), + warnings: body.warnings.filter((item) => typeof item === "string"), + }; + } + + throw new Error( + "error" in body && body.error + ? body.error + : "Validation dialogues impossible", + ); +} + +export function EditorSrtPanel(): React.JSX.Element { + const textareaRef = useRef(null); + const [voice, setVoice] = useState("narrateur"); + const [language, setLanguage] = useState("fr"); + const [content, setContent] = useState(""); + const [status, setStatus] = useState("Chargement du SRT..."); + const [isSaving, setIsSaving] = useState(false); + const [isValidatingDialogues, setIsValidatingDialogues] = useState(false); + const [dialogueValidationResult, setDialogueValidationResult] = + useState(null); + const [manifest, setManifest] = useState(null); + const [audioCurrentTime, setAudioCurrentTime] = useState(0); + const [selectedDialogueId, setSelectedDialogueId] = useState(""); + const selectedVoice = + SRT_VOICES.find((item) => item.id === voice) ?? DEFAULT_SRT_VOICE; + const expectedDialogues = getExpectedDialogues(manifest, voice); + const expectedCueIndexes = getExpectedCueIndexes(manifest, voice); + const parsedCues = parseSrt(content); + const activeCue = + parsedCues.find( + (cue) => + audioCurrentTime >= cue.startTime && audioCurrentTime < cue.endTime, + ) ?? null; + const diagnostic = getSrtDiagnostic(content, expectedCueIndexes); + const isSrtValid = diagnostic.errors.length === 0; + const dialogueValidationClass = dialogueValidationResult + ? dialogueValidationResult.valid + ? "is-valid" + : "is-invalid" + : "is-idle"; + const srtTemplate = createSrtTemplate( + selectedVoice.label, + expectedCueIndexes, + ); + const selectedDialogue = + expectedDialogues.find((dialogue) => dialogue.id === selectedDialogueId) ?? + expectedDialogues[0] ?? + null; + + async function handleSave(): Promise { + if (!isSrtValid) { + setStatus("Corrige les erreurs SRT avant de sauvegarder."); + return; + } + + setIsSaving(true); + setStatus("Sauvegarde du SRT..."); + + try { + await saveSrtFile(voice, language, content); + setStatus(`Sauvegarde dans ${getSrtPath(voice, language)}`); + } catch (err) { + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(`${message}. Utilise Export SRT si le serveur dev est absent.`); + } finally { + setIsSaving(false); + } + } + + async function handleValidateDialogues(): Promise { + setIsValidatingDialogues(true); + setDialogueValidationResult(null); + + try { + const result = await validateDialogueAssets(); + setDialogueValidationResult(result); + setStatus( + result.valid + ? "Validation dialogues terminee." + : "Validation dialogues terminee avec erreurs.", + ); + } catch (err) { + const message = err instanceof Error ? err.message : "Erreur inconnue"; + setStatus(`${message}. Verifie que le serveur Vite est lance.`); + } finally { + setIsValidatingDialogues(false); + } + } + + function handleJumpToCue(cueIndex: number): void { + const range = findCueBlockRange(content, cueIndex); + + if (!range || !textareaRef.current) { + setStatus(`Cue ${cueIndex} introuvable dans le SRT.`); + return; + } + + textareaRef.current.focus(); + textareaRef.current.setSelectionRange(range.start, range.end); + setStatus(`Cue ${cueIndex} selectionnee dans le SRT.`); + } + + function handleSetCueTime(cueIndex: number, edge: CueTimeEdge): void { + const updatedContent = updateCueTimecode( + content, + cueIndex, + edge, + audioCurrentTime, + ); + + if (!updatedContent) { + setStatus(`Cue ${cueIndex} introuvable ou timecode invalide.`); + return; + } + + setContent(updatedContent); + setStatus( + `Cue ${cueIndex}: ${edge === "start" ? "debut" : "fin"} place a ${formatSrtTime(audioCurrentTime)}.`, + ); + } + + function handleNudgeCue(cueIndex: number, delta: number): void { + const updatedContent = nudgeCueTimecode(content, cueIndex, delta); + + if (!updatedContent) { + setStatus(`Cue ${cueIndex} introuvable ou timecode invalide.`); + return; + } + + setContent(updatedContent); + setStatus( + `Cue ${cueIndex} decalee de ${delta > 0 ? "+" : ""}${delta.toFixed(1)}s.`, + ); + } + + useEffect(() => { + let mounted = true; + + void loadDialogueManifest() + .then((loadedManifest) => { + if (mounted) setManifest(loadedManifest); + }) + .catch(() => { + if (mounted) setManifest(null); + }); + + return () => { + mounted = false; + }; + }, []); + + useEffect(() => { + let mounted = true; + const srtPath = getSrtPath(voice, language); + + void fetch(srtPath) + .then(async (response) => { + if (!mounted) return; + + if (!response.ok) { + setContent(srtTemplate); + setStatus("Fichier absent, template local cree"); + return; + } + + setContent(await response.text()); + setStatus(`Charge depuis ${srtPath}`); + }) + .catch(() => { + if (!mounted) return; + setContent(srtTemplate); + setStatus("Erreur de chargement, template local cree"); + }); + + return () => { + mounted = false; + }; + }, [language, selectedVoice.label, srtTemplate, voice]); + + return ( +
+
+

SRT

+ {language.toUpperCase()} +
+ +
+ + + +
+ +
+ + + {selectedDialogue && ( +
+ Cue {selectedDialogue.subtitleCueIndex} + {selectedDialogue.id} +
+ )} +
+ +