Compare commits
17 Commits
8180088b3b
...
96bc3df51e
| Author | SHA1 | Date | |
|---|---|---|---|
| 96bc3df51e | |||
| 4c9e1f65c0 | |||
| 9440be3251 | |||
| f73661c23b | |||
| fe88c2bf47 | |||
| 496bb50095 | |||
| 71bb2b25da | |||
| 29db6ec4b7 | |||
| 21a6d7c9ec | |||
| 18a9ae9978 | |||
| ad2656a61f | |||
| 6655abeeec | |||
| 749cc18211 | |||
| 64331b4566 | |||
| 3104859bb7 | |||
| 1528f54472 | |||
| 4ce5f5f2de |
265
LEVEL_TRANSITION.md
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
# Immersive Level Progression Plan
|
||||||
|
|
||||||
|
## Overview
|
||||||
|
Add the ability for players to progress to the next level while staying in VR/immersive mode. This includes a "NEXT LEVEL" button on the status screen, fade-to-black transition, proper cleanup, and mission brief display.
|
||||||
|
|
||||||
|
## User Requirements
|
||||||
|
- Show mission brief for the new level
|
||||||
|
- Use fade-to-black transition (smoother UX)
|
||||||
|
- Reset all game statistics for each level
|
||||||
|
- Maintain deep-link reload capability
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Implementation Approach
|
||||||
|
|
||||||
|
### Architecture Decision: Create LevelTransitionManager
|
||||||
|
|
||||||
|
Create a new singleton class rather than adding to existing code because:
|
||||||
|
1. Keeps transition logic isolated (~90 lines)
|
||||||
|
2. Avoids bloating statusScreen.ts (already 700 lines)
|
||||||
|
3. Single responsibility principle
|
||||||
|
4. Follows existing patterns (InputControlManager, ProgressionManager)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 1: Create VR Fade Effect
|
||||||
|
|
||||||
|
**New file: `src/ui/effects/vrFadeEffect.ts`** (~60 lines)
|
||||||
|
|
||||||
|
For VR, use a black sphere that surrounds the XR camera (2D post-process won't work correctly for stereo rendering):
|
||||||
|
|
||||||
|
- Create small sphere (0.5m diameter) parented to XR camera
|
||||||
|
- Material: pure black, `backFaceCulling = false` (see inside)
|
||||||
|
- `renderingGroupId = 3` (render in front of everything)
|
||||||
|
- Animate alpha 0→1 for fadeOut, 1→0 for fadeIn
|
||||||
|
- Use BabylonJS Animation class with 500ms duration
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 2: Create Level Transition Manager
|
||||||
|
|
||||||
|
**New file: `src/core/levelTransitionManager.ts`** (~90 lines)
|
||||||
|
|
||||||
|
Singleton that orchestrates the transition sequence:
|
||||||
|
|
||||||
|
```
|
||||||
|
transitionToLevel(nextLevelSlug):
|
||||||
|
1. Initialize fade sphere (parent to XR camera)
|
||||||
|
2. fadeOut(500ms) - screen goes black
|
||||||
|
3. currentLevel.dispose() - cleanup all entities
|
||||||
|
4. RockFactory.reset() then init() - reset asteroid factory
|
||||||
|
5. Get new level config from LevelRegistry
|
||||||
|
6. Create new Level1(config, audioEngine, false, levelSlug)
|
||||||
|
7. newLevel.initialize() - creates ship, asteroids, etc.
|
||||||
|
8. newLevel.setupXRCamera() - re-parent XR camera to new ship
|
||||||
|
9. fadeIn(500ms) - reveal new scene
|
||||||
|
10. newLevel.showMissionBrief() - show objectives
|
||||||
|
11. (Player clicks START on mission brief)
|
||||||
|
12. newLevel.startGameplay() - timer begins
|
||||||
|
```
|
||||||
|
|
||||||
|
Key considerations:
|
||||||
|
- Store reference to audioEngine (passed once, reused)
|
||||||
|
- Store reference to currentLevel (updated on transition)
|
||||||
|
- XR session stays active throughout
|
||||||
|
- Physics engine stays active (bodies are disposed, not engine)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 3: Enable NEXT LEVEL Button on StatusScreen
|
||||||
|
|
||||||
|
**File: `src/ui/hud/statusScreen.ts`**
|
||||||
|
|
||||||
|
### 3a. Uncomment button code (lines 248-262)
|
||||||
|
|
||||||
|
Currently commented out NEXT LEVEL button exists. Uncomment and add hover effect:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
this._nextLevelButton = Button.CreateSimpleButton("nextLevelButton", "NEXT LEVEL");
|
||||||
|
this._nextLevelButton.width = "300px";
|
||||||
|
this._nextLevelButton.height = "60px";
|
||||||
|
this._nextLevelButton.color = "white";
|
||||||
|
this._nextLevelButton.background = "#0088ff";
|
||||||
|
this._nextLevelButton.cornerRadius = 10;
|
||||||
|
this._nextLevelButton.thickness = 0;
|
||||||
|
this._nextLevelButton.fontSize = "30px";
|
||||||
|
this._nextLevelButton.fontWeight = "bold";
|
||||||
|
addButtonHoverEffect(this._nextLevelButton, "#0088ff", "#00aaff"); // ADD THIS
|
||||||
|
this._nextLevelButton.onPointerClickObservable.add(() => {
|
||||||
|
if (this._onNextLevelCallback) {
|
||||||
|
this._onNextLevelCallback();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
buttonBar.addControl(this._nextLevelButton);
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3b. Verify visibility logic (around line 474)
|
||||||
|
|
||||||
|
Existing logic should handle button visibility on victory:
|
||||||
|
```typescript
|
||||||
|
if (this._nextLevelButton) {
|
||||||
|
this._nextLevelButton.isVisible = isGameEnded && victory && hasNextLevel;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Ensure `hasNextLevel` is properly checked using ProgressionManager.getNextLevel().
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 4: Modify Ship.handleNextLevel()
|
||||||
|
|
||||||
|
**File: `src/ship/ship.ts`** (lines 523-528)
|
||||||
|
|
||||||
|
Change from page reload to using LevelTransitionManager:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
private async handleNextLevel(): Promise<void> {
|
||||||
|
log.debug('Next Level button clicked - transitioning to next level');
|
||||||
|
|
||||||
|
const { ProgressionManager } = await import('../game/progression');
|
||||||
|
const progression = ProgressionManager.getInstance();
|
||||||
|
const nextLevel = progression.getNextLevel();
|
||||||
|
|
||||||
|
if (nextLevel) {
|
||||||
|
const { LevelTransitionManager } = await import('../core/levelTransitionManager');
|
||||||
|
const transitionManager = LevelTransitionManager.getInstance();
|
||||||
|
await transitionManager.transitionToLevel(nextLevel);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Phase 5: Wire Up LevelTransitionManager
|
||||||
|
|
||||||
|
**File: `src/core/handlers/levelSelectedHandler.ts`** or `src/main.ts`
|
||||||
|
|
||||||
|
After level is created, register it with the transition manager:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
import { LevelTransitionManager } from './core/levelTransitionManager';
|
||||||
|
|
||||||
|
// After level creation:
|
||||||
|
const transitionManager = LevelTransitionManager.getInstance();
|
||||||
|
transitionManager.setAudioEngine(audioEngine);
|
||||||
|
transitionManager.setCurrentLevel(level);
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cleanup Details
|
||||||
|
|
||||||
|
### Gap Found: Sun, Planets, Asteroids Not Tracked
|
||||||
|
|
||||||
|
**Issue**: In `Level1.initialize()` (line 393), the comment says "sun and planets are already created by deserializer" but they are NOT stored as instance variables. This means they won't be disposed when switching levels.
|
||||||
|
|
||||||
|
**Fix Required**: Add new instance variables and dispose them:
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Add to Level1 class properties:
|
||||||
|
private _sun: AbstractMesh | null = null;
|
||||||
|
private _planets: AbstractMesh[] = [];
|
||||||
|
private _asteroids: AbstractMesh[] = [];
|
||||||
|
|
||||||
|
// In initialize(), store the returned entities:
|
||||||
|
this._sun = entities.sun;
|
||||||
|
this._planets = entities.planets;
|
||||||
|
this._asteroids = entities.asteroids;
|
||||||
|
|
||||||
|
// In dispose(), add cleanup:
|
||||||
|
if (this._sun) this._sun.dispose();
|
||||||
|
this._planets.forEach(p => p.dispose());
|
||||||
|
this._asteroids.forEach(a => { if (!a.isDisposed()) a.dispose(); });
|
||||||
|
```
|
||||||
|
|
||||||
|
### What gets disposed (via Level1.dispose()):
|
||||||
|
- `_startBase` - landing base mesh
|
||||||
|
- `_endBase` - end base mesh (if exists)
|
||||||
|
- `_sun` - **NEW** sun mesh
|
||||||
|
- `_planets` - **NEW** planet meshes array
|
||||||
|
- `_asteroids` - **NEW** asteroid meshes (may already be destroyed in gameplay)
|
||||||
|
- `_backgroundStars` - particle system
|
||||||
|
- `_missionBrief` - UI overlay
|
||||||
|
- `_hintSystem` - audio hints
|
||||||
|
- `_ship` - cascades to: physics body, controllers, audio, weapons, statusScreen, scoreboard
|
||||||
|
- `_backgroundMusic` - audio
|
||||||
|
|
||||||
|
### What stays active:
|
||||||
|
- XR session
|
||||||
|
- XR camera (re-parented to new ship)
|
||||||
|
- Audio engine
|
||||||
|
- Main scene
|
||||||
|
- Physics engine (bodies disposed, engine stays)
|
||||||
|
- Render loop
|
||||||
|
|
||||||
|
### RockFactory reset:
|
||||||
|
- `RockFactory.reset()` clears static asteroid mesh references
|
||||||
|
- `RockFactory.init()` reloads base asteroid models
|
||||||
|
- Ensures fresh asteroid creation for new level
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Critical Files to Modify
|
||||||
|
|
||||||
|
| File | Changes |
|
||||||
|
|------|---------|
|
||||||
|
| `src/ui/effects/vrFadeEffect.ts` | CREATE - VR fade sphere effect (~60 lines) |
|
||||||
|
| `src/core/levelTransitionManager.ts` | CREATE - Transition orchestration (~90 lines) |
|
||||||
|
| `src/ui/hud/statusScreen.ts` | MODIFY - Uncomment NEXT LEVEL button, add hover effect |
|
||||||
|
| `src/ship/ship.ts` | MODIFY - Update handleNextLevel() to use transition manager |
|
||||||
|
| `src/levels/level1.ts` | MODIFY - Add _sun, _planets, _asteroids properties and dispose them |
|
||||||
|
| `src/main.ts` or handler | MODIFY - Wire up transition manager on level creation |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Transition Sequence Diagram
|
||||||
|
|
||||||
|
```
|
||||||
|
[Victory] → StatusScreen shows NEXT LEVEL button
|
||||||
|
↓
|
||||||
|
Player clicks NEXT LEVEL
|
||||||
|
↓
|
||||||
|
Ship.handleNextLevel()
|
||||||
|
↓
|
||||||
|
LevelTransitionManager.transitionToLevel()
|
||||||
|
↓
|
||||||
|
VRFadeEffect.fadeOut(500ms) ← Screen goes black
|
||||||
|
↓
|
||||||
|
Level1.dispose() ← All entities cleaned up
|
||||||
|
↓
|
||||||
|
RockFactory.reset() + init()
|
||||||
|
↓
|
||||||
|
new Level1(newConfig) ← New level created
|
||||||
|
↓
|
||||||
|
Level1.initialize() ← Asteroids, ship, bases created
|
||||||
|
↓
|
||||||
|
Level1.setupXRCamera() ← Camera re-parented
|
||||||
|
↓
|
||||||
|
VRFadeEffect.fadeIn(500ms) ← Scene revealed
|
||||||
|
↓
|
||||||
|
Level1.showMissionBrief() ← Objectives displayed
|
||||||
|
↓
|
||||||
|
Player clicks START
|
||||||
|
↓
|
||||||
|
Level1.startGameplay() ← Timer starts, gameplay begins
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Testing Checklist
|
||||||
|
|
||||||
|
1. NEXT LEVEL button appears only on victory when next level exists and is unlocked
|
||||||
|
2. Clicking button starts fade transition
|
||||||
|
3. XR session remains active throughout
|
||||||
|
4. Old level entities fully disposed (no memory leaks)
|
||||||
|
5. New level loads with correct configuration
|
||||||
|
6. XR camera re-parents to new ship correctly
|
||||||
|
7. Mission brief displays for new level
|
||||||
|
8. GameStats reset (time starts at 0:00)
|
||||||
|
9. Ship status (fuel/hull/ammo) reset to full
|
||||||
|
10. Deep-link reload still works (page refresh loads correct level)
|
||||||
|
11. Scoreboard shows correct asteroid count
|
||||||
|
12. Physics bodies cleaned up (no orphaned bodies)
|
||||||
|
13. Audio continues working (background music, effects)
|
||||||
|
14. Controllers work on new ship
|
||||||
3
bjsEditorPlugin/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
node_modules/
|
||||||
|
dist/
|
||||||
|
*.log
|
||||||
50
bjsEditorPlugin/README.md
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
# Space Game BabylonJS Editor Plugin
|
||||||
|
|
||||||
|
Export BabylonJS Editor scenes to Space Game LevelConfig format.
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
1. Build the plugin:
|
||||||
|
```bash
|
||||||
|
cd bjsEditorPlugin
|
||||||
|
npm install
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Install in BabylonJS Editor:
|
||||||
|
- Open BabylonJS Editor
|
||||||
|
- Edit → Preferences → Plugins
|
||||||
|
- Click "Add" and select this folder
|
||||||
|
- Apply and restart Editor
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
1. Create a workspace in BabylonJS Editor
|
||||||
|
2. Copy the script components from `editorScripts/` to your workspace's `src/scenes/` folder
|
||||||
|
3. Place meshes in your scene and attach the appropriate scripts:
|
||||||
|
- `AsteroidComponent` - for asteroids
|
||||||
|
- `ShipComponent` - for player spawn point
|
||||||
|
- `SunComponent` - for the sun
|
||||||
|
- `PlanetComponent` - for planets
|
||||||
|
- `TargetComponent` - for orbit/movement targets
|
||||||
|
4. Configure properties in the Inspector panel
|
||||||
|
5. Space Game → Export Level Config...
|
||||||
|
|
||||||
|
## Script Components
|
||||||
|
|
||||||
|
The `editorScripts/` folder contains TypeScript components to use in your Editor workspace.
|
||||||
|
These expose game-specific properties (velocities, targets, etc.) in the Inspector.
|
||||||
|
|
||||||
|
## Plugin Menu
|
||||||
|
|
||||||
|
- **Export Level Config...** - Downloads level.json file
|
||||||
|
- **Export to Clipboard** - Copies JSON to clipboard
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
```bash
|
||||||
|
npm run watch # Watch mode for development
|
||||||
|
npm run build # Production build
|
||||||
|
```
|
||||||
|
|
||||||
|
Debug in Editor: CTRL+ALT+i to open DevTools, F5 to reload plugin.
|
||||||
30
bjsEditorPlugin/editorScripts/AsteroidComponent.ts
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/**
|
||||||
|
* BabylonJS Editor script component for asteroids
|
||||||
|
* Copy this to your Editor workspace: src/scenes/scripts/AsteroidComponent.ts
|
||||||
|
*
|
||||||
|
* Attach to asteroid meshes to expose game properties in Inspector.
|
||||||
|
*/
|
||||||
|
import { Mesh } from "@babylonjs/core/Meshes/mesh";
|
||||||
|
|
||||||
|
import {
|
||||||
|
visibleAsNumber,
|
||||||
|
visibleAsString,
|
||||||
|
visibleAsVector3,
|
||||||
|
} from "babylonjs-editor-tools";
|
||||||
|
|
||||||
|
export default class AsteroidComponent extends Mesh {
|
||||||
|
@visibleAsVector3("Linear Velocity", { step: 0.1 })
|
||||||
|
public linearVelocity = { x: 0, y: 0, z: 0 };
|
||||||
|
|
||||||
|
@visibleAsVector3("Angular Velocity", { step: 0.01 })
|
||||||
|
public angularVelocity = { x: 0, y: 0, z: 0 };
|
||||||
|
|
||||||
|
@visibleAsNumber("Mass", { min: 1, max: 1000, step: 10 })
|
||||||
|
public mass: number = 200;
|
||||||
|
|
||||||
|
@visibleAsString("Target ID", { description: "Reference to a TargetComponent node" })
|
||||||
|
public targetId: string = "";
|
||||||
|
|
||||||
|
@visibleAsString("Target Mode", { description: "orbit | moveToward | (empty)" })
|
||||||
|
public targetMode: string = "";
|
||||||
|
}
|
||||||
17
bjsEditorPlugin/editorScripts/BaseComponent.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* BabylonJS Editor script component for the start base
|
||||||
|
* Copy this to your Editor workspace: src/scenes/scripts/BaseComponent.ts
|
||||||
|
*
|
||||||
|
* Attach to a mesh to mark it as the start base (yellow cylinder constraint zone).
|
||||||
|
*/
|
||||||
|
import { Mesh } from "@babylonjs/core/Meshes/mesh";
|
||||||
|
|
||||||
|
import { visibleAsString } from "babylonjs-editor-tools";
|
||||||
|
|
||||||
|
export default class BaseComponent extends Mesh {
|
||||||
|
@visibleAsString("Base GLB Path", { description: "Path to base GLB model" })
|
||||||
|
public baseGlbPath: string = "base.glb";
|
||||||
|
|
||||||
|
@visibleAsString("Landing GLB Path", { description: "Path to landing zone GLB" })
|
||||||
|
public landingGlbPath: string = "";
|
||||||
|
}
|
||||||
17
bjsEditorPlugin/editorScripts/PlanetComponent.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* BabylonJS Editor script component for planets
|
||||||
|
* Copy this to your Editor workspace: src/scenes/scripts/PlanetComponent.ts
|
||||||
|
*
|
||||||
|
* Attach to a mesh to configure planet properties.
|
||||||
|
*/
|
||||||
|
import { Mesh } from "@babylonjs/core/Meshes/mesh";
|
||||||
|
|
||||||
|
import { visibleAsNumber, visibleAsString } from "babylonjs-editor-tools";
|
||||||
|
|
||||||
|
export default class PlanetComponent extends Mesh {
|
||||||
|
@visibleAsNumber("Diameter", { min: 10, max: 1000, step: 10 })
|
||||||
|
public diameter: number = 100;
|
||||||
|
|
||||||
|
@visibleAsString("Texture Path", { description: "Path to planet texture" })
|
||||||
|
public texturePath: string = "";
|
||||||
|
}
|
||||||
17
bjsEditorPlugin/editorScripts/ShipComponent.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* BabylonJS Editor script component for player ship spawn
|
||||||
|
* Copy this to your Editor workspace: src/scenes/scripts/ShipComponent.ts
|
||||||
|
*
|
||||||
|
* Attach to a mesh/transform node to mark player spawn point.
|
||||||
|
*/
|
||||||
|
import { Mesh } from "@babylonjs/core/Meshes/mesh";
|
||||||
|
|
||||||
|
import { visibleAsVector3 } from "babylonjs-editor-tools";
|
||||||
|
|
||||||
|
export default class ShipComponent extends Mesh {
|
||||||
|
@visibleAsVector3("Start Velocity", { step: 0.1 })
|
||||||
|
public linearVelocity = { x: 0, y: 0, z: 0 };
|
||||||
|
|
||||||
|
@visibleAsVector3("Start Angular Vel", { step: 0.01 })
|
||||||
|
public angularVelocity = { x: 0, y: 0, z: 0 };
|
||||||
|
}
|
||||||
17
bjsEditorPlugin/editorScripts/SunComponent.ts
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
/**
|
||||||
|
* BabylonJS Editor script component for the sun
|
||||||
|
* Copy this to your Editor workspace: src/scenes/scripts/SunComponent.ts
|
||||||
|
*
|
||||||
|
* Attach to a mesh to mark it as the sun. Position from transform.
|
||||||
|
*/
|
||||||
|
import { Mesh } from "@babylonjs/core/Meshes/mesh";
|
||||||
|
|
||||||
|
import { visibleAsNumber } from "babylonjs-editor-tools";
|
||||||
|
|
||||||
|
export default class SunComponent extends Mesh {
|
||||||
|
@visibleAsNumber("Diameter", { min: 10, max: 200, step: 5 })
|
||||||
|
public diameter: number = 50;
|
||||||
|
|
||||||
|
@visibleAsNumber("Intensity", { min: 0, max: 5000000, step: 100000 })
|
||||||
|
public intensity: number = 1000000;
|
||||||
|
}
|
||||||
15
bjsEditorPlugin/editorScripts/TargetComponent.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* BabylonJS Editor script component for orbit/movement targets
|
||||||
|
* Copy this to your Editor workspace: src/scenes/scripts/TargetComponent.ts
|
||||||
|
*
|
||||||
|
* Attach to a TransformNode to create an invisible target point.
|
||||||
|
* Asteroids can reference this by targetId to orbit or move toward.
|
||||||
|
*/
|
||||||
|
import { TransformNode } from "@babylonjs/core/Meshes/transformNode";
|
||||||
|
|
||||||
|
import { visibleAsString } from "babylonjs-editor-tools";
|
||||||
|
|
||||||
|
export default class TargetComponent extends TransformNode {
|
||||||
|
@visibleAsString("Display Name", { description: "Friendly name for this target" })
|
||||||
|
public displayName: string = "Target";
|
||||||
|
}
|
||||||
1272
bjsEditorPlugin/package-lock.json
generated
Normal file
21
bjsEditorPlugin/package.json
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "babylonjs-editor-space-game-plugin",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"description": "Export BabylonJS Editor scenes to Space Game LevelConfig format",
|
||||||
|
"main": "dist/index.js",
|
||||||
|
"scripts": {
|
||||||
|
"build": "tsc && node -e \"const fs=require('fs');const p=JSON.parse(fs.readFileSync('package.json'));p.main='index.js';fs.writeFileSync('dist/package.json',JSON.stringify(p,null,2))\"",
|
||||||
|
"watch": "tsc -w"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@auth0/auth0-spa-js": "^2.1.3",
|
||||||
|
"@supabase/supabase-js": "^2.45.0"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"typescript": "^5.0.0",
|
||||||
|
"@babylonjs/core": "^6.0.0"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"babylonjs-editor": "^4.0.0"
|
||||||
|
}
|
||||||
|
}
|
||||||
37
bjsEditorPlugin/src/cameraSpeed.ts
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
/**
|
||||||
|
* Camera speed persistence and application
|
||||||
|
*/
|
||||||
|
import { showNotification } from "./utils";
|
||||||
|
|
||||||
|
const CAMERA_SPEED_KEY = "space-game-camera-speed";
|
||||||
|
const DEFAULT_CAMERA_SPEED = 1;
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
let editorRef: any = null;
|
||||||
|
|
||||||
|
export function initCameraSpeed(editor: any): void {
|
||||||
|
editorRef = editor;
|
||||||
|
applyCameraSpeed(getSavedCameraSpeed());
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getSavedCameraSpeed(): number {
|
||||||
|
const saved = localStorage.getItem(CAMERA_SPEED_KEY);
|
||||||
|
return saved ? parseFloat(saved) : DEFAULT_CAMERA_SPEED;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function saveCameraSpeed(speed: number): void {
|
||||||
|
localStorage.setItem(CAMERA_SPEED_KEY, String(speed));
|
||||||
|
}
|
||||||
|
|
||||||
|
export function applyCameraSpeed(speed: number): void {
|
||||||
|
const camera = editorRef?.layout?.preview?.camera;
|
||||||
|
if (camera) {
|
||||||
|
camera.speed = speed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function handleCameraSpeedChange(speed: number): void {
|
||||||
|
saveCameraSpeed(speed);
|
||||||
|
applyCameraSpeed(speed);
|
||||||
|
showNotification(`Camera speed set to ${speed}`);
|
||||||
|
}
|
||||||
149
bjsEditorPlugin/src/cloudLevelHandlers.ts
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/**
|
||||||
|
* Handlers for cloud level browsing and loading
|
||||||
|
*/
|
||||||
|
import { getOfficialLevels, getMyLevels, saveLevel, CloudLevelEntry } from "./services/pluginLevelService";
|
||||||
|
import { showLevelBrowserModal, closeLevelBrowserModal } from "./levelBrowser/levelBrowserModal";
|
||||||
|
import { showSaveLevelModal, closeSaveLevelModal } from "./levelBrowser/saveLevelModal";
|
||||||
|
import { updateAuthSection } from "./levelBrowser/authStatus";
|
||||||
|
import { importLevelConfig } from "./levelImporter";
|
||||||
|
import { exportLevelConfig } from "./exporter";
|
||||||
|
import { showNotification } from "./utils";
|
||||||
|
import { isAuthenticated } from "./services/pluginAuth";
|
||||||
|
import { Scene } from "@babylonjs/core/scene";
|
||||||
|
|
||||||
|
let sceneGetter: () => Scene | null = () => null;
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
let editorRef: any = null;
|
||||||
|
|
||||||
|
export function initCloudHandlers(getScene: () => Scene | null, editor: unknown): void {
|
||||||
|
sceneGetter = getScene;
|
||||||
|
editorRef = editor;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function handleBrowseOfficial(): Promise<void> {
|
||||||
|
try {
|
||||||
|
showNotification("Loading levels...");
|
||||||
|
const levels = await getOfficialLevels();
|
||||||
|
showLevelBrowserModal(levels, "Official Levels", {
|
||||||
|
onSelectLevel: handleLoadLevel,
|
||||||
|
onClose: closeLevelBrowserModal,
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Browse official error:", err);
|
||||||
|
showNotification("Failed to fetch levels", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function handleBrowseMyLevels(): Promise<void> {
|
||||||
|
if (!isAuthenticated()) {
|
||||||
|
showNotification("Sign in to view your levels", true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
showNotification("Loading levels...");
|
||||||
|
const levels = await getMyLevels();
|
||||||
|
showLevelBrowserModal(levels, "My Levels", {
|
||||||
|
onSelectLevel: handleLoadLevel,
|
||||||
|
onClose: closeLevelBrowserModal,
|
||||||
|
onSaveNew: handleSaveNewLevel,
|
||||||
|
onSaveExisting: handleSaveExistingLevel,
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Browse my levels error:", err);
|
||||||
|
showNotification("Failed to fetch levels", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function handleAuthChange(): void {
|
||||||
|
const authSection = document.getElementById("auth-status-section");
|
||||||
|
if (authSection) {
|
||||||
|
updateAuthSection(authSection, handleAuthChange);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleLoadLevel(level: CloudLevelEntry): void {
|
||||||
|
const scene = sceneGetter();
|
||||||
|
if (!scene) {
|
||||||
|
showNotification("No scene loaded", true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
closeLevelBrowserModal();
|
||||||
|
showNotification(`Loading: ${level.name}...`);
|
||||||
|
importLevelConfig(scene, level.config, () => {
|
||||||
|
refreshEditorGraph();
|
||||||
|
showNotification(`Loaded: ${level.name}`);
|
||||||
|
});
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Import error:", err);
|
||||||
|
showNotification("Failed to import level", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleSaveNewLevel(): void {
|
||||||
|
closeLevelBrowserModal();
|
||||||
|
showSaveLevelModal(
|
||||||
|
async ({ name, difficulty }) => {
|
||||||
|
const scene = sceneGetter();
|
||||||
|
if (!scene) {
|
||||||
|
showNotification("No scene loaded", true);
|
||||||
|
closeSaveLevelModal();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
showNotification("Saving level...");
|
||||||
|
const configJson = exportLevelConfig(scene);
|
||||||
|
const config = JSON.parse(configJson);
|
||||||
|
const levelId = await saveLevel(name, difficulty, config);
|
||||||
|
|
||||||
|
closeSaveLevelModal();
|
||||||
|
if (levelId) {
|
||||||
|
showNotification(`Saved: ${name}`);
|
||||||
|
} else {
|
||||||
|
showNotification("Failed to save level", true);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Save error:", err);
|
||||||
|
showNotification("Failed to save level", true);
|
||||||
|
closeSaveLevelModal();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
closeSaveLevelModal
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleSaveExistingLevel(level: CloudLevelEntry): Promise<void> {
|
||||||
|
const scene = sceneGetter();
|
||||||
|
if (!scene) {
|
||||||
|
showNotification("No scene loaded", true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
showNotification(`Saving ${level.name}...`);
|
||||||
|
const configJson = exportLevelConfig(scene);
|
||||||
|
const config = JSON.parse(configJson);
|
||||||
|
const result = await saveLevel(level.name, level.difficulty, config, level.id);
|
||||||
|
|
||||||
|
if (result) {
|
||||||
|
showNotification(`Saved: ${level.name}`);
|
||||||
|
} else {
|
||||||
|
showNotification("Failed to save level", true);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Save error:", err);
|
||||||
|
showNotification("Failed to save level", true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function refreshEditorGraph(): void {
|
||||||
|
try {
|
||||||
|
editorRef?.layout?.graph?.refresh?.();
|
||||||
|
editorRef?.layout?.preview?.forceUpdate?.();
|
||||||
|
} catch (err) {
|
||||||
|
console.warn("Could not refresh editor graph:", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
10
bjsEditorPlugin/src/config.ts
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
/**
|
||||||
|
* Plugin configuration - hardcoded values for editor context
|
||||||
|
* These are public/client-safe values (appear in browser bundles)
|
||||||
|
*/
|
||||||
|
export const PLUGIN_CONFIG = {
|
||||||
|
SUPABASE_URL: "https://ezipploqzuphwsptvvdv.supabase.co",
|
||||||
|
SUPABASE_ANON_KEY:
|
||||||
|
"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImV6aXBwbG9xenVwaHdzcHR2dmR2Iiwicm9sZSI6ImFub24iLCJpYXQiOjE3NjQxMDk2NTYsImV4cCI6MjA3OTY4NTY1Nn0.CjpAh8v0c54KAYCPuLmrgrcHFAOVRxOEQCW8zZ9lwzA",
|
||||||
|
WEBSITE_URL: "https://www.flatearthdefense.com",
|
||||||
|
};
|
||||||
54
bjsEditorPlugin/src/configBuilders/asteroidBuilder.ts
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
/**
|
||||||
|
* Builds AsteroidConfig[] from meshes with AsteroidComponent
|
||||||
|
*/
|
||||||
|
import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh";
|
||||||
|
import { AsteroidConfig, Vector3Array } from "../types";
|
||||||
|
import { getScriptValues } from "../scriptUtils";
|
||||||
|
|
||||||
|
export function buildAsteroidConfigs(meshes: AbstractMesh[]): AsteroidConfig[] {
|
||||||
|
return meshes.map((mesh, index) => buildSingleAsteroid(mesh, index));
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildSingleAsteroid(mesh: AbstractMesh, index: number): AsteroidConfig {
|
||||||
|
const script = getScriptValues(mesh);
|
||||||
|
const rotation = toVector3Array(mesh.rotation);
|
||||||
|
const hasRotation = rotation[0] !== 0 || rotation[1] !== 0 || rotation[2] !== 0;
|
||||||
|
|
||||||
|
// Debug: compare local vs absolute position
|
||||||
|
const localPos = mesh.position;
|
||||||
|
const absPos = mesh.getAbsolutePosition();
|
||||||
|
if (Math.abs(localPos.x - absPos.x) > 1 || Math.abs(localPos.y - absPos.y) > 1 || Math.abs(localPos.z - absPos.z) > 1) {
|
||||||
|
console.warn(`[AsteroidBuilder] Position mismatch for ${mesh.name}:`,
|
||||||
|
`local=(${localPos.x.toFixed(1)}, ${localPos.y.toFixed(1)}, ${localPos.z.toFixed(1)})`,
|
||||||
|
`absolute=(${absPos.x.toFixed(1)}, ${absPos.y.toFixed(1)}, ${absPos.z.toFixed(1)})`,
|
||||||
|
`parent=${mesh.parent?.name || 'none'}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: mesh.name || `asteroid-${index}`,
|
||||||
|
position: toVector3Array(mesh.getAbsolutePosition()), // Use absolute position
|
||||||
|
rotation: hasRotation ? rotation : undefined,
|
||||||
|
scale: mesh.scaling.x,
|
||||||
|
linearVelocity: extractVector3(script.linearVelocity, [0, 0, 0]),
|
||||||
|
angularVelocity: extractVector3(script.angularVelocity, [0, 0, 0]),
|
||||||
|
mass: (script.mass as number) ?? 200,
|
||||||
|
targetId: (script.targetId as string) || undefined,
|
||||||
|
targetMode: parseTargetMode(script.targetMode as string)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function toVector3Array(v: { x: number; y: number; z: number }): Vector3Array {
|
||||||
|
return [v.x, v.y, v.z];
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractVector3(v: unknown, defaultVal: Vector3Array): Vector3Array {
|
||||||
|
if (!v) return defaultVal;
|
||||||
|
if (Array.isArray(v)) return v as Vector3Array;
|
||||||
|
const vec = v as { x?: number; y?: number; z?: number };
|
||||||
|
return [vec.x ?? 0, vec.y ?? 0, vec.z ?? 0];
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseTargetMode(mode: string): 'orbit' | 'moveToward' | undefined {
|
||||||
|
if (mode === 'orbit' || mode === 'moveToward') return mode;
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
51
bjsEditorPlugin/src/configBuilders/baseBuilder.ts
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/**
|
||||||
|
* Builds StartBaseConfig from mesh with BaseComponent
|
||||||
|
*/
|
||||||
|
import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh";
|
||||||
|
import { StartBaseConfig, Vector3Array } from "../types";
|
||||||
|
import { getScriptValues } from "../scriptUtils";
|
||||||
|
|
||||||
|
export function buildBaseConfig(mesh: AbstractMesh | null): StartBaseConfig | undefined {
|
||||||
|
if (!mesh) {
|
||||||
|
return undefined;
|
||||||
|
}
|
||||||
|
|
||||||
|
const script = getScriptValues(mesh);
|
||||||
|
const glbPath = extractGlbPath(mesh, script);
|
||||||
|
const rotation = toVector3Array(mesh.rotation);
|
||||||
|
const hasRotation = rotation[0] !== 0 || rotation[1] !== 0 || rotation[2] !== 0;
|
||||||
|
|
||||||
|
return {
|
||||||
|
position: toVector3Array(mesh.getAbsolutePosition()),
|
||||||
|
rotation: hasRotation ? rotation : undefined,
|
||||||
|
baseGlbPath: glbPath || undefined,
|
||||||
|
landingGlbPath: (script.landingGlbPath as string) || undefined,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractGlbPath(mesh: AbstractMesh, script: Record<string, unknown>): string | null {
|
||||||
|
// 1. Check script property first (manual override)
|
||||||
|
if (script.baseGlbPath) return script.baseGlbPath as string;
|
||||||
|
|
||||||
|
// 2. Check mesh metadata for source file path
|
||||||
|
const meta = mesh.metadata as Record<string, any> | undefined;
|
||||||
|
if (meta?.sourcePath) return extractFilename(meta.sourcePath);
|
||||||
|
if (meta?.gltf?.sourcePath) return extractFilename(meta.gltf.sourcePath);
|
||||||
|
|
||||||
|
// 3. Derive from mesh name if it looks like a GLB reference
|
||||||
|
const name = mesh.name || "";
|
||||||
|
if (name.endsWith(".glb") || name.endsWith(".gltf")) return name;
|
||||||
|
|
||||||
|
// 4. Check if name contains path separator and extract filename
|
||||||
|
if (name.includes("/")) return extractFilename(name);
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractFilename(path: string): string {
|
||||||
|
return path.split("/").pop() || path;
|
||||||
|
}
|
||||||
|
|
||||||
|
function toVector3Array(v: { x: number; y: number; z: number }): Vector3Array {
|
||||||
|
return [v.x, v.y, v.z];
|
||||||
|
}
|
||||||
31
bjsEditorPlugin/src/configBuilders/planetBuilder.ts
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/**
|
||||||
|
* Builds PlanetConfig[] from meshes with PlanetComponent
|
||||||
|
*/
|
||||||
|
import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh";
|
||||||
|
import { PlanetConfig, Vector3Array } from "../types";
|
||||||
|
import { getScriptValues } from "../scriptUtils";
|
||||||
|
|
||||||
|
export function buildPlanetConfigs(meshes: AbstractMesh[]): PlanetConfig[] {
|
||||||
|
return meshes.map(buildSinglePlanet);
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildSinglePlanet(mesh: AbstractMesh): PlanetConfig {
|
||||||
|
const script = getScriptValues(mesh);
|
||||||
|
|
||||||
|
return {
|
||||||
|
name: mesh.name || "planet",
|
||||||
|
position: toVector3Array(mesh.getAbsolutePosition()),
|
||||||
|
diameter: (script.diameter as number) ?? 100,
|
||||||
|
texturePath: (script.texturePath as string) || "planet_texture.jpg",
|
||||||
|
rotation: hasRotation(mesh) ? toVector3Array(mesh.rotation) : undefined
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function toVector3Array(v: { x: number; y: number; z: number }): Vector3Array {
|
||||||
|
return [v.x, v.y, v.z];
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasRotation(mesh: AbstractMesh): boolean {
|
||||||
|
const r = mesh.rotation;
|
||||||
|
return r.x !== 0 || r.y !== 0 || r.z !== 0;
|
||||||
|
}
|
||||||
38
bjsEditorPlugin/src/configBuilders/shipBuilder.ts
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/**
|
||||||
|
* Builds ShipConfig from mesh with ShipComponent
|
||||||
|
*/
|
||||||
|
import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh";
|
||||||
|
import { ShipConfig, Vector3Array } from "../types";
|
||||||
|
import { getScriptValues } from "../scriptUtils";
|
||||||
|
|
||||||
|
export function buildShipConfig(mesh: AbstractMesh | null): ShipConfig {
|
||||||
|
if (!mesh) {
|
||||||
|
return { position: [0, 1, 0] };
|
||||||
|
}
|
||||||
|
|
||||||
|
const script = getScriptValues(mesh);
|
||||||
|
|
||||||
|
return {
|
||||||
|
position: toVector3Array(mesh.getAbsolutePosition()),
|
||||||
|
rotation: mesh.rotation ? toVector3Array(mesh.rotation) : undefined,
|
||||||
|
linearVelocity: extractVector3OrUndefined(script.linearVelocity),
|
||||||
|
angularVelocity: extractVector3OrUndefined(script.angularVelocity)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function toVector3Array(v: { x: number; y: number; z: number }): Vector3Array {
|
||||||
|
return [v.x, v.y, v.z];
|
||||||
|
}
|
||||||
|
|
||||||
|
function extractVector3OrUndefined(v: unknown): Vector3Array | undefined {
|
||||||
|
if (!v) return undefined;
|
||||||
|
if (Array.isArray(v)) {
|
||||||
|
const arr = v as number[];
|
||||||
|
if (arr[0] === 0 && arr[1] === 0 && arr[2] === 0) return undefined;
|
||||||
|
return arr as Vector3Array;
|
||||||
|
}
|
||||||
|
const vec = v as { x?: number; y?: number; z?: number };
|
||||||
|
const arr: Vector3Array = [vec.x ?? 0, vec.y ?? 0, vec.z ?? 0];
|
||||||
|
if (arr[0] === 0 && arr[1] === 0 && arr[2] === 0) return undefined;
|
||||||
|
return arr;
|
||||||
|
}
|
||||||
39
bjsEditorPlugin/src/configBuilders/sunBuilder.ts
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/**
|
||||||
|
* Builds SunConfig from mesh with SunComponent
|
||||||
|
*/
|
||||||
|
import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh";
|
||||||
|
import { SunConfig, Vector3Array } from "../types";
|
||||||
|
import { getScriptValues } from "../scriptUtils";
|
||||||
|
|
||||||
|
const DEFAULT_SUN: SunConfig = {
|
||||||
|
position: [0, 0, 400],
|
||||||
|
diameter: 50
|
||||||
|
};
|
||||||
|
|
||||||
|
export function buildSunConfig(mesh: AbstractMesh | null): SunConfig {
|
||||||
|
if (!mesh) {
|
||||||
|
return DEFAULT_SUN;
|
||||||
|
}
|
||||||
|
|
||||||
|
const script = getScriptValues(mesh);
|
||||||
|
|
||||||
|
const rotation = toVector3Array(mesh.rotation);
|
||||||
|
const hasRotation = rotation[0] !== 0 || rotation[1] !== 0 || rotation[2] !== 0;
|
||||||
|
|
||||||
|
return {
|
||||||
|
position: toVector3Array(mesh.getAbsolutePosition()),
|
||||||
|
rotation: hasRotation ? rotation : undefined,
|
||||||
|
diameter: (script.diameter as number) ?? 50,
|
||||||
|
intensity: (script.intensity as number) ?? 1000000,
|
||||||
|
scale: hasNonUniformScale(mesh) ? toVector3Array(mesh.scaling) : undefined
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function toVector3Array(v: { x: number; y: number; z: number }): Vector3Array {
|
||||||
|
return [v.x, v.y, v.z];
|
||||||
|
}
|
||||||
|
|
||||||
|
function hasNonUniformScale(mesh: AbstractMesh): boolean {
|
||||||
|
const s = mesh.scaling;
|
||||||
|
return s.x !== s.y || s.y !== s.z;
|
||||||
|
}
|
||||||
24
bjsEditorPlugin/src/configBuilders/targetBuilder.ts
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
/**
|
||||||
|
* Builds TargetConfig[] from TransformNodes with TargetComponent
|
||||||
|
*/
|
||||||
|
import { TransformNode } from "@babylonjs/core/Meshes/transformNode";
|
||||||
|
import { TargetConfig, Vector3Array } from "../types";
|
||||||
|
import { getScriptValues } from "../scriptUtils";
|
||||||
|
|
||||||
|
export function buildTargetConfigs(nodes: TransformNode[]): TargetConfig[] {
|
||||||
|
return nodes.map(buildSingleTarget);
|
||||||
|
}
|
||||||
|
|
||||||
|
function buildSingleTarget(node: TransformNode): TargetConfig {
|
||||||
|
const script = getScriptValues(node);
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: node.name || node.id,
|
||||||
|
name: (script.displayName as string) || node.name || "Target",
|
||||||
|
position: toVector3Array(node.getAbsolutePosition())
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function toVector3Array(v: { x: number; y: number; z: number }): Vector3Array {
|
||||||
|
return [v.x, v.y, v.z];
|
||||||
|
}
|
||||||
40
bjsEditorPlugin/src/exporter.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/**
|
||||||
|
* Main export orchestrator - builds LevelConfig from scene
|
||||||
|
*/
|
||||||
|
import { Scene } from "@babylonjs/core/scene";
|
||||||
|
import { LevelConfig } from "./types";
|
||||||
|
import { collectMeshesByComponent } from "./meshCollector";
|
||||||
|
import { buildAsteroidConfigs } from "./configBuilders/asteroidBuilder";
|
||||||
|
import { buildBaseConfig } from "./configBuilders/baseBuilder";
|
||||||
|
import { buildPlanetConfigs } from "./configBuilders/planetBuilder";
|
||||||
|
import { buildShipConfig } from "./configBuilders/shipBuilder";
|
||||||
|
import { buildSunConfig } from "./configBuilders/sunBuilder";
|
||||||
|
import { buildTargetConfigs } from "./configBuilders/targetBuilder";
|
||||||
|
|
||||||
|
export function exportLevelConfig(scene: Scene): string {
|
||||||
|
const meshes = collectMeshesByComponent(scene);
|
||||||
|
|
||||||
|
console.log(`[Exporter] Collected: ${meshes.asteroids.length} asteroids, ${meshes.targets.length} targets, ${meshes.planets.length} planets`);
|
||||||
|
if (meshes.targets.length > 0) {
|
||||||
|
console.log(`[Exporter] Target IDs: ${meshes.targets.map(t => t.name || t.id).join(', ')}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const config: LevelConfig = {
|
||||||
|
version: "1.0",
|
||||||
|
difficulty: "rookie",
|
||||||
|
timestamp: new Date().toISOString(),
|
||||||
|
metadata: {
|
||||||
|
author: "BabylonJS Editor",
|
||||||
|
description: "Exported from Editor"
|
||||||
|
},
|
||||||
|
ship: buildShipConfig(meshes.ship),
|
||||||
|
startBase: buildBaseConfig(meshes.base),
|
||||||
|
sun: buildSunConfig(meshes.sun),
|
||||||
|
targets: buildTargetConfigs(meshes.targets),
|
||||||
|
planets: buildPlanetConfigs(meshes.planets),
|
||||||
|
asteroids: buildAsteroidConfigs(meshes.asteroids),
|
||||||
|
useOrbitConstraints: true
|
||||||
|
};
|
||||||
|
|
||||||
|
return JSON.stringify(config, null, 2);
|
||||||
|
}
|
||||||
93
bjsEditorPlugin/src/floatingUI.ts
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
/**
|
||||||
|
* Floating UI panel for Space Game plugin
|
||||||
|
*/
|
||||||
|
import { createContent } from "./panelSections";
|
||||||
|
|
||||||
|
const PANEL_ID = "space-game-plugin-panel";
|
||||||
|
|
||||||
|
let panelElement: HTMLDivElement | null = null;
|
||||||
|
let isDragging = false;
|
||||||
|
let dragOffset = { x: 0, y: 0 };
|
||||||
|
|
||||||
|
export interface FloatingUICallbacks {
|
||||||
|
onExport: () => void;
|
||||||
|
onExportClipboard: () => void;
|
||||||
|
onApplyUniformScale: (scale: number) => void;
|
||||||
|
onCameraSpeedChange: (multiplier: number) => void;
|
||||||
|
getCameraSpeed: () => number;
|
||||||
|
onBrowseOfficial: () => void;
|
||||||
|
onBrowseMyLevels: () => void;
|
||||||
|
onAuthChange: () => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function createFloatingUI(callbacks: FloatingUICallbacks): Promise<void> {
|
||||||
|
if (document.getElementById(PANEL_ID)) return;
|
||||||
|
|
||||||
|
panelElement = document.createElement("div");
|
||||||
|
panelElement.id = PANEL_ID;
|
||||||
|
applyPanelStyles(panelElement);
|
||||||
|
|
||||||
|
const header = createHeader();
|
||||||
|
const content = await createContent(callbacks);
|
||||||
|
|
||||||
|
panelElement.appendChild(header);
|
||||||
|
panelElement.appendChild(content);
|
||||||
|
document.body.appendChild(panelElement);
|
||||||
|
|
||||||
|
setupDragHandlers(header);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function destroyFloatingUI(): void {
|
||||||
|
document.getElementById(PANEL_ID)?.remove();
|
||||||
|
panelElement = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function applyPanelStyles(panel: HTMLDivElement): void {
|
||||||
|
Object.assign(panel.style, {
|
||||||
|
position: "fixed", top: "80px", right: "20px", width: "200px",
|
||||||
|
backgroundColor: "#1e1e1e", border: "1px solid #3c3c3c", borderRadius: "8px",
|
||||||
|
boxShadow: "0 4px 12px rgba(0,0,0,0.4)", zIndex: "10000",
|
||||||
|
fontFamily: "system-ui, -apple-system, sans-serif", fontSize: "13px",
|
||||||
|
color: "#e0e0e0", overflow: "hidden",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function createHeader(): HTMLDivElement {
|
||||||
|
const header = document.createElement("div");
|
||||||
|
Object.assign(header.style, {
|
||||||
|
padding: "8px 12px", backgroundColor: "#2d2d2d", borderBottom: "1px solid #3c3c3c",
|
||||||
|
cursor: "move", userSelect: "none", display: "flex", alignItems: "center", gap: "8px",
|
||||||
|
});
|
||||||
|
const icon = document.createElement("span");
|
||||||
|
icon.textContent = "\u{1F680}";
|
||||||
|
const title = document.createElement("span");
|
||||||
|
title.textContent = "Space Game";
|
||||||
|
title.style.fontWeight = "500";
|
||||||
|
header.append(icon, title);
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
function setupDragHandlers(header: HTMLDivElement): void {
|
||||||
|
header.addEventListener("mousedown", onDragStart);
|
||||||
|
document.addEventListener("mousemove", onDrag);
|
||||||
|
document.addEventListener("mouseup", onDragEnd);
|
||||||
|
}
|
||||||
|
|
||||||
|
function onDragStart(e: MouseEvent): void {
|
||||||
|
if (!panelElement) return;
|
||||||
|
isDragging = true;
|
||||||
|
const rect = panelElement.getBoundingClientRect();
|
||||||
|
dragOffset.x = e.clientX - rect.left;
|
||||||
|
dragOffset.y = e.clientY - rect.top;
|
||||||
|
}
|
||||||
|
|
||||||
|
function onDrag(e: MouseEvent): void {
|
||||||
|
if (!isDragging || !panelElement) return;
|
||||||
|
panelElement.style.left = `${e.clientX - dragOffset.x}px`;
|
||||||
|
panelElement.style.top = `${e.clientY - dragOffset.y}px`;
|
||||||
|
panelElement.style.right = "auto";
|
||||||
|
}
|
||||||
|
|
||||||
|
function onDragEnd(): void {
|
||||||
|
isDragging = false;
|
||||||
|
}
|
||||||
99
bjsEditorPlugin/src/index.ts
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
/**
|
||||||
|
* BabylonJS Editor plugin entry point
|
||||||
|
* Uses Editor v5 plugin API: main(), close(), title, description
|
||||||
|
*/
|
||||||
|
import { exportLevelConfig } from "./exporter";
|
||||||
|
import { createFloatingUI, destroyFloatingUI } from "./floatingUI";
|
||||||
|
import { initCameraSpeed, getSavedCameraSpeed, handleCameraSpeedChange } from "./cameraSpeed";
|
||||||
|
import { showNotification, copyToClipboard, downloadJson } from "./utils";
|
||||||
|
import { initAuth } from "./services/pluginAuth";
|
||||||
|
import { initCloudHandlers, handleBrowseOfficial, handleBrowseMyLevels, handleAuthChange } from "./cloudLevelHandlers";
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||||||
|
type Editor = any;
|
||||||
|
|
||||||
|
let editorInstance: Editor;
|
||||||
|
|
||||||
|
export const title = "Space Game";
|
||||||
|
export const description = "Export/Import Space Game level configurations";
|
||||||
|
|
||||||
|
export async function main(editor: Editor): Promise<void> {
|
||||||
|
editorInstance = editor;
|
||||||
|
|
||||||
|
// Expose for debugging in DevTools
|
||||||
|
(window as any).spaceGameEditor = editor;
|
||||||
|
(window as any).exportSpaceGameLevel = handleExport;
|
||||||
|
(window as any).exportSpaceGameLevelToClipboard = handleExportToClipboard;
|
||||||
|
|
||||||
|
initCameraSpeed(editor);
|
||||||
|
initCloudHandlers(getScene, editor);
|
||||||
|
initAuth().catch((err) => console.warn("Auth init failed:", err));
|
||||||
|
|
||||||
|
await createFloatingUI({
|
||||||
|
onExport: handleExport,
|
||||||
|
onExportClipboard: handleExportToClipboard,
|
||||||
|
onApplyUniformScale: handleApplyUniformScale,
|
||||||
|
onCameraSpeedChange: handleCameraSpeedChange,
|
||||||
|
getCameraSpeed: getSavedCameraSpeed,
|
||||||
|
onBrowseOfficial: handleBrowseOfficial,
|
||||||
|
onBrowseMyLevels: handleBrowseMyLevels,
|
||||||
|
onAuthChange: handleAuthChange,
|
||||||
|
});
|
||||||
|
|
||||||
|
console.log("Space Game plugin activated");
|
||||||
|
}
|
||||||
|
|
||||||
|
export function close(): void {
|
||||||
|
destroyFloatingUI();
|
||||||
|
console.log("Space Game plugin deactivated");
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleExport(): Promise<void> {
|
||||||
|
try {
|
||||||
|
const scene = getScene();
|
||||||
|
if (!scene) {
|
||||||
|
showNotification("No scene loaded", true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const json = exportLevelConfig(scene);
|
||||||
|
downloadJson(json, "level.json");
|
||||||
|
showNotification("Level exported!");
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Export error:", err);
|
||||||
|
showNotification("Failed to export: " + (err as Error).message, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function handleExportToClipboard(): Promise<void> {
|
||||||
|
try {
|
||||||
|
const scene = getScene();
|
||||||
|
if (!scene) {
|
||||||
|
showNotification("No scene loaded", true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const json = exportLevelConfig(scene);
|
||||||
|
await copyToClipboard(json);
|
||||||
|
showNotification("Copied to clipboard!");
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Clipboard error:", err);
|
||||||
|
showNotification("Failed to copy: " + (err as Error).message, true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function handleApplyUniformScale(scale: number): void {
|
||||||
|
const selected = editorInstance?.layout?.inspector?.state?.editedObject;
|
||||||
|
if (!selected?.scaling) {
|
||||||
|
showNotification("Select a mesh first", true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
selected.scaling.x = scale;
|
||||||
|
selected.scaling.y = scale;
|
||||||
|
selected.scaling.z = scale;
|
||||||
|
showNotification(`Scale set to ${scale}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getScene() {
|
||||||
|
const scene = editorInstance?.layout?.preview?.scene ?? editorInstance?.scene;
|
||||||
|
console.log("getScene called - editor:", editorInstance, "scene:", scene);
|
||||||
|
return scene;
|
||||||
|
}
|
||||||
44
bjsEditorPlugin/src/levelBrowser/authStatus.ts
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
/**
|
||||||
|
* Auth status display and login/logout buttons
|
||||||
|
*/
|
||||||
|
import { isAuthenticated, login, logout } from "../services/pluginAuth";
|
||||||
|
import { createButton } from "../uiComponents";
|
||||||
|
|
||||||
|
export function createAuthSection(onAuthChange: () => void): HTMLDivElement {
|
||||||
|
const section = document.createElement("div");
|
||||||
|
section.id = "auth-status-section";
|
||||||
|
section.style.marginBottom = "8px";
|
||||||
|
updateAuthSection(section, onAuthChange);
|
||||||
|
return section;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function updateAuthSection(section: HTMLElement, onAuthChange: () => void): void {
|
||||||
|
section.innerHTML = "";
|
||||||
|
|
||||||
|
if (isAuthenticated()) {
|
||||||
|
const label = document.createElement("div");
|
||||||
|
label.textContent = "Signed in";
|
||||||
|
label.style.cssText = "font-size: 11px; color: #888; margin-bottom: 6px;";
|
||||||
|
|
||||||
|
const btn = createButton("Sign Out", async () => {
|
||||||
|
await logout();
|
||||||
|
onAuthChange();
|
||||||
|
});
|
||||||
|
btn.style.width = "100%";
|
||||||
|
btn.style.backgroundColor = "#6c757d";
|
||||||
|
|
||||||
|
section.appendChild(label);
|
||||||
|
section.appendChild(btn);
|
||||||
|
} else {
|
||||||
|
const btn = createButton("Sign In", async () => {
|
||||||
|
try {
|
||||||
|
await login();
|
||||||
|
onAuthChange();
|
||||||
|
} catch (err) {
|
||||||
|
console.error("Login failed:", err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
btn.style.width = "100%";
|
||||||
|
section.appendChild(btn);
|
||||||
|
}
|
||||||
|
}
|
||||||
123
bjsEditorPlugin/src/levelBrowser/levelBrowserModal.ts
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
/**
|
||||||
|
* Modal dialog for browsing and selecting levels
|
||||||
|
*/
|
||||||
|
import type { CloudLevelEntry } from "../services/pluginLevelService";
|
||||||
|
|
||||||
|
const MODAL_ID = "level-browser-modal";
|
||||||
|
|
||||||
|
interface ModalCallbacks {
|
||||||
|
onSelectLevel: (level: CloudLevelEntry) => void;
|
||||||
|
onClose: () => void;
|
||||||
|
onSaveNew?: () => void;
|
||||||
|
onSaveExisting?: (level: CloudLevelEntry) => void;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function showLevelBrowserModal(levels: CloudLevelEntry[], title: string, callbacks: ModalCallbacks): void {
|
||||||
|
closeLevelBrowserModal();
|
||||||
|
const overlay = createOverlay(callbacks.onClose);
|
||||||
|
const modal = createModalContainer();
|
||||||
|
modal.appendChild(createHeader(title, callbacks.onClose));
|
||||||
|
modal.appendChild(createLevelList(levels, callbacks));
|
||||||
|
overlay.appendChild(modal);
|
||||||
|
document.body.appendChild(overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function closeLevelBrowserModal(): void {
|
||||||
|
document.getElementById(MODAL_ID)?.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
function createOverlay(onClose: () => void): HTMLDivElement {
|
||||||
|
const overlay = document.createElement("div");
|
||||||
|
overlay.id = MODAL_ID;
|
||||||
|
overlay.style.cssText =
|
||||||
|
"position:fixed;inset:0;background:rgba(0,0,0,0.6);display:flex;align-items:center;justify-content:center;z-index:10002";
|
||||||
|
overlay.addEventListener("click", (e) => { if (e.target === overlay) onClose(); });
|
||||||
|
return overlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createModalContainer(): HTMLDivElement {
|
||||||
|
const modal = document.createElement("div");
|
||||||
|
modal.style.cssText =
|
||||||
|
"background:#1e1e1e;border-radius:8px;width:500px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 8px 32px rgba(0,0,0,0.5)";
|
||||||
|
return modal;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createHeader(title: string, onClose: () => void): HTMLDivElement {
|
||||||
|
const header = document.createElement("div");
|
||||||
|
header.style.cssText = "padding:16px;border-bottom:1px solid #3c3c3c;display:flex;justify-content:space-between;align-items:center";
|
||||||
|
const titleEl = document.createElement("span");
|
||||||
|
titleEl.textContent = title;
|
||||||
|
titleEl.style.cssText = "font-weight:600;font-size:16px;color:#e0e0e0";
|
||||||
|
const closeBtn = document.createElement("button");
|
||||||
|
closeBtn.textContent = "\u2715";
|
||||||
|
closeBtn.style.cssText = "background:none;border:none;color:#888;font-size:18px;cursor:pointer;padding:4px 8px";
|
||||||
|
closeBtn.addEventListener("click", onClose);
|
||||||
|
header.append(titleEl, closeBtn);
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createLevelList(levels: CloudLevelEntry[], callbacks: ModalCallbacks): HTMLDivElement {
|
||||||
|
const container = document.createElement("div");
|
||||||
|
container.style.cssText = "display:flex;flex-direction:column;flex:1;max-height:450px";
|
||||||
|
|
||||||
|
const list = document.createElement("div");
|
||||||
|
list.style.cssText = "overflow-y:auto;flex:1";
|
||||||
|
|
||||||
|
if (levels.length === 0) {
|
||||||
|
const empty = document.createElement("div");
|
||||||
|
empty.style.cssText = "padding:32px;text-align:center;color:#888";
|
||||||
|
empty.textContent = "No levels found";
|
||||||
|
list.appendChild(empty);
|
||||||
|
} else {
|
||||||
|
for (const level of levels) {
|
||||||
|
list.appendChild(createLevelItem(level, callbacks));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
container.appendChild(list);
|
||||||
|
|
||||||
|
if (callbacks.onSaveNew) {
|
||||||
|
container.appendChild(createFooter(callbacks.onSaveNew));
|
||||||
|
}
|
||||||
|
|
||||||
|
return container;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createFooter(onSaveNew: () => void): HTMLDivElement {
|
||||||
|
const footer = document.createElement("div");
|
||||||
|
footer.style.cssText = "padding:12px 16px;border-top:1px solid #3c3c3c;display:flex;justify-content:center";
|
||||||
|
const saveBtn = document.createElement("button");
|
||||||
|
saveBtn.textContent = "+ Save Current Scene as New Level";
|
||||||
|
saveBtn.style.cssText = "padding:8px 16px;background:#4fc3f7;border:none;color:#000;border-radius:4px;cursor:pointer;font-weight:500";
|
||||||
|
saveBtn.addEventListener("click", onSaveNew);
|
||||||
|
footer.appendChild(saveBtn);
|
||||||
|
return footer;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createLevelItem(level: CloudLevelEntry, callbacks: ModalCallbacks): HTMLDivElement {
|
||||||
|
const item = document.createElement("div");
|
||||||
|
item.style.cssText = "padding:12px 16px;border-bottom:1px solid #2d2d2d;display:flex;justify-content:space-between;align-items:center";
|
||||||
|
|
||||||
|
const info = document.createElement("div");
|
||||||
|
info.style.cssText = "cursor:pointer;flex:1";
|
||||||
|
info.innerHTML = `<div style="font-weight:500;color:#e0e0e0">${level.name}</div>
|
||||||
|
<div style="font-size:11px;color:#888;margin-top:4px">${level.difficulty} | ${level.levelType} | ${new Date(level.updatedAt).toLocaleDateString()}</div>`;
|
||||||
|
info.addEventListener("click", () => callbacks.onSelectLevel(level));
|
||||||
|
|
||||||
|
item.appendChild(info);
|
||||||
|
|
||||||
|
if (callbacks.onSaveExisting && level.levelType !== "official") {
|
||||||
|
const saveBtn = document.createElement("button");
|
||||||
|
saveBtn.textContent = "Save";
|
||||||
|
saveBtn.style.cssText = "padding:4px 12px;background:#28a745;border:none;color:#fff;border-radius:4px;cursor:pointer;font-size:12px;margin-left:8px";
|
||||||
|
saveBtn.addEventListener("click", (e) => {
|
||||||
|
e.stopPropagation();
|
||||||
|
callbacks.onSaveExisting!(level);
|
||||||
|
});
|
||||||
|
item.appendChild(saveBtn);
|
||||||
|
}
|
||||||
|
|
||||||
|
item.addEventListener("mouseenter", () => (item.style.backgroundColor = "#2d2d2d"));
|
||||||
|
item.addEventListener("mouseleave", () => (item.style.backgroundColor = "transparent"));
|
||||||
|
return item;
|
||||||
|
}
|
||||||
109
bjsEditorPlugin/src/levelBrowser/saveLevelModal.ts
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
/**
|
||||||
|
* Modal for saving a level with name and difficulty
|
||||||
|
*/
|
||||||
|
const MODAL_ID = "save-level-modal";
|
||||||
|
|
||||||
|
interface SaveLevelData {
|
||||||
|
name: string;
|
||||||
|
difficulty: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function showSaveLevelModal(
|
||||||
|
onSave: (data: SaveLevelData) => void,
|
||||||
|
onCancel: () => void
|
||||||
|
): void {
|
||||||
|
closeSaveLevelModal();
|
||||||
|
const overlay = createOverlay(onCancel);
|
||||||
|
const modal = createModalContainer();
|
||||||
|
modal.appendChild(createHeader(onCancel));
|
||||||
|
modal.appendChild(createForm(onSave, onCancel));
|
||||||
|
overlay.appendChild(modal);
|
||||||
|
document.body.appendChild(overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function closeSaveLevelModal(): void {
|
||||||
|
document.getElementById(MODAL_ID)?.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
function createOverlay(onCancel: () => void): HTMLDivElement {
|
||||||
|
const overlay = document.createElement("div");
|
||||||
|
overlay.id = MODAL_ID;
|
||||||
|
overlay.style.cssText =
|
||||||
|
"position:fixed;inset:0;background:rgba(0,0,0,0.7);display:flex;align-items:center;justify-content:center;z-index:10004";
|
||||||
|
overlay.addEventListener("click", (e) => { if (e.target === overlay) onCancel(); });
|
||||||
|
return overlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createModalContainer(): HTMLDivElement {
|
||||||
|
const modal = document.createElement("div");
|
||||||
|
modal.style.cssText =
|
||||||
|
"background:#1e1e1e;border-radius:8px;width:400px;box-shadow:0 8px 32px rgba(0,0,0,0.5)";
|
||||||
|
return modal;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createHeader(onCancel: () => void): HTMLDivElement {
|
||||||
|
const header = document.createElement("div");
|
||||||
|
header.style.cssText = "padding:16px;border-bottom:1px solid #3c3c3c;display:flex;justify-content:space-between";
|
||||||
|
const title = document.createElement("span");
|
||||||
|
title.textContent = "Save Level";
|
||||||
|
title.style.cssText = "font-weight:600;font-size:16px;color:#e0e0e0";
|
||||||
|
const closeBtn = document.createElement("button");
|
||||||
|
closeBtn.textContent = "\u2715";
|
||||||
|
closeBtn.style.cssText = "background:none;border:none;color:#888;font-size:18px;cursor:pointer;padding:0";
|
||||||
|
closeBtn.addEventListener("click", onCancel);
|
||||||
|
header.append(title, closeBtn);
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createForm(onSave: (data: SaveLevelData) => void, onCancel: () => void): HTMLDivElement {
|
||||||
|
const form = document.createElement("div");
|
||||||
|
form.style.cssText = "padding:20px";
|
||||||
|
|
||||||
|
// Name input
|
||||||
|
const nameLabel = document.createElement("label");
|
||||||
|
nameLabel.textContent = "Level Name";
|
||||||
|
nameLabel.style.cssText = "display:block;color:#aaa;font-size:12px;margin-bottom:4px";
|
||||||
|
const nameInput = document.createElement("input");
|
||||||
|
nameInput.type = "text";
|
||||||
|
nameInput.placeholder = "My Awesome Level";
|
||||||
|
nameInput.style.cssText = inputStyle();
|
||||||
|
|
||||||
|
// Difficulty select
|
||||||
|
const diffLabel = document.createElement("label");
|
||||||
|
diffLabel.textContent = "Difficulty";
|
||||||
|
diffLabel.style.cssText = "display:block;color:#aaa;font-size:12px;margin-bottom:4px;margin-top:12px";
|
||||||
|
const diffSelect = document.createElement("select");
|
||||||
|
diffSelect.style.cssText = inputStyle();
|
||||||
|
["recruit", "pilot", "captain", "commander"].forEach((d) => {
|
||||||
|
const opt = document.createElement("option");
|
||||||
|
opt.value = d;
|
||||||
|
opt.textContent = d.charAt(0).toUpperCase() + d.slice(1);
|
||||||
|
diffSelect.appendChild(opt);
|
||||||
|
});
|
||||||
|
|
||||||
|
// Buttons
|
||||||
|
const buttons = document.createElement("div");
|
||||||
|
buttons.style.cssText = "display:flex;gap:8px;margin-top:20px;justify-content:flex-end";
|
||||||
|
|
||||||
|
const cancelBtn = document.createElement("button");
|
||||||
|
cancelBtn.textContent = "Cancel";
|
||||||
|
cancelBtn.style.cssText = "padding:8px 16px;background:#6c757d;border:none;color:#fff;border-radius:4px;cursor:pointer";
|
||||||
|
cancelBtn.addEventListener("click", onCancel);
|
||||||
|
|
||||||
|
const saveBtn = document.createElement("button");
|
||||||
|
saveBtn.textContent = "Save Level";
|
||||||
|
saveBtn.style.cssText = "padding:8px 16px;background:#4fc3f7;border:none;color:#000;border-radius:4px;cursor:pointer;font-weight:500";
|
||||||
|
saveBtn.addEventListener("click", () => {
|
||||||
|
const name = nameInput.value.trim();
|
||||||
|
if (!name) { nameInput.focus(); return; }
|
||||||
|
onSave({ name, difficulty: diffSelect.value });
|
||||||
|
});
|
||||||
|
|
||||||
|
buttons.append(cancelBtn, saveBtn);
|
||||||
|
form.append(nameLabel, nameInput, diffLabel, diffSelect, buttons);
|
||||||
|
return form;
|
||||||
|
}
|
||||||
|
|
||||||
|
function inputStyle(): string {
|
||||||
|
return "width:100%;padding:8px;border:1px solid #3c3c3c;border-radius:4px;background:#2d2d2d;color:#e0e0e0;font-size:14px;box-sizing:border-box";
|
||||||
|
}
|
||||||
95
bjsEditorPlugin/src/levelBrowser/tokenEntryModal.ts
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/**
|
||||||
|
* Modal for entering API token
|
||||||
|
* User gets token from website profile page
|
||||||
|
*/
|
||||||
|
const MODAL_ID = "token-entry-modal";
|
||||||
|
|
||||||
|
export function showTokenEntryModal(
|
||||||
|
profileUrl: string,
|
||||||
|
onSubmit: (token: string) => void,
|
||||||
|
onCancel: () => void
|
||||||
|
): void {
|
||||||
|
closeTokenEntryModal();
|
||||||
|
const overlay = createOverlay(onCancel);
|
||||||
|
const modal = createModalContainer();
|
||||||
|
modal.appendChild(createHeader(onCancel));
|
||||||
|
modal.appendChild(createContent(profileUrl, onSubmit, onCancel));
|
||||||
|
overlay.appendChild(modal);
|
||||||
|
document.body.appendChild(overlay);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function closeTokenEntryModal(): void {
|
||||||
|
document.getElementById(MODAL_ID)?.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
function createOverlay(onCancel: () => void): HTMLDivElement {
|
||||||
|
const overlay = document.createElement("div");
|
||||||
|
overlay.id = MODAL_ID;
|
||||||
|
overlay.style.cssText =
|
||||||
|
"position:fixed;inset:0;background:rgba(0,0,0,0.7);display:flex;align-items:center;justify-content:center;z-index:10003";
|
||||||
|
overlay.addEventListener("click", (e) => { if (e.target === overlay) onCancel(); });
|
||||||
|
return overlay;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createModalContainer(): HTMLDivElement {
|
||||||
|
const modal = document.createElement("div");
|
||||||
|
modal.style.cssText =
|
||||||
|
"background:#1e1e1e;border-radius:8px;width:420px;box-shadow:0 8px 32px rgba(0,0,0,0.5)";
|
||||||
|
return modal;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createHeader(onCancel: () => void): HTMLDivElement {
|
||||||
|
const header = document.createElement("div");
|
||||||
|
header.style.cssText = "padding:16px;border-bottom:1px solid #3c3c3c;display:flex;justify-content:space-between";
|
||||||
|
const title = document.createElement("span");
|
||||||
|
title.textContent = "Sign In with Token";
|
||||||
|
title.style.cssText = "font-weight:600;font-size:16px;color:#e0e0e0";
|
||||||
|
const closeBtn = document.createElement("button");
|
||||||
|
closeBtn.textContent = "\u2715";
|
||||||
|
closeBtn.style.cssText = "background:none;border:none;color:#888;font-size:18px;cursor:pointer;padding:0";
|
||||||
|
closeBtn.addEventListener("click", onCancel);
|
||||||
|
header.append(title, closeBtn);
|
||||||
|
return header;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createContent(
|
||||||
|
profileUrl: string,
|
||||||
|
onSubmit: (token: string) => void,
|
||||||
|
onCancel: () => void
|
||||||
|
): HTMLDivElement {
|
||||||
|
const content = document.createElement("div");
|
||||||
|
content.style.cssText = "padding:20px";
|
||||||
|
|
||||||
|
const instructions = document.createElement("p");
|
||||||
|
instructions.style.cssText = "color:#aaa;margin:0 0 16px;font-size:13px;line-height:1.5";
|
||||||
|
instructions.innerHTML = `
|
||||||
|
1. Visit your <a href="${profileUrl}" target="_blank" style="color:#81c784">profile page</a><br>
|
||||||
|
2. Generate an Editor Token<br>
|
||||||
|
3. Paste it below
|
||||||
|
`;
|
||||||
|
|
||||||
|
const input = document.createElement("textarea");
|
||||||
|
input.placeholder = "Paste your token here...";
|
||||||
|
input.style.cssText = `
|
||||||
|
width:100%;height:80px;padding:10px;border:1px solid #3c3c3c;border-radius:4px;
|
||||||
|
background:#2d2d2d;color:#e0e0e0;font-family:monospace;font-size:12px;resize:none;
|
||||||
|
box-sizing:border-box;
|
||||||
|
`;
|
||||||
|
|
||||||
|
const buttons = document.createElement("div");
|
||||||
|
buttons.style.cssText = "display:flex;gap:8px;margin-top:16px;justify-content:flex-end";
|
||||||
|
|
||||||
|
const cancelBtn = document.createElement("button");
|
||||||
|
cancelBtn.textContent = "Cancel";
|
||||||
|
cancelBtn.style.cssText = "padding:8px 16px;background:#6c757d;border:none;color:#fff;border-radius:4px;cursor:pointer";
|
||||||
|
cancelBtn.addEventListener("click", onCancel);
|
||||||
|
|
||||||
|
const submitBtn = document.createElement("button");
|
||||||
|
submitBtn.textContent = "Sign In";
|
||||||
|
submitBtn.style.cssText = "padding:8px 16px;background:#4fc3f7;border:none;color:#000;border-radius:4px;cursor:pointer;font-weight:500";
|
||||||
|
submitBtn.addEventListener("click", () => onSubmit(input.value));
|
||||||
|
|
||||||
|
buttons.append(cancelBtn, submitBtn);
|
||||||
|
content.append(instructions, input, buttons);
|
||||||
|
return content;
|
||||||
|
}
|
||||||
82
bjsEditorPlugin/src/levelImporter.ts
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
/**
|
||||||
|
* Imports LevelConfig into the editor scene
|
||||||
|
* Updates existing GLB meshes and creates asteroid instances
|
||||||
|
*/
|
||||||
|
import { Scene } from "@babylonjs/core/scene";
|
||||||
|
import { Vector3 } from "@babylonjs/core/Maths/math.vector";
|
||||||
|
import { Mesh } from "@babylonjs/core/Meshes/mesh";
|
||||||
|
import { InstancedMesh } from "@babylonjs/core/Meshes/instancedMesh";
|
||||||
|
import type { LevelConfig, AsteroidConfig } from "./types";
|
||||||
|
|
||||||
|
const SCRIPTS = {
|
||||||
|
asteroid: "scripts/editorScripts/AsteroidComponent.ts",
|
||||||
|
ship: "scripts/editorScripts/ShipComponent.ts",
|
||||||
|
};
|
||||||
|
|
||||||
|
export function importLevelConfig(scene: Scene, config: LevelConfig, onComplete?: () => void): void {
|
||||||
|
updateShip(scene, config);
|
||||||
|
updateBase(scene, config);
|
||||||
|
updateAsteroids(scene, config);
|
||||||
|
onComplete?.();
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateShip(scene: Scene, config: LevelConfig): void {
|
||||||
|
const ship = findMeshByName(scene, "ship.glb") || findMeshByName(scene, "Ship");
|
||||||
|
if (!ship) { console.warn("Ship mesh not found"); return; }
|
||||||
|
ship.position = new Vector3(...config.ship.position);
|
||||||
|
if (config.ship.rotation) ship.rotation = new Vector3(...config.ship.rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateBase(scene: Scene, config: LevelConfig): void {
|
||||||
|
if (!config.startBase) return;
|
||||||
|
const base = findMeshByName(scene, "base.glb");
|
||||||
|
if (!base) { console.warn("Base mesh not found"); return; }
|
||||||
|
if (config.startBase.position) base.position = new Vector3(...config.startBase.position);
|
||||||
|
if (config.startBase.rotation) base.rotation = new Vector3(...config.startBase.rotation);
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateAsteroids(scene: Scene, config: LevelConfig): void {
|
||||||
|
const asteroidSource = findAsteroidSource(scene);
|
||||||
|
if (!asteroidSource) { console.warn("Asteroid source mesh not found"); return; }
|
||||||
|
clearAsteroidInstances(scene);
|
||||||
|
config.asteroids.forEach((a) => createAsteroidInstance(asteroidSource, a));
|
||||||
|
}
|
||||||
|
|
||||||
|
function findMeshByName(scene: Scene, name: string): Mesh | null {
|
||||||
|
return scene.meshes.find((m) => m.name === name) as Mesh | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function findAsteroidSource(scene: Scene): Mesh | null {
|
||||||
|
// Find the Asteroid mesh (not instances) - it's a child of asteroid.glb
|
||||||
|
const asteroidMesh = scene.meshes.find((m) =>
|
||||||
|
m.name === "Asteroid" && !(m instanceof InstancedMesh)
|
||||||
|
);
|
||||||
|
return asteroidMesh as Mesh | null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearAsteroidInstances(scene: Scene): void {
|
||||||
|
// Clear all instances that have AsteroidComponent script attached
|
||||||
|
const instances = scene.meshes.filter((m) =>
|
||||||
|
m instanceof InstancedMesh && m.metadata?.scripts?.[0]?.key === SCRIPTS.asteroid
|
||||||
|
);
|
||||||
|
instances.forEach((inst) => inst.dispose());
|
||||||
|
}
|
||||||
|
|
||||||
|
function createAsteroidInstance(source: Mesh, a: AsteroidConfig): void {
|
||||||
|
const instance = source.createInstance(a.id);
|
||||||
|
instance.position = new Vector3(...a.position);
|
||||||
|
if (a.rotation) instance.rotation = new Vector3(...a.rotation);
|
||||||
|
instance.scaling = new Vector3(a.scale, a.scale, a.scale);
|
||||||
|
instance.metadata = {
|
||||||
|
scripts: [{
|
||||||
|
key: SCRIPTS.asteroid, enabled: true,
|
||||||
|
values: {
|
||||||
|
linearVelocity: { type: "vector3", value: a.linearVelocity },
|
||||||
|
angularVelocity: { type: "vector3", value: a.angularVelocity ?? [0, 0, 0] },
|
||||||
|
mass: { type: "number", value: a.mass ?? 200 },
|
||||||
|
targetId: { type: "string", value: a.targetId ?? "" },
|
||||||
|
targetMode: { type: "string", value: a.targetMode ?? "" },
|
||||||
|
},
|
||||||
|
}],
|
||||||
|
};
|
||||||
|
}
|
||||||
73
bjsEditorPlugin/src/meshCollector.ts
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
/**
|
||||||
|
* Collects meshes from scene grouped by their attached component type
|
||||||
|
*/
|
||||||
|
import { Scene } from "@babylonjs/core/scene";
|
||||||
|
import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh";
|
||||||
|
import { TransformNode } from "@babylonjs/core/Meshes/transformNode";
|
||||||
|
|
||||||
|
import { getScriptName } from "./scriptUtils";
|
||||||
|
|
||||||
|
export interface CollectedMeshes {
|
||||||
|
asteroids: AbstractMesh[];
|
||||||
|
planets: AbstractMesh[];
|
||||||
|
ship: AbstractMesh | null;
|
||||||
|
sun: AbstractMesh | null;
|
||||||
|
base: AbstractMesh | null;
|
||||||
|
targets: TransformNode[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function collectMeshesByComponent(scene: Scene): CollectedMeshes {
|
||||||
|
const result: CollectedMeshes = {
|
||||||
|
asteroids: [],
|
||||||
|
planets: [],
|
||||||
|
ship: null,
|
||||||
|
sun: null,
|
||||||
|
base: null,
|
||||||
|
targets: []
|
||||||
|
};
|
||||||
|
|
||||||
|
for (const mesh of scene.meshes) {
|
||||||
|
const scriptName = getScriptName(mesh);
|
||||||
|
categorizeByScript(scriptName, mesh, result);
|
||||||
|
}
|
||||||
|
|
||||||
|
collectTargetNodes(scene, result);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function categorizeByScript(
|
||||||
|
scriptName: string | null,
|
||||||
|
mesh: AbstractMesh,
|
||||||
|
result: CollectedMeshes
|
||||||
|
): void {
|
||||||
|
switch (scriptName) {
|
||||||
|
case "AsteroidComponent":
|
||||||
|
result.asteroids.push(mesh);
|
||||||
|
break;
|
||||||
|
case "PlanetComponent":
|
||||||
|
result.planets.push(mesh);
|
||||||
|
break;
|
||||||
|
case "ShipComponent":
|
||||||
|
result.ship = mesh;
|
||||||
|
break;
|
||||||
|
case "SunComponent":
|
||||||
|
result.sun = mesh;
|
||||||
|
break;
|
||||||
|
case "BaseComponent":
|
||||||
|
result.base = mesh;
|
||||||
|
break;
|
||||||
|
case "TargetComponent":
|
||||||
|
// Targets can be Mesh or TransformNode - handle both
|
||||||
|
result.targets.push(mesh as unknown as TransformNode);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function collectTargetNodes(scene: Scene, result: CollectedMeshes): void {
|
||||||
|
for (const node of scene.transformNodes) {
|
||||||
|
if (getScriptName(node) === "TargetComponent") {
|
||||||
|
result.targets.push(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
72
bjsEditorPlugin/src/panelSections.ts
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
/**
|
||||||
|
* Panel section creators for the floating UI
|
||||||
|
*/
|
||||||
|
import { createButton, createNumberInput, createSeparator, createLabel, createRow } from "./uiComponents";
|
||||||
|
import { FloatingUICallbacks } from "./floatingUI";
|
||||||
|
import { createAuthSection } from "./levelBrowser/authStatus";
|
||||||
|
|
||||||
|
export async function createContent(callbacks: FloatingUICallbacks): Promise<HTMLDivElement> {
|
||||||
|
const content = document.createElement("div");
|
||||||
|
Object.assign(content.style, { padding: "12px", display: "flex", flexDirection: "column", gap: "8px" });
|
||||||
|
|
||||||
|
content.appendChild(createButton("Export Level", callbacks.onExport));
|
||||||
|
content.appendChild(createButton("Copy to Clipboard", callbacks.onExportClipboard));
|
||||||
|
content.appendChild(createSeparator());
|
||||||
|
content.appendChild(createScaleSection(callbacks.onApplyUniformScale));
|
||||||
|
content.appendChild(createSeparator());
|
||||||
|
content.appendChild(createCameraSpeedSection(callbacks));
|
||||||
|
content.appendChild(createSeparator());
|
||||||
|
content.appendChild(await createCloudLevelsSection(callbacks));
|
||||||
|
|
||||||
|
return content;
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createCloudLevelsSection(callbacks: FloatingUICallbacks): Promise<HTMLDivElement> {
|
||||||
|
const section = document.createElement("div");
|
||||||
|
Object.assign(section.style, { display: "flex", flexDirection: "column", gap: "6px" });
|
||||||
|
|
||||||
|
section.appendChild(createLabel("Cloud Levels"));
|
||||||
|
section.appendChild(await createAuthSection(callbacks.onAuthChange));
|
||||||
|
|
||||||
|
const row = createRow();
|
||||||
|
const officialBtn = createButton("Official", callbacks.onBrowseOfficial);
|
||||||
|
const myBtn = createButton("My Levels", callbacks.onBrowseMyLevels);
|
||||||
|
officialBtn.style.flex = "1";
|
||||||
|
myBtn.style.flex = "1";
|
||||||
|
row.appendChild(officialBtn);
|
||||||
|
row.appendChild(myBtn);
|
||||||
|
section.appendChild(row);
|
||||||
|
|
||||||
|
return section;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createScaleSection(onApply: (scale: number) => void): HTMLDivElement {
|
||||||
|
const row = createRow();
|
||||||
|
row.style.width = "100%";
|
||||||
|
|
||||||
|
const input = createNumberInput(1, "0.1", "0.1");
|
||||||
|
const btn = createButton("Scale", () => onApply(parseFloat(input.value) || 1));
|
||||||
|
btn.style.padding = "6px 12px";
|
||||||
|
btn.style.flexShrink = "0";
|
||||||
|
|
||||||
|
row.appendChild(input);
|
||||||
|
row.appendChild(btn);
|
||||||
|
return row;
|
||||||
|
}
|
||||||
|
|
||||||
|
function createCameraSpeedSection(callbacks: FloatingUICallbacks): HTMLDivElement {
|
||||||
|
const section = document.createElement("div");
|
||||||
|
Object.assign(section.style, { display: "flex", flexDirection: "column", gap: "6px" });
|
||||||
|
|
||||||
|
const row = createRow();
|
||||||
|
const input = createNumberInput(callbacks.getCameraSpeed(), "0.5", "0.5");
|
||||||
|
const btn = createButton("Set", () => callbacks.onCameraSpeedChange(parseFloat(input.value) || 1));
|
||||||
|
btn.style.padding = "6px 12px";
|
||||||
|
btn.style.flexShrink = "0";
|
||||||
|
|
||||||
|
row.appendChild(input);
|
||||||
|
row.appendChild(btn);
|
||||||
|
section.appendChild(createLabel("Camera Speed"));
|
||||||
|
section.appendChild(row);
|
||||||
|
return section;
|
||||||
|
}
|
||||||
53
bjsEditorPlugin/src/scriptUtils.ts
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/**
|
||||||
|
* Utilities for reading BabylonJS Editor script metadata
|
||||||
|
* Editor stores scripts in: mesh.metadata.scripts[].values[prop].value
|
||||||
|
*/
|
||||||
|
import { AbstractMesh } from "@babylonjs/core/Meshes/abstractMesh";
|
||||||
|
import { TransformNode } from "@babylonjs/core/Meshes/transformNode";
|
||||||
|
|
||||||
|
interface EditorScript {
|
||||||
|
key: string;
|
||||||
|
enabled?: boolean;
|
||||||
|
values?: Record<string, { type?: string; value?: unknown }>;
|
||||||
|
}
|
||||||
|
|
||||||
|
type NodeWithMetadata = AbstractMesh | TransformNode;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract component name from node's attached scripts
|
||||||
|
* e.g., "scenes/scripts/AsteroidComponent.ts" -> "AsteroidComponent"
|
||||||
|
*/
|
||||||
|
export function getScriptName(node: NodeWithMetadata): string | null {
|
||||||
|
const scripts = getScriptsArray(node);
|
||||||
|
if (!scripts.length) return null;
|
||||||
|
|
||||||
|
const script = scripts.find(s => s.enabled !== false);
|
||||||
|
if (!script?.key) return null;
|
||||||
|
|
||||||
|
const filename = script.key.split("/").pop() ?? "";
|
||||||
|
return filename.replace(/\.(ts|tsx|js)$/, "") || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Extract flattened property values from node's script
|
||||||
|
* Converts { prop: { value: x } } to { prop: x }
|
||||||
|
*/
|
||||||
|
export function getScriptValues(node: NodeWithMetadata): Record<string, unknown> {
|
||||||
|
const scripts = getScriptsArray(node);
|
||||||
|
if (!scripts.length) return {};
|
||||||
|
|
||||||
|
const script = scripts.find(s => s.enabled !== false);
|
||||||
|
if (!script?.values) return {};
|
||||||
|
|
||||||
|
const result: Record<string, unknown> = {};
|
||||||
|
for (const [key, data] of Object.entries(script.values)) {
|
||||||
|
result[key] = data?.value;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getScriptsArray(node: NodeWithMetadata): EditorScript[] {
|
||||||
|
const metadata = node.metadata as { scripts?: EditorScript[] } | null;
|
||||||
|
const scripts = metadata?.scripts;
|
||||||
|
return Array.isArray(scripts) ? scripts : [];
|
||||||
|
}
|
||||||
67
bjsEditorPlugin/src/services/pluginAuth.ts
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
/**
|
||||||
|
* Manual token-based auth for Electron plugin
|
||||||
|
* User generates token on website and pastes it here
|
||||||
|
*/
|
||||||
|
import { PLUGIN_CONFIG } from "../config";
|
||||||
|
import { showTokenEntryModal, closeTokenEntryModal } from "../levelBrowser/tokenEntryModal";
|
||||||
|
|
||||||
|
const STORAGE_KEY = "plugin_auth_token";
|
||||||
|
|
||||||
|
interface StoredAuth {
|
||||||
|
accessToken: string;
|
||||||
|
savedAt: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
let currentAuth: StoredAuth | null = null;
|
||||||
|
|
||||||
|
export async function initAuth(): Promise<void> {
|
||||||
|
const stored = localStorage.getItem(STORAGE_KEY);
|
||||||
|
if (stored) {
|
||||||
|
try {
|
||||||
|
currentAuth = JSON.parse(stored) as StoredAuth;
|
||||||
|
} catch { /* ignore invalid stored data */ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function login(): Promise<void> {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
showTokenEntryModal(
|
||||||
|
`${PLUGIN_CONFIG.WEBSITE_URL}/profile`,
|
||||||
|
(token: string) => {
|
||||||
|
if (token.trim()) {
|
||||||
|
storeAuth(token.trim());
|
||||||
|
closeTokenEntryModal();
|
||||||
|
resolve();
|
||||||
|
} else {
|
||||||
|
reject(new Error("No token provided"));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
() => {
|
||||||
|
closeTokenEntryModal();
|
||||||
|
reject(new Error("Login cancelled"));
|
||||||
|
}
|
||||||
|
);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function logout(): Promise<void> {
|
||||||
|
currentAuth = null;
|
||||||
|
localStorage.removeItem(STORAGE_KEY);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function isAuthenticated(): boolean {
|
||||||
|
return currentAuth !== null && !!currentAuth.accessToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function getAccessToken(): string | undefined {
|
||||||
|
if (!currentAuth) return undefined;
|
||||||
|
return currentAuth.accessToken;
|
||||||
|
}
|
||||||
|
|
||||||
|
function storeAuth(token: string): void {
|
||||||
|
currentAuth = {
|
||||||
|
accessToken: token,
|
||||||
|
savedAt: Date.now(),
|
||||||
|
};
|
||||||
|
localStorage.setItem(STORAGE_KEY, JSON.stringify(currentAuth));
|
||||||
|
}
|
||||||
101
bjsEditorPlugin/src/services/pluginLevelService.ts
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
/**
|
||||||
|
* Level service for fetching levels from Supabase
|
||||||
|
*/
|
||||||
|
import { getSupabaseClient } from "./pluginSupabase";
|
||||||
|
import { getAccessToken } from "./pluginAuth";
|
||||||
|
import type { LevelConfig } from "../types";
|
||||||
|
|
||||||
|
export interface CloudLevelEntry {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
description: string | null;
|
||||||
|
difficulty: string;
|
||||||
|
levelType: "official" | "private" | "pending_review" | "published" | "rejected";
|
||||||
|
config: LevelConfig;
|
||||||
|
updatedAt: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface LevelRow {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
description: string | null;
|
||||||
|
difficulty: string;
|
||||||
|
level_type: string;
|
||||||
|
config: LevelConfig | string;
|
||||||
|
updated_at: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function rowToEntry(row: LevelRow): CloudLevelEntry {
|
||||||
|
const config = typeof row.config === "string" ? JSON.parse(row.config) : row.config;
|
||||||
|
return {
|
||||||
|
id: row.id,
|
||||||
|
name: row.name,
|
||||||
|
description: row.description,
|
||||||
|
difficulty: row.difficulty,
|
||||||
|
levelType: row.level_type as CloudLevelEntry["levelType"],
|
||||||
|
config,
|
||||||
|
updatedAt: row.updated_at,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getOfficialLevels(): Promise<CloudLevelEntry[]> {
|
||||||
|
const client = getSupabaseClient();
|
||||||
|
const { data, error } = await client
|
||||||
|
.from("levels")
|
||||||
|
.select("id, name, description, difficulty, level_type, config, updated_at")
|
||||||
|
.eq("level_type", "official")
|
||||||
|
.order("sort_order", { ascending: true });
|
||||||
|
|
||||||
|
if (error || !data) return [];
|
||||||
|
return data.map(rowToEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getPublishedLevels(): Promise<CloudLevelEntry[]> {
|
||||||
|
const { data, error } = await getSupabaseClient()
|
||||||
|
.from("levels")
|
||||||
|
.select("id, name, description, difficulty, level_type, config, updated_at")
|
||||||
|
.eq("level_type", "published")
|
||||||
|
.order("created_at", { ascending: false });
|
||||||
|
|
||||||
|
if (error || !data) return [];
|
||||||
|
return data.map(rowToEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getMyLevels(): Promise<CloudLevelEntry[]> {
|
||||||
|
const token = getAccessToken();
|
||||||
|
if (!token) return [];
|
||||||
|
|
||||||
|
const { data, error } = await getSupabaseClient()
|
||||||
|
.rpc("get_my_levels_by_token", { p_token: token });
|
||||||
|
|
||||||
|
if (error || !data) {
|
||||||
|
console.error("Failed to fetch my levels:", error);
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return data.map(rowToEntry);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function saveLevel(
|
||||||
|
name: string,
|
||||||
|
difficulty: string,
|
||||||
|
config: LevelConfig,
|
||||||
|
levelId?: string
|
||||||
|
): Promise<string | null> {
|
||||||
|
const token = getAccessToken();
|
||||||
|
if (!token) return null;
|
||||||
|
|
||||||
|
const { data, error } = await getSupabaseClient()
|
||||||
|
.rpc("save_level_by_token", {
|
||||||
|
p_token: token,
|
||||||
|
p_name: name,
|
||||||
|
p_difficulty: difficulty,
|
||||||
|
p_config: config,
|
||||||
|
p_level_id: levelId || null,
|
||||||
|
});
|
||||||
|
|
||||||
|
if (error) {
|
||||||
|
console.error("Failed to save level:", error);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}
|
||||||
14
bjsEditorPlugin/src/services/pluginSupabase.ts
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
/**
|
||||||
|
* Lightweight Supabase client for plugin context
|
||||||
|
*/
|
||||||
|
import { createClient, SupabaseClient } from "@supabase/supabase-js";
|
||||||
|
import { PLUGIN_CONFIG } from "../config";
|
||||||
|
|
||||||
|
let client: SupabaseClient | null = null;
|
||||||
|
|
||||||
|
export function getSupabaseClient(): SupabaseClient {
|
||||||
|
if (!client) {
|
||||||
|
client = createClient(PLUGIN_CONFIG.SUPABASE_URL, PLUGIN_CONFIG.SUPABASE_ANON_KEY);
|
||||||
|
}
|
||||||
|
return client;
|
||||||
|
}
|
||||||
70
bjsEditorPlugin/src/types.ts
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/**
|
||||||
|
* LevelConfig types - mirror of the game's level config schema
|
||||||
|
*/
|
||||||
|
export type Vector3Array = [number, number, number];
|
||||||
|
|
||||||
|
export interface ShipConfig {
|
||||||
|
position: Vector3Array;
|
||||||
|
rotation?: Vector3Array;
|
||||||
|
linearVelocity?: Vector3Array;
|
||||||
|
angularVelocity?: Vector3Array;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SunConfig {
|
||||||
|
position: Vector3Array;
|
||||||
|
rotation?: Vector3Array;
|
||||||
|
diameter: number;
|
||||||
|
intensity?: number;
|
||||||
|
scale?: Vector3Array;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface StartBaseConfig {
|
||||||
|
position?: Vector3Array;
|
||||||
|
rotation?: Vector3Array;
|
||||||
|
baseGlbPath?: string;
|
||||||
|
landingGlbPath?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TargetConfig {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
position: Vector3Array;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface PlanetConfig {
|
||||||
|
name: string;
|
||||||
|
position: Vector3Array;
|
||||||
|
diameter: number;
|
||||||
|
texturePath: string;
|
||||||
|
rotation?: Vector3Array;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AsteroidConfig {
|
||||||
|
id: string;
|
||||||
|
position: Vector3Array;
|
||||||
|
rotation?: Vector3Array;
|
||||||
|
scale: number;
|
||||||
|
linearVelocity: Vector3Array;
|
||||||
|
angularVelocity?: Vector3Array;
|
||||||
|
mass?: number;
|
||||||
|
targetId?: string;
|
||||||
|
targetMode?: 'orbit' | 'moveToward';
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface LevelConfig {
|
||||||
|
version: string;
|
||||||
|
difficulty: string;
|
||||||
|
timestamp?: string;
|
||||||
|
metadata?: {
|
||||||
|
author?: string;
|
||||||
|
description?: string;
|
||||||
|
[key: string]: unknown;
|
||||||
|
};
|
||||||
|
ship: ShipConfig;
|
||||||
|
startBase?: StartBaseConfig;
|
||||||
|
sun: SunConfig;
|
||||||
|
targets?: TargetConfig[];
|
||||||
|
planets: PlanetConfig[];
|
||||||
|
asteroids: AsteroidConfig[];
|
||||||
|
useOrbitConstraints?: boolean;
|
||||||
|
}
|
||||||
65
bjsEditorPlugin/src/uiComponents.ts
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
/**
|
||||||
|
* Reusable UI components for the floating panel
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function createButton(text: string, onClick: () => void): HTMLButtonElement {
|
||||||
|
const btn = document.createElement("button");
|
||||||
|
btn.textContent = text;
|
||||||
|
Object.assign(btn.style, {
|
||||||
|
padding: "8px 12px",
|
||||||
|
backgroundColor: "#0d6efd",
|
||||||
|
color: "white",
|
||||||
|
border: "none",
|
||||||
|
borderRadius: "4px",
|
||||||
|
cursor: "pointer",
|
||||||
|
fontSize: "13px",
|
||||||
|
transition: "background-color 0.2s",
|
||||||
|
});
|
||||||
|
|
||||||
|
btn.addEventListener("mouseenter", () => (btn.style.backgroundColor = "#0b5ed7"));
|
||||||
|
btn.addEventListener("mouseleave", () => (btn.style.backgroundColor = "#0d6efd"));
|
||||||
|
btn.addEventListener("click", onClick);
|
||||||
|
|
||||||
|
return btn;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createNumberInput(value: number, step: string, min: string): HTMLInputElement {
|
||||||
|
const input = document.createElement("input");
|
||||||
|
input.type = "number";
|
||||||
|
input.value = String(value);
|
||||||
|
input.step = step;
|
||||||
|
input.min = min;
|
||||||
|
Object.assign(input.style, {
|
||||||
|
flex: "1",
|
||||||
|
minWidth: "0",
|
||||||
|
padding: "6px",
|
||||||
|
backgroundColor: "#2d2d2d",
|
||||||
|
border: "1px solid #3c3c3c",
|
||||||
|
borderRadius: "4px",
|
||||||
|
color: "#e0e0e0",
|
||||||
|
fontSize: "13px",
|
||||||
|
boxSizing: "border-box",
|
||||||
|
});
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createSeparator(): HTMLDivElement {
|
||||||
|
const sep = document.createElement("div");
|
||||||
|
sep.style.borderTop = "1px solid #3c3c3c";
|
||||||
|
sep.style.margin = "4px 0";
|
||||||
|
return sep;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createLabel(text: string): HTMLLabelElement {
|
||||||
|
const label = document.createElement("label");
|
||||||
|
label.textContent = text;
|
||||||
|
label.style.fontSize = "12px";
|
||||||
|
label.style.color = "#aaa";
|
||||||
|
return label;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createRow(): HTMLDivElement {
|
||||||
|
const row = document.createElement("div");
|
||||||
|
Object.assign(row.style, { display: "flex", gap: "8px", alignItems: "center" });
|
||||||
|
return row;
|
||||||
|
}
|
||||||
47
bjsEditorPlugin/src/utils.ts
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
/**
|
||||||
|
* Utility functions for notifications, clipboard, and file downloads
|
||||||
|
*/
|
||||||
|
|
||||||
|
export function showNotification(message: string, isError = false): void {
|
||||||
|
const el = document.createElement("div");
|
||||||
|
Object.assign(el.style, {
|
||||||
|
position: "fixed",
|
||||||
|
bottom: "20px",
|
||||||
|
right: "20px",
|
||||||
|
padding: "12px 20px",
|
||||||
|
backgroundColor: isError ? "#dc3545" : "#198754",
|
||||||
|
color: "white",
|
||||||
|
borderRadius: "6px",
|
||||||
|
zIndex: "10001",
|
||||||
|
fontSize: "13px",
|
||||||
|
boxShadow: "0 4px 12px rgba(0,0,0,0.3)",
|
||||||
|
});
|
||||||
|
el.textContent = message;
|
||||||
|
document.body.appendChild(el);
|
||||||
|
setTimeout(() => el.remove(), 3000);
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function copyToClipboard(text: string): Promise<void> {
|
||||||
|
if (navigator.clipboard?.writeText) {
|
||||||
|
await navigator.clipboard.writeText(text);
|
||||||
|
} else {
|
||||||
|
const textarea = document.createElement("textarea");
|
||||||
|
textarea.value = text;
|
||||||
|
textarea.style.position = "fixed";
|
||||||
|
textarea.style.opacity = "0";
|
||||||
|
document.body.appendChild(textarea);
|
||||||
|
textarea.select();
|
||||||
|
document.execCommand("copy");
|
||||||
|
document.body.removeChild(textarea);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function downloadJson(content: string, filename: string): void {
|
||||||
|
const blob = new Blob([content], { type: "application/json" });
|
||||||
|
const url = URL.createObjectURL(blob);
|
||||||
|
const a = document.createElement("a");
|
||||||
|
a.href = url;
|
||||||
|
a.download = filename;
|
||||||
|
a.click();
|
||||||
|
URL.revokeObjectURL(url);
|
||||||
|
}
|
||||||
18
bjsEditorPlugin/tsconfig.json
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"target": "ES2020",
|
||||||
|
"module": "CommonJS",
|
||||||
|
"lib": ["ES2020", "DOM"],
|
||||||
|
"outDir": "./dist",
|
||||||
|
"rootDir": "./src",
|
||||||
|
"strict": true,
|
||||||
|
"esModuleInterop": true,
|
||||||
|
"skipLibCheck": true,
|
||||||
|
"forceConsistentCasingInFileNames": true,
|
||||||
|
"declaration": true,
|
||||||
|
"declarationMap": true,
|
||||||
|
"sourceMap": true
|
||||||
|
},
|
||||||
|
"include": ["src/**/*"],
|
||||||
|
"exclude": ["node_modules", "dist"]
|
||||||
|
}
|
||||||
14
gameEditor/.bjseditor/.assets-thumbnail-cache.json
Normal file
1
gameEditor/.bjseditor/.textures-cache.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
1375
gameEditor/.bjseditor/play/script.cjs
Normal file
7
gameEditor/.bjseditor/play/script.cjs.map
Normal file
131462
gameEditor/.bjseditor/scripts/scripts_box.ts.cjs
Normal file
131586
gameEditor/.bjseditor/scripts/scripts_editorScripts_AsteroidComponent.ts.cjs
Normal file
131574
gameEditor/.bjseditor/scripts/scripts_editorScripts_BaseComponent.ts.cjs
Normal file
131574
gameEditor/.bjseditor/scripts/scripts_editorScripts_ShipComponent.ts.cjs
Normal file
131570
gameEditor/.bjseditor/scripts/scripts_editorScripts_TargetComponent.ts.cjs
Normal file
1
gameEditor/assets/.export-cache.json
Normal file
@ -0,0 +1 @@
|
|||||||
|
{}
|
||||||
3
gameEditor/assets/README.md
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# Babylon.js Editor
|
||||||
|
|
||||||
|
This folder contains all the assets used in the project.
|
||||||
BIN
gameEditor/assets/asteroid.glb
Normal file
BIN
gameEditor/assets/base.glb
Normal file
BIN
gameEditor/assets/country.env
Normal file
|
After Width: | Height: | Size: 465 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 1.8 MiB |
192
gameEditor/assets/example.scene/config.json
Normal file
@ -0,0 +1,192 @@
|
|||||||
|
{
|
||||||
|
"clearColor": [
|
||||||
|
0.2,
|
||||||
|
0.2,
|
||||||
|
0.3,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"ambientColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"environment": {
|
||||||
|
"environmentIntensity": 1
|
||||||
|
},
|
||||||
|
"fog": {
|
||||||
|
"fogEnabled": false,
|
||||||
|
"fogMode": 0,
|
||||||
|
"fogStart": 10,
|
||||||
|
"fogEnd": 1000,
|
||||||
|
"fogDensity": 0.001,
|
||||||
|
"fogColor": [
|
||||||
|
0.640006735140596,
|
||||||
|
0.640006735140596,
|
||||||
|
0.640006735140596
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"physics": {
|
||||||
|
"gravity": [
|
||||||
|
0,
|
||||||
|
-981,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"rendering": [
|
||||||
|
{
|
||||||
|
"cameraId": "3cc9ef80-8c60-43e0-bcc4-1b55ff36010d",
|
||||||
|
"ssao2RenderingPipeline": null,
|
||||||
|
"vlsPostProcess": null,
|
||||||
|
"ssrRenderingPipeline": null,
|
||||||
|
"motionBlurPostProcess": null,
|
||||||
|
"defaultRenderingPipeline": null,
|
||||||
|
"iblShadowsRenderPipeline": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"rendering": [],
|
||||||
|
"physicsGravity": [
|
||||||
|
0,
|
||||||
|
-981,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scripts": [
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"key": "scripts/editorScripts/AsteroidComponent.ts",
|
||||||
|
"values": {
|
||||||
|
"linearVelocity": {
|
||||||
|
"type": "vector3",
|
||||||
|
"value": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"angularVelocity": {
|
||||||
|
"type": "vector3",
|
||||||
|
"value": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mass": {
|
||||||
|
"type": "number",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"targetId": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Reference to a TargetComponent node",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
"targetMode": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "orbit | moveToward | (empty)",
|
||||||
|
"value": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"_id": "fe3c8020-9375-4c58-a54f-852339e3f40f"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"editorCamera": {
|
||||||
|
"tags": null,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"checkCollisions": false,
|
||||||
|
"applyGravity": false,
|
||||||
|
"updateUpVectorFromRotation": false,
|
||||||
|
"rotation": [
|
||||||
|
0.23466138679888465,
|
||||||
|
0.48668946590326523,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"speed": 2000,
|
||||||
|
"position": [
|
||||||
|
-19666.901457088374,
|
||||||
|
17401.223711429564,
|
||||||
|
-55872.0430330369
|
||||||
|
],
|
||||||
|
"upVector": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"fov": 0.8,
|
||||||
|
"projectionPlaneTilt": 0,
|
||||||
|
"minZ": 1,
|
||||||
|
"maxZ": 1500000,
|
||||||
|
"inertia": 0.5,
|
||||||
|
"mode": 0,
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"fovMode": 0,
|
||||||
|
"cameraRigMode": 0,
|
||||||
|
"ignoreCameraMaxZ": false,
|
||||||
|
"name": "Editor preview",
|
||||||
|
"id": "3cc9ef80-8c60-43e0-bcc4-1b55ff36010d",
|
||||||
|
"state": "",
|
||||||
|
"metadata": {},
|
||||||
|
"type": "EditorCamera",
|
||||||
|
"inputsmgr": {
|
||||||
|
"FreeCameraKeyboardMoveInput": {
|
||||||
|
"tags": null,
|
||||||
|
"keysUp": [
|
||||||
|
87
|
||||||
|
],
|
||||||
|
"keysUpward": [
|
||||||
|
69
|
||||||
|
],
|
||||||
|
"keysDown": [
|
||||||
|
83
|
||||||
|
],
|
||||||
|
"keysDownward": [
|
||||||
|
81
|
||||||
|
],
|
||||||
|
"keysLeft": [
|
||||||
|
65
|
||||||
|
],
|
||||||
|
"keysRight": [
|
||||||
|
68
|
||||||
|
],
|
||||||
|
"rotationSpeed": 0.5,
|
||||||
|
"keysRotateLeft": [],
|
||||||
|
"keysRotateRight": [],
|
||||||
|
"keysRotateUp": [],
|
||||||
|
"keysRotateDown": []
|
||||||
|
},
|
||||||
|
"FreeCameraMouseInput": {
|
||||||
|
"tags": null,
|
||||||
|
"buttons": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"angularSensibility": 500
|
||||||
|
},
|
||||||
|
"FreeCameraMouseWheelInput": {
|
||||||
|
"tags": null,
|
||||||
|
"wheelXMoveRelative": 0,
|
||||||
|
"wheelYMoveRelative": 2,
|
||||||
|
"wheelPrecisionX": 3,
|
||||||
|
"wheelPrecisionY": 3,
|
||||||
|
"wheelPrecisionZ": 3
|
||||||
|
},
|
||||||
|
"EditorFreeCameraPanInput": {
|
||||||
|
"tags": null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"isEnabled": true
|
||||||
|
},
|
||||||
|
"animations": []
|
||||||
|
}
|
||||||
@ -0,0 +1,524 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "Ship_primitive3",
|
||||||
|
"id": "037071c4-2096-4616-8e14-2e9cadab7ade",
|
||||||
|
"uniqueId": 1764787012176,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 0,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"geometryUniqueId": 1764787012184,
|
||||||
|
"geometryId": "ab02f83d-3a7a-4abd-8e08-7dab01ba5931",
|
||||||
|
"subMeshes": null,
|
||||||
|
"materialUniqueId": 1764787012185,
|
||||||
|
"materialId": "4b8b6899-b62b-4c2c-aa9c-4102fac0c2fe",
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764787012177
|
||||||
|
},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 1,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"applyFog": true,
|
||||||
|
"delayLoadingFile": "assets/example.scene/geometries/ab02f83d-3a7a-4abd-8e08-7dab01ba5931.babylonbinarymeshdata",
|
||||||
|
"boundingBoxMaximum": [
|
||||||
|
-0.36345699429512024,
|
||||||
|
0.7514887452125549,
|
||||||
|
4.199827194213867
|
||||||
|
],
|
||||||
|
"boundingBoxMinimum": [
|
||||||
|
-0.866409957408905,
|
||||||
|
0.29206109046936035,
|
||||||
|
4.168615341186523
|
||||||
|
],
|
||||||
|
"_binaryInfo": {
|
||||||
|
"positionsAttrDesc": {
|
||||||
|
"count": 12,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 0,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"normalsAttrDesc": {
|
||||||
|
"count": 12,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 48,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"uvsAttrDesc": {
|
||||||
|
"count": 8,
|
||||||
|
"stride": 2,
|
||||||
|
"offset": 96,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"indicesAttrDesc": {
|
||||||
|
"count": 6,
|
||||||
|
"stride": 1,
|
||||||
|
"offset": 128,
|
||||||
|
"dataType": 0
|
||||||
|
},
|
||||||
|
"subMeshesAttrDesc": {
|
||||||
|
"count": 1,
|
||||||
|
"stride": 5,
|
||||||
|
"offset": 152,
|
||||||
|
"dataType": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"positions": null,
|
||||||
|
"normals": null,
|
||||||
|
"uvs": null,
|
||||||
|
"hasUVs": true,
|
||||||
|
"indices": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"directIntensity": 1,
|
||||||
|
"emissiveIntensity": 1,
|
||||||
|
"environmentIntensity": 1,
|
||||||
|
"specularIntensity": 1,
|
||||||
|
"disableBumpMap": false,
|
||||||
|
"albedoTexture": {
|
||||||
|
"tags": null,
|
||||||
|
"url": "assets/editor-generated_7dc5359ed77982dcccfa2ae9f8d1c491.jpg",
|
||||||
|
"uOffset": 0,
|
||||||
|
"vOffset": 0,
|
||||||
|
"uScale": 1,
|
||||||
|
"vScale": -1,
|
||||||
|
"uAng": 0,
|
||||||
|
"vAng": 0,
|
||||||
|
"wAng": 0,
|
||||||
|
"uRotationCenter": 0.5,
|
||||||
|
"vRotationCenter": 0.5,
|
||||||
|
"wRotationCenter": 0.5,
|
||||||
|
"homogeneousRotationInUVTransform": false,
|
||||||
|
"isBlocking": true,
|
||||||
|
"name": "assets/editor-generated_7dc5359ed77982dcccfa2ae9f8d1c491.jpg",
|
||||||
|
"metadata": {
|
||||||
|
"baseSize": {
|
||||||
|
"width": 512,
|
||||||
|
"height": 512
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hasAlpha": false,
|
||||||
|
"getAlphaFromRGB": false,
|
||||||
|
"level": 1,
|
||||||
|
"coordinatesIndex": 2,
|
||||||
|
"optimizeUVAllocation": true,
|
||||||
|
"coordinatesMode": 0,
|
||||||
|
"wrapU": 1,
|
||||||
|
"wrapV": 1,
|
||||||
|
"wrapR": 1,
|
||||||
|
"anisotropicFilteringLevel": 4,
|
||||||
|
"isCube": false,
|
||||||
|
"is3D": false,
|
||||||
|
"is2DArray": false,
|
||||||
|
"gammaSpace": false,
|
||||||
|
"invertZ": false,
|
||||||
|
"lodLevelInAlpha": false,
|
||||||
|
"lodGenerationOffset": 0,
|
||||||
|
"lodGenerationScale": 0,
|
||||||
|
"linearSpecularLOD": false,
|
||||||
|
"isRenderTarget": false,
|
||||||
|
"animations": [],
|
||||||
|
"invertY": true,
|
||||||
|
"samplingMode": 3,
|
||||||
|
"_useSRGBBuffer": false,
|
||||||
|
"internalTextureLabel": "/Users/michaelmainguy/WebstormProjects/space-game/gameEditor",
|
||||||
|
"noMipmap": false
|
||||||
|
},
|
||||||
|
"ambientTextureStrength": 1,
|
||||||
|
"ambientTextureImpactOnAnalyticalLights": 0,
|
||||||
|
"emissiveTexture": {
|
||||||
|
"tags": null,
|
||||||
|
"url": "assets/editor-generated_7dc5359ed77982dcccfa2ae9f8d1c491.jpg",
|
||||||
|
"uOffset": 0,
|
||||||
|
"vOffset": 0,
|
||||||
|
"uScale": 1,
|
||||||
|
"vScale": -1,
|
||||||
|
"uAng": 0,
|
||||||
|
"vAng": 0,
|
||||||
|
"wAng": 0,
|
||||||
|
"uRotationCenter": 0.5,
|
||||||
|
"vRotationCenter": 0.5,
|
||||||
|
"wRotationCenter": 0.5,
|
||||||
|
"homogeneousRotationInUVTransform": false,
|
||||||
|
"isBlocking": true,
|
||||||
|
"name": "assets/editor-generated_7dc5359ed77982dcccfa2ae9f8d1c491.jpg",
|
||||||
|
"metadata": {
|
||||||
|
"baseSize": {
|
||||||
|
"width": 512,
|
||||||
|
"height": 512
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hasAlpha": false,
|
||||||
|
"getAlphaFromRGB": false,
|
||||||
|
"level": 1,
|
||||||
|
"coordinatesIndex": 2,
|
||||||
|
"optimizeUVAllocation": true,
|
||||||
|
"coordinatesMode": 0,
|
||||||
|
"wrapU": 1,
|
||||||
|
"wrapV": 1,
|
||||||
|
"wrapR": 1,
|
||||||
|
"anisotropicFilteringLevel": 4,
|
||||||
|
"isCube": false,
|
||||||
|
"is3D": false,
|
||||||
|
"is2DArray": false,
|
||||||
|
"gammaSpace": false,
|
||||||
|
"invertZ": false,
|
||||||
|
"lodLevelInAlpha": false,
|
||||||
|
"lodGenerationOffset": 0,
|
||||||
|
"lodGenerationScale": 0,
|
||||||
|
"linearSpecularLOD": false,
|
||||||
|
"isRenderTarget": false,
|
||||||
|
"animations": [],
|
||||||
|
"invertY": true,
|
||||||
|
"samplingMode": 3,
|
||||||
|
"_useSRGBBuffer": false,
|
||||||
|
"internalTextureLabel": "/Users/michaelmainguy/WebstormProjects/space-game/gameEditor",
|
||||||
|
"noMipmap": false
|
||||||
|
},
|
||||||
|
"metallic": 0,
|
||||||
|
"roughness": 0.5,
|
||||||
|
"metallicF0Factor": 1,
|
||||||
|
"metallicReflectanceColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useOnlyMetallicFromMetallicReflectanceTexture": false,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"albedo": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"baseWeight": 1,
|
||||||
|
"reflectivity": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"reflection": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
0.9999999403953552,
|
||||||
|
0.9999999403953552,
|
||||||
|
0.9999999403953552
|
||||||
|
],
|
||||||
|
"microSurface": 1,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useAlphaFromAlbedoTexture": false,
|
||||||
|
"forceAlphaTest": false,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useSpecularOverAlpha": true,
|
||||||
|
"useMicroSurfaceFromReflectivityMapAlpha": false,
|
||||||
|
"useRoughnessFromMetallicTextureAlpha": true,
|
||||||
|
"useRoughnessFromMetallicTextureGreen": false,
|
||||||
|
"useMetallnessFromMetallicTextureBlue": false,
|
||||||
|
"useAmbientOcclusionFromMetallicTextureRed": false,
|
||||||
|
"useAmbientInGrayScale": false,
|
||||||
|
"useAutoMicroSurfaceFromReflectivityMap": false,
|
||||||
|
"usePhysicalLightFalloff": true,
|
||||||
|
"useGLTFLightFalloff": false,
|
||||||
|
"useRadianceOverAlpha": true,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"disableLighting": false,
|
||||||
|
"forceIrradianceInFragment": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": true,
|
||||||
|
"useAlphaFresnel": false,
|
||||||
|
"useLinearAlphaFresnel": false,
|
||||||
|
"forceNormalForward": false,
|
||||||
|
"enableSpecularAntiAliasing": true,
|
||||||
|
"useHorizonOcclusion": true,
|
||||||
|
"useRadianceOcclusion": true,
|
||||||
|
"unlit": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "4b8b6899-b62b-4c2c-aa9c-4102fac0c2fe",
|
||||||
|
"name": "Gauges",
|
||||||
|
"metadata": {},
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 1,
|
||||||
|
"backFaceCulling": false,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"transparencyMode": 0,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 1764787012185,
|
||||||
|
"plugins": {
|
||||||
|
"PBRBRDFConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"useEnergyConservation": true,
|
||||||
|
"useSmithVisibilityHeightCorrelated": true,
|
||||||
|
"useSphericalHarmonics": true,
|
||||||
|
"useSpecularGlossinessInputEnergyConservation": true,
|
||||||
|
"mixIblRadianceWithIrradiance": true,
|
||||||
|
"useLegacySpecularEnergyConservation": true,
|
||||||
|
"baseDiffuseModel": 0,
|
||||||
|
"dielectricSpecularModel": 0,
|
||||||
|
"conductorSpecularModel": 0,
|
||||||
|
"name": "PBRBRDF",
|
||||||
|
"priority": 90,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRClearCoatConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"remapF0OnInterfaceChange": true,
|
||||||
|
"isTintEnabled": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"tintThickness": 1,
|
||||||
|
"name": "PBRClearCoat",
|
||||||
|
"priority": 100,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRIridescenceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"minimumThickness": 100,
|
||||||
|
"maximumThickness": 400,
|
||||||
|
"indexOfRefraction": 1.3,
|
||||||
|
"name": "PBRIridescence",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRAnisotropicConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"direction": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"legacy": false,
|
||||||
|
"name": "PBRAnisotropic",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSheenConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"linkSheenWithAlbedo": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"color": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"albedoScaling": false,
|
||||||
|
"name": "Sheen",
|
||||||
|
"priority": 120,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSubSurfaceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isRefractionEnabled": false,
|
||||||
|
"isTranslucencyEnabled": false,
|
||||||
|
"isDispersionEnabled": false,
|
||||||
|
"isScatteringEnabled": false,
|
||||||
|
"_scatteringDiffusionProfileIndex": 0,
|
||||||
|
"refractionIntensity": 1,
|
||||||
|
"translucencyIntensity": 1,
|
||||||
|
"useAlbedoToTintRefraction": false,
|
||||||
|
"useAlbedoToTintTranslucency": false,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"_volumeIndexOfRefraction": -1,
|
||||||
|
"invertRefractionY": false,
|
||||||
|
"linkRefractionWithTransparency": false,
|
||||||
|
"minimumThickness": 0,
|
||||||
|
"maximumThickness": 1,
|
||||||
|
"useThicknessAsDepth": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"dispersion": 0,
|
||||||
|
"diffusionDistance": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useMaskFromThicknessTexture": false,
|
||||||
|
"useGltfStyleTextures": true,
|
||||||
|
"applyAlbedoAfterSubSurface": false,
|
||||||
|
"legacyTranslucency": false,
|
||||||
|
"name": "PBRSubSurface",
|
||||||
|
"priority": 130,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": true
|
||||||
|
},
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customType": "BABYLON.PBRMaterial"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"geometries": {
|
||||||
|
"boxes": [],
|
||||||
|
"spheres": [],
|
||||||
|
"cylinders": [],
|
||||||
|
"toruses": [],
|
||||||
|
"grounds": [],
|
||||||
|
"planes": [],
|
||||||
|
"torusKnots": [],
|
||||||
|
"vertexData": []
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764787012177
|
||||||
|
},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
1.6247152644956515,
|
||||||
|
0,
|
||||||
|
4.08643597401238e-7,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1.4727547823314542,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
5.293994474577842e-7,
|
||||||
|
0,
|
||||||
|
-1.2541182156960042,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
-0.9408809412868501,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,279 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "New Box",
|
||||||
|
"id": "1679685b-ca9c-4a1c-8161-9f6064cb1d7c",
|
||||||
|
"uniqueId": 1764787809874,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 1,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"geometryUniqueId": 1764787809875,
|
||||||
|
"geometryId": "76c7442d-fb7e-4a05-b1c5-9c27b0beb0dc",
|
||||||
|
"subMeshes": null,
|
||||||
|
"materialUniqueId": 46,
|
||||||
|
"materialId": "default material",
|
||||||
|
"metadata": {
|
||||||
|
"type": "Box",
|
||||||
|
"width": 100,
|
||||||
|
"depth": 100,
|
||||||
|
"height": 100,
|
||||||
|
"sideOrientation": 0
|
||||||
|
},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 1,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"applyFog": true,
|
||||||
|
"delayLoadingFile": "assets/example.scene/geometries/76c7442d-fb7e-4a05-b1c5-9c27b0beb0dc.babylonbinarymeshdata",
|
||||||
|
"boundingBoxMaximum": [
|
||||||
|
50,
|
||||||
|
50,
|
||||||
|
50
|
||||||
|
],
|
||||||
|
"boundingBoxMinimum": [
|
||||||
|
-50,
|
||||||
|
-50,
|
||||||
|
-50
|
||||||
|
],
|
||||||
|
"_binaryInfo": {
|
||||||
|
"positionsAttrDesc": {
|
||||||
|
"count": 72,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 0,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"normalsAttrDesc": {
|
||||||
|
"count": 72,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 288,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"uvsAttrDesc": {
|
||||||
|
"count": 48,
|
||||||
|
"stride": 2,
|
||||||
|
"offset": 576,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"indicesAttrDesc": {
|
||||||
|
"count": 36,
|
||||||
|
"stride": 1,
|
||||||
|
"offset": 768,
|
||||||
|
"dataType": 0
|
||||||
|
},
|
||||||
|
"subMeshesAttrDesc": {
|
||||||
|
"count": 1,
|
||||||
|
"stride": 5,
|
||||||
|
"offset": 912,
|
||||||
|
"dataType": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"positions": null,
|
||||||
|
"normals": null,
|
||||||
|
"uvs": null,
|
||||||
|
"hasUVs": true,
|
||||||
|
"indices": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"diffuse": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"specular": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"specularPower": 64,
|
||||||
|
"useAlphaFromDiffuseTexture": false,
|
||||||
|
"useEmissiveAsIllumination": false,
|
||||||
|
"linkEmissiveWithDiffuse": false,
|
||||||
|
"useSpecularOverAlpha": false,
|
||||||
|
"useReflectionOverAlpha": false,
|
||||||
|
"disableLighting": false,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 0.98,
|
||||||
|
"invertRefractionY": true,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useReflectionFresnelFromSpecular": false,
|
||||||
|
"useGlossinessFromSpecularMapAlpha": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "default material",
|
||||||
|
"name": "default material",
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 1,
|
||||||
|
"backFaceCulling": true,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 46,
|
||||||
|
"plugins": {
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"geometries": {
|
||||||
|
"boxes": [],
|
||||||
|
"spheres": [],
|
||||||
|
"cylinders": [],
|
||||||
|
"toruses": [],
|
||||||
|
"grounds": [],
|
||||||
|
"planes": [],
|
||||||
|
"torusKnots": [],
|
||||||
|
"vertexData": []
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"type": "Box",
|
||||||
|
"width": 100,
|
||||||
|
"depth": 100,
|
||||||
|
"height": 100,
|
||||||
|
"sideOrientation": 0
|
||||||
|
},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,428 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "BaseLandingZone",
|
||||||
|
"id": "2a185a78-d743-4a8f-b9a8-cf95f60f0ae0",
|
||||||
|
"uniqueId": 1764786749145,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
6.372689247131348,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotationQuaternion": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
28.34206199645996,
|
||||||
|
28.34206199645996,
|
||||||
|
28.34206199645996
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 0,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"geometryUniqueId": 1764786749148,
|
||||||
|
"geometryId": "0d955d0c-93e1-4875-884d-db636576f51e",
|
||||||
|
"subMeshes": null,
|
||||||
|
"materialUniqueId": 1764786749149,
|
||||||
|
"materialId": "5bc1e4e2-2fa5-4c81-a3de-93e55ae0919e",
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764786749143
|
||||||
|
},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 0,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"renderOverlay": false,
|
||||||
|
"applyFog": true,
|
||||||
|
"delayLoadingFile": "assets/example.scene/geometries/0d955d0c-93e1-4875-884d-db636576f51e.babylonbinarymeshdata",
|
||||||
|
"boundingBoxMaximum": [
|
||||||
|
0.9807851314544678,
|
||||||
|
0.3284308910369873,
|
||||||
|
0.9807849526405334
|
||||||
|
],
|
||||||
|
"boundingBoxMinimum": [
|
||||||
|
-0.9807848334312439,
|
||||||
|
-0.4938357472419739,
|
||||||
|
-0.9807852506637573
|
||||||
|
],
|
||||||
|
"_binaryInfo": {
|
||||||
|
"positionsAttrDesc": {
|
||||||
|
"count": 2688,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 0,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"normalsAttrDesc": {
|
||||||
|
"count": 2688,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 10752,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"uvsAttrDesc": {
|
||||||
|
"count": 1792,
|
||||||
|
"stride": 2,
|
||||||
|
"offset": 21504,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"indicesAttrDesc": {
|
||||||
|
"count": 1338,
|
||||||
|
"stride": 1,
|
||||||
|
"offset": 28672,
|
||||||
|
"dataType": 0
|
||||||
|
},
|
||||||
|
"subMeshesAttrDesc": {
|
||||||
|
"count": 1,
|
||||||
|
"stride": 5,
|
||||||
|
"offset": 34024,
|
||||||
|
"dataType": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"positions": null,
|
||||||
|
"normals": null,
|
||||||
|
"uvs": null,
|
||||||
|
"hasUVs": true,
|
||||||
|
"indices": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"directIntensity": 1,
|
||||||
|
"emissiveIntensity": 1,
|
||||||
|
"environmentIntensity": 1,
|
||||||
|
"specularIntensity": 1,
|
||||||
|
"disableBumpMap": false,
|
||||||
|
"ambientTextureStrength": 1,
|
||||||
|
"ambientTextureImpactOnAnalyticalLights": 0,
|
||||||
|
"metallic": 0,
|
||||||
|
"roughness": 0.5,
|
||||||
|
"metallicF0Factor": 1,
|
||||||
|
"metallicReflectanceColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useOnlyMetallicFromMetallicReflectanceTexture": false,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"albedo": [
|
||||||
|
0.0724073052406311,
|
||||||
|
0.8001724481582642,
|
||||||
|
0.08219180256128311
|
||||||
|
],
|
||||||
|
"baseWeight": 1,
|
||||||
|
"reflectivity": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"reflection": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
0.003482822866271551,
|
||||||
|
0.09999999403953552,
|
||||||
|
0.003765808193933462
|
||||||
|
],
|
||||||
|
"microSurface": 1,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useAlphaFromAlbedoTexture": false,
|
||||||
|
"forceAlphaTest": false,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useSpecularOverAlpha": true,
|
||||||
|
"useMicroSurfaceFromReflectivityMapAlpha": false,
|
||||||
|
"useRoughnessFromMetallicTextureAlpha": true,
|
||||||
|
"useRoughnessFromMetallicTextureGreen": false,
|
||||||
|
"useMetallnessFromMetallicTextureBlue": false,
|
||||||
|
"useAmbientOcclusionFromMetallicTextureRed": false,
|
||||||
|
"useAmbientInGrayScale": false,
|
||||||
|
"useAutoMicroSurfaceFromReflectivityMap": false,
|
||||||
|
"usePhysicalLightFalloff": true,
|
||||||
|
"useGLTFLightFalloff": false,
|
||||||
|
"useRadianceOverAlpha": true,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"disableLighting": false,
|
||||||
|
"forceIrradianceInFragment": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": true,
|
||||||
|
"useAlphaFresnel": false,
|
||||||
|
"useLinearAlphaFresnel": false,
|
||||||
|
"forceNormalForward": false,
|
||||||
|
"enableSpecularAntiAliasing": true,
|
||||||
|
"useHorizonOcclusion": true,
|
||||||
|
"useRadianceOcclusion": true,
|
||||||
|
"unlit": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "5bc1e4e2-2fa5-4c81-a3de-93e55ae0919e",
|
||||||
|
"name": "Material",
|
||||||
|
"metadata": {},
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 0.2634408473968506,
|
||||||
|
"backFaceCulling": false,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"transparencyMode": 2,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 1764786749149,
|
||||||
|
"plugins": {
|
||||||
|
"PBRBRDFConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"useEnergyConservation": true,
|
||||||
|
"useSmithVisibilityHeightCorrelated": true,
|
||||||
|
"useSphericalHarmonics": true,
|
||||||
|
"useSpecularGlossinessInputEnergyConservation": true,
|
||||||
|
"mixIblRadianceWithIrradiance": true,
|
||||||
|
"useLegacySpecularEnergyConservation": true,
|
||||||
|
"baseDiffuseModel": 0,
|
||||||
|
"dielectricSpecularModel": 0,
|
||||||
|
"conductorSpecularModel": 0,
|
||||||
|
"name": "PBRBRDF",
|
||||||
|
"priority": 90,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRClearCoatConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"remapF0OnInterfaceChange": true,
|
||||||
|
"isTintEnabled": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"tintThickness": 1,
|
||||||
|
"name": "PBRClearCoat",
|
||||||
|
"priority": 100,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRIridescenceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"minimumThickness": 100,
|
||||||
|
"maximumThickness": 400,
|
||||||
|
"indexOfRefraction": 1.3,
|
||||||
|
"name": "PBRIridescence",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRAnisotropicConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"direction": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"legacy": false,
|
||||||
|
"name": "PBRAnisotropic",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSheenConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"linkSheenWithAlbedo": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"color": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"albedoScaling": false,
|
||||||
|
"name": "Sheen",
|
||||||
|
"priority": 120,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSubSurfaceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isRefractionEnabled": false,
|
||||||
|
"isTranslucencyEnabled": false,
|
||||||
|
"isDispersionEnabled": false,
|
||||||
|
"isScatteringEnabled": false,
|
||||||
|
"_scatteringDiffusionProfileIndex": 0,
|
||||||
|
"refractionIntensity": 1,
|
||||||
|
"translucencyIntensity": 1,
|
||||||
|
"useAlbedoToTintRefraction": false,
|
||||||
|
"useAlbedoToTintTranslucency": false,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"_volumeIndexOfRefraction": -1,
|
||||||
|
"invertRefractionY": false,
|
||||||
|
"linkRefractionWithTransparency": false,
|
||||||
|
"minimumThickness": 0,
|
||||||
|
"maximumThickness": 1,
|
||||||
|
"useThicknessAsDepth": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"dispersion": 0,
|
||||||
|
"diffusionDistance": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useMaskFromThicknessTexture": false,
|
||||||
|
"useGltfStyleTextures": true,
|
||||||
|
"applyAlbedoAfterSubSurface": false,
|
||||||
|
"legacyTranslucency": false,
|
||||||
|
"name": "PBRSubSurface",
|
||||||
|
"priority": 130,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": true
|
||||||
|
},
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customType": "BABYLON.PBRMaterial"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"geometries": {
|
||||||
|
"boxes": [],
|
||||||
|
"spheres": [],
|
||||||
|
"cylinders": [],
|
||||||
|
"toruses": [],
|
||||||
|
"grounds": [],
|
||||||
|
"planes": [],
|
||||||
|
"torusKnots": [],
|
||||||
|
"vertexData": []
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764786749143
|
||||||
|
},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
-0.03528324792052547,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0.03528324792052547,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0.03528324792052547,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
-0.22484917462700213,
|
||||||
|
0,
|
||||||
|
0.9999999999999999
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,594 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "Asteroid",
|
||||||
|
"id": "790b6a71-5425-47f2-ae64-f2d04e2e3c6d",
|
||||||
|
"uniqueId": 1764789858422,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
-33.08901451261646,
|
||||||
|
40.81207511231127,
|
||||||
|
-108.3875380136813
|
||||||
|
],
|
||||||
|
"rotationQuaternion": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
5,
|
||||||
|
5,
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 0,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"geometryUniqueId": 1764789858423,
|
||||||
|
"geometryId": "9092e1b8-d64b-409a-9067-1f9373f47df3",
|
||||||
|
"subMeshes": null,
|
||||||
|
"materialUniqueId": 1764789858424,
|
||||||
|
"materialId": "81400b58-6fbe-4364-8c25-b5a03c536f05",
|
||||||
|
"metadata": {
|
||||||
|
"scripts": [
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"key": "scripts/editorScripts/AsteroidComponent.ts",
|
||||||
|
"values": {
|
||||||
|
"linearVelocity": {
|
||||||
|
"type": "vector3",
|
||||||
|
"value": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
-30
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"angularVelocity": {
|
||||||
|
"type": "vector3",
|
||||||
|
"value": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mass": {
|
||||||
|
"type": "number",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"targetId": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Reference to a TargetComponent node",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
"targetMode": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "orbit | moveToward | (empty)",
|
||||||
|
"value": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"_id": "750ffa11-d797-43f4-a63b-0e1592a4f6af"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"parentId": 1764789858421
|
||||||
|
},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 0,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"renderOverlay": false,
|
||||||
|
"applyFog": true,
|
||||||
|
"delayLoadingFile": "assets/example.scene/geometries/9092e1b8-d64b-409a-9067-1f9373f47df3.babylonbinarymeshdata",
|
||||||
|
"boundingBoxMaximum": [
|
||||||
|
2.8008618354797363,
|
||||||
|
2.679150342941284,
|
||||||
|
2.679150104522705
|
||||||
|
],
|
||||||
|
"boundingBoxMinimum": [
|
||||||
|
-2.054845094680786,
|
||||||
|
-2.679150342941284,
|
||||||
|
-2.679150104522705
|
||||||
|
],
|
||||||
|
"_binaryInfo": {
|
||||||
|
"positionsAttrDesc": {
|
||||||
|
"count": 912,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 0,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"normalsAttrDesc": {
|
||||||
|
"count": 912,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 3648,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"uvsAttrDesc": {
|
||||||
|
"count": 608,
|
||||||
|
"stride": 2,
|
||||||
|
"offset": 7296,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"indicesAttrDesc": {
|
||||||
|
"count": 342,
|
||||||
|
"stride": 1,
|
||||||
|
"offset": 9728,
|
||||||
|
"dataType": 0
|
||||||
|
},
|
||||||
|
"subMeshesAttrDesc": {
|
||||||
|
"count": 1,
|
||||||
|
"stride": 5,
|
||||||
|
"offset": 11096,
|
||||||
|
"dataType": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"positions": null,
|
||||||
|
"normals": null,
|
||||||
|
"uvs": null,
|
||||||
|
"hasUVs": true,
|
||||||
|
"indices": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"directIntensity": 1,
|
||||||
|
"emissiveIntensity": 1,
|
||||||
|
"environmentIntensity": 1,
|
||||||
|
"specularIntensity": 1,
|
||||||
|
"disableBumpMap": false,
|
||||||
|
"albedoTexture": {
|
||||||
|
"tags": null,
|
||||||
|
"url": "assets/editor-generated_aed030862c8a5064c80262817ba13a70.jpg",
|
||||||
|
"uOffset": 0,
|
||||||
|
"vOffset": 0,
|
||||||
|
"uScale": 1,
|
||||||
|
"vScale": -1,
|
||||||
|
"uAng": 0,
|
||||||
|
"vAng": 0,
|
||||||
|
"wAng": 0,
|
||||||
|
"uRotationCenter": 0.5,
|
||||||
|
"vRotationCenter": 0.5,
|
||||||
|
"wRotationCenter": 0.5,
|
||||||
|
"homogeneousRotationInUVTransform": false,
|
||||||
|
"isBlocking": true,
|
||||||
|
"name": "assets/editor-generated_aed030862c8a5064c80262817ba13a70.jpg",
|
||||||
|
"metadata": {},
|
||||||
|
"hasAlpha": false,
|
||||||
|
"getAlphaFromRGB": false,
|
||||||
|
"level": 1,
|
||||||
|
"coordinatesIndex": 0,
|
||||||
|
"optimizeUVAllocation": true,
|
||||||
|
"coordinatesMode": 0,
|
||||||
|
"wrapU": 1,
|
||||||
|
"wrapV": 1,
|
||||||
|
"wrapR": 1,
|
||||||
|
"anisotropicFilteringLevel": 4,
|
||||||
|
"isCube": false,
|
||||||
|
"is3D": false,
|
||||||
|
"is2DArray": false,
|
||||||
|
"gammaSpace": false,
|
||||||
|
"invertZ": false,
|
||||||
|
"lodLevelInAlpha": false,
|
||||||
|
"lodGenerationOffset": 0,
|
||||||
|
"lodGenerationScale": 0,
|
||||||
|
"linearSpecularLOD": false,
|
||||||
|
"isRenderTarget": false,
|
||||||
|
"animations": [],
|
||||||
|
"invertY": true,
|
||||||
|
"samplingMode": 3,
|
||||||
|
"_useSRGBBuffer": false,
|
||||||
|
"internalTextureLabel": "/Users/michaelmainguy/WebstormProjects/space-game/gameEditor",
|
||||||
|
"noMipmap": false
|
||||||
|
},
|
||||||
|
"ambientTextureStrength": 1,
|
||||||
|
"ambientTextureImpactOnAnalyticalLights": 0,
|
||||||
|
"emissiveTexture": {
|
||||||
|
"tags": null,
|
||||||
|
"url": "assets/editor-generated_aed030862c8a5064c80262817ba13a70.jpg",
|
||||||
|
"uOffset": 0,
|
||||||
|
"vOffset": 0,
|
||||||
|
"uScale": 1,
|
||||||
|
"vScale": -1,
|
||||||
|
"uAng": 0,
|
||||||
|
"vAng": 0,
|
||||||
|
"wAng": 0,
|
||||||
|
"uRotationCenter": 0.5,
|
||||||
|
"vRotationCenter": 0.5,
|
||||||
|
"wRotationCenter": 0.5,
|
||||||
|
"homogeneousRotationInUVTransform": false,
|
||||||
|
"isBlocking": true,
|
||||||
|
"name": "assets/editor-generated_aed030862c8a5064c80262817ba13a70.jpg",
|
||||||
|
"metadata": {},
|
||||||
|
"hasAlpha": false,
|
||||||
|
"getAlphaFromRGB": false,
|
||||||
|
"level": 1,
|
||||||
|
"coordinatesIndex": 0,
|
||||||
|
"optimizeUVAllocation": true,
|
||||||
|
"coordinatesMode": 0,
|
||||||
|
"wrapU": 1,
|
||||||
|
"wrapV": 1,
|
||||||
|
"wrapR": 1,
|
||||||
|
"anisotropicFilteringLevel": 4,
|
||||||
|
"isCube": false,
|
||||||
|
"is3D": false,
|
||||||
|
"is2DArray": false,
|
||||||
|
"gammaSpace": false,
|
||||||
|
"invertZ": false,
|
||||||
|
"lodLevelInAlpha": false,
|
||||||
|
"lodGenerationOffset": 0,
|
||||||
|
"lodGenerationScale": 0,
|
||||||
|
"linearSpecularLOD": false,
|
||||||
|
"isRenderTarget": false,
|
||||||
|
"animations": [],
|
||||||
|
"invertY": true,
|
||||||
|
"samplingMode": 3,
|
||||||
|
"_useSRGBBuffer": false,
|
||||||
|
"internalTextureLabel": "/Users/michaelmainguy/WebstormProjects/space-game/gameEditor",
|
||||||
|
"noMipmap": false
|
||||||
|
},
|
||||||
|
"metallic": 0,
|
||||||
|
"roughness": 1,
|
||||||
|
"metallicF0Factor": 0,
|
||||||
|
"metallicReflectanceColor": [
|
||||||
|
0.23755916953086853,
|
||||||
|
0.23755916953086853,
|
||||||
|
0.23755916953086853
|
||||||
|
],
|
||||||
|
"useOnlyMetallicFromMetallicReflectanceTexture": false,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"albedo": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"baseWeight": 1,
|
||||||
|
"reflectivity": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"reflection": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
0.3999999761581421,
|
||||||
|
0.3999999761581421,
|
||||||
|
0.3999999761581421
|
||||||
|
],
|
||||||
|
"microSurface": 1,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useAlphaFromAlbedoTexture": false,
|
||||||
|
"forceAlphaTest": false,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useSpecularOverAlpha": true,
|
||||||
|
"useMicroSurfaceFromReflectivityMapAlpha": false,
|
||||||
|
"useRoughnessFromMetallicTextureAlpha": true,
|
||||||
|
"useRoughnessFromMetallicTextureGreen": false,
|
||||||
|
"useMetallnessFromMetallicTextureBlue": false,
|
||||||
|
"useAmbientOcclusionFromMetallicTextureRed": false,
|
||||||
|
"useAmbientInGrayScale": false,
|
||||||
|
"useAutoMicroSurfaceFromReflectivityMap": false,
|
||||||
|
"usePhysicalLightFalloff": true,
|
||||||
|
"useGLTFLightFalloff": false,
|
||||||
|
"useRadianceOverAlpha": true,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"disableLighting": false,
|
||||||
|
"forceIrradianceInFragment": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": true,
|
||||||
|
"useAlphaFresnel": false,
|
||||||
|
"useLinearAlphaFresnel": false,
|
||||||
|
"forceNormalForward": false,
|
||||||
|
"enableSpecularAntiAliasing": true,
|
||||||
|
"useHorizonOcclusion": true,
|
||||||
|
"useRadianceOcclusion": true,
|
||||||
|
"unlit": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "81400b58-6fbe-4364-8c25-b5a03c536f05",
|
||||||
|
"name": "Material.001",
|
||||||
|
"metadata": {},
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 1,
|
||||||
|
"backFaceCulling": false,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"transparencyMode": 0,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 1764789858424,
|
||||||
|
"plugins": {
|
||||||
|
"PBRBRDFConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"useEnergyConservation": true,
|
||||||
|
"useSmithVisibilityHeightCorrelated": true,
|
||||||
|
"useSphericalHarmonics": true,
|
||||||
|
"useSpecularGlossinessInputEnergyConservation": true,
|
||||||
|
"mixIblRadianceWithIrradiance": true,
|
||||||
|
"useLegacySpecularEnergyConservation": true,
|
||||||
|
"baseDiffuseModel": 0,
|
||||||
|
"dielectricSpecularModel": 0,
|
||||||
|
"conductorSpecularModel": 0,
|
||||||
|
"name": "PBRBRDF",
|
||||||
|
"priority": 90,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRClearCoatConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"remapF0OnInterfaceChange": true,
|
||||||
|
"isTintEnabled": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"tintThickness": 1,
|
||||||
|
"name": "PBRClearCoat",
|
||||||
|
"priority": 100,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRIridescenceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"minimumThickness": 100,
|
||||||
|
"maximumThickness": 400,
|
||||||
|
"indexOfRefraction": 1.3,
|
||||||
|
"name": "PBRIridescence",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRAnisotropicConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"direction": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"legacy": false,
|
||||||
|
"name": "PBRAnisotropic",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSheenConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"linkSheenWithAlbedo": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"color": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"albedoScaling": false,
|
||||||
|
"name": "Sheen",
|
||||||
|
"priority": 120,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSubSurfaceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isRefractionEnabled": false,
|
||||||
|
"isTranslucencyEnabled": false,
|
||||||
|
"isDispersionEnabled": false,
|
||||||
|
"isScatteringEnabled": false,
|
||||||
|
"_scatteringDiffusionProfileIndex": 0,
|
||||||
|
"refractionIntensity": 1,
|
||||||
|
"translucencyIntensity": 1,
|
||||||
|
"useAlbedoToTintRefraction": false,
|
||||||
|
"useAlbedoToTintTranslucency": false,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"_volumeIndexOfRefraction": -1,
|
||||||
|
"invertRefractionY": false,
|
||||||
|
"linkRefractionWithTransparency": false,
|
||||||
|
"minimumThickness": 0,
|
||||||
|
"maximumThickness": 1,
|
||||||
|
"useThicknessAsDepth": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"dispersion": 0,
|
||||||
|
"diffusionDistance": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useMaskFromThicknessTexture": false,
|
||||||
|
"useGltfStyleTextures": true,
|
||||||
|
"applyAlbedoAfterSubSurface": false,
|
||||||
|
"legacyTranslucency": false,
|
||||||
|
"name": "PBRSubSurface",
|
||||||
|
"priority": 130,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": true
|
||||||
|
},
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customType": "BABYLON.PBRMaterial"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"geometries": {
|
||||||
|
"boxes": [],
|
||||||
|
"spheres": [],
|
||||||
|
"cylinders": [],
|
||||||
|
"toruses": [],
|
||||||
|
"grounds": [],
|
||||||
|
"planes": [],
|
||||||
|
"torusKnots": [],
|
||||||
|
"vertexData": []
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"scripts": [
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"key": "scripts/editorScripts/AsteroidComponent.ts",
|
||||||
|
"values": {
|
||||||
|
"linearVelocity": {
|
||||||
|
"type": "vector3",
|
||||||
|
"value": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
-30
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"angularVelocity": {
|
||||||
|
"type": "vector3",
|
||||||
|
"value": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mass": {
|
||||||
|
"type": "number",
|
||||||
|
"value": 1
|
||||||
|
},
|
||||||
|
"targetId": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Reference to a TargetComponent node",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
"targetMode": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "orbit | moveToward | (empty)",
|
||||||
|
"value": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"_id": "750ffa11-d797-43f4-a63b-0e1592a4f6af"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"parentId": 1764789858421
|
||||||
|
},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
-1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,426 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "Ship_primitive1",
|
||||||
|
"id": "b633ecf7-2331-4ebd-b586-3852eff6c50f",
|
||||||
|
"uniqueId": 1764787012174,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 0,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"geometryUniqueId": 1764787012180,
|
||||||
|
"geometryId": "7a537688-5920-4808-9d7b-d63e83375f90",
|
||||||
|
"subMeshes": null,
|
||||||
|
"materialUniqueId": 1764787012181,
|
||||||
|
"materialId": "436eb7a0-ac6c-472d-b6fe-0d986a8af5c7",
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764787012177
|
||||||
|
},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 1,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"applyFog": true,
|
||||||
|
"delayLoadingFile": "assets/example.scene/geometries/7a537688-5920-4808-9d7b-d63e83375f90.babylonbinarymeshdata",
|
||||||
|
"boundingBoxMaximum": [
|
||||||
|
1.5084391832351685,
|
||||||
|
2.162097454071045,
|
||||||
|
5.122784614562988
|
||||||
|
],
|
||||||
|
"boundingBoxMinimum": [
|
||||||
|
-1.5084391832351685,
|
||||||
|
-1.0288662910461426,
|
||||||
|
-2.6966497898101807
|
||||||
|
],
|
||||||
|
"_binaryInfo": {
|
||||||
|
"positionsAttrDesc": {
|
||||||
|
"count": 420,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 0,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"normalsAttrDesc": {
|
||||||
|
"count": 420,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 1680,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"uvsAttrDesc": {
|
||||||
|
"count": 280,
|
||||||
|
"stride": 2,
|
||||||
|
"offset": 3360,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"indicesAttrDesc": {
|
||||||
|
"count": 192,
|
||||||
|
"stride": 1,
|
||||||
|
"offset": 4480,
|
||||||
|
"dataType": 0
|
||||||
|
},
|
||||||
|
"subMeshesAttrDesc": {
|
||||||
|
"count": 1,
|
||||||
|
"stride": 5,
|
||||||
|
"offset": 5248,
|
||||||
|
"dataType": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"positions": null,
|
||||||
|
"normals": null,
|
||||||
|
"uvs": null,
|
||||||
|
"hasUVs": true,
|
||||||
|
"indices": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"directIntensity": 1,
|
||||||
|
"emissiveIntensity": 1,
|
||||||
|
"environmentIntensity": 1,
|
||||||
|
"specularIntensity": 1,
|
||||||
|
"disableBumpMap": false,
|
||||||
|
"ambientTextureStrength": 1,
|
||||||
|
"ambientTextureImpactOnAnalyticalLights": 0,
|
||||||
|
"metallic": 0,
|
||||||
|
"roughness": 0.059139788150787354,
|
||||||
|
"metallicF0Factor": 0,
|
||||||
|
"metallicReflectanceColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useOnlyMetallicFromMetallicReflectanceTexture": false,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"albedo": [
|
||||||
|
0.800133466720581,
|
||||||
|
0.69917231798172,
|
||||||
|
0.16859057545661926
|
||||||
|
],
|
||||||
|
"baseWeight": 1,
|
||||||
|
"reflectivity": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"reflection": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"microSurface": 1,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useAlphaFromAlbedoTexture": false,
|
||||||
|
"forceAlphaTest": false,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useSpecularOverAlpha": true,
|
||||||
|
"useMicroSurfaceFromReflectivityMapAlpha": false,
|
||||||
|
"useRoughnessFromMetallicTextureAlpha": true,
|
||||||
|
"useRoughnessFromMetallicTextureGreen": false,
|
||||||
|
"useMetallnessFromMetallicTextureBlue": false,
|
||||||
|
"useAmbientOcclusionFromMetallicTextureRed": false,
|
||||||
|
"useAmbientInGrayScale": false,
|
||||||
|
"useAutoMicroSurfaceFromReflectivityMap": false,
|
||||||
|
"usePhysicalLightFalloff": true,
|
||||||
|
"useGLTFLightFalloff": false,
|
||||||
|
"useRadianceOverAlpha": true,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"disableLighting": false,
|
||||||
|
"forceIrradianceInFragment": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": true,
|
||||||
|
"useAlphaFresnel": false,
|
||||||
|
"useLinearAlphaFresnel": false,
|
||||||
|
"forceNormalForward": false,
|
||||||
|
"enableSpecularAntiAliasing": true,
|
||||||
|
"useHorizonOcclusion": true,
|
||||||
|
"useRadianceOcclusion": true,
|
||||||
|
"unlit": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "436eb7a0-ac6c-472d-b6fe-0d986a8af5c7",
|
||||||
|
"name": "ShipWindow",
|
||||||
|
"metadata": {},
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 0.1505376398563385,
|
||||||
|
"backFaceCulling": false,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"transparencyMode": 2,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 1764787012181,
|
||||||
|
"plugins": {
|
||||||
|
"PBRBRDFConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"useEnergyConservation": true,
|
||||||
|
"useSmithVisibilityHeightCorrelated": true,
|
||||||
|
"useSphericalHarmonics": true,
|
||||||
|
"useSpecularGlossinessInputEnergyConservation": true,
|
||||||
|
"mixIblRadianceWithIrradiance": true,
|
||||||
|
"useLegacySpecularEnergyConservation": true,
|
||||||
|
"baseDiffuseModel": 0,
|
||||||
|
"dielectricSpecularModel": 0,
|
||||||
|
"conductorSpecularModel": 0,
|
||||||
|
"name": "PBRBRDF",
|
||||||
|
"priority": 90,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRClearCoatConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"remapF0OnInterfaceChange": true,
|
||||||
|
"isTintEnabled": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"tintThickness": 1,
|
||||||
|
"name": "PBRClearCoat",
|
||||||
|
"priority": 100,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRIridescenceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"minimumThickness": 100,
|
||||||
|
"maximumThickness": 400,
|
||||||
|
"indexOfRefraction": 1.3,
|
||||||
|
"name": "PBRIridescence",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRAnisotropicConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"direction": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"legacy": false,
|
||||||
|
"name": "PBRAnisotropic",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSheenConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"linkSheenWithAlbedo": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"color": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"albedoScaling": false,
|
||||||
|
"name": "Sheen",
|
||||||
|
"priority": 120,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSubSurfaceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isRefractionEnabled": false,
|
||||||
|
"isTranslucencyEnabled": false,
|
||||||
|
"isDispersionEnabled": false,
|
||||||
|
"isScatteringEnabled": false,
|
||||||
|
"_scatteringDiffusionProfileIndex": 0,
|
||||||
|
"refractionIntensity": 1,
|
||||||
|
"translucencyIntensity": 1,
|
||||||
|
"useAlbedoToTintRefraction": false,
|
||||||
|
"useAlbedoToTintTranslucency": false,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"_volumeIndexOfRefraction": -1,
|
||||||
|
"invertRefractionY": false,
|
||||||
|
"linkRefractionWithTransparency": false,
|
||||||
|
"minimumThickness": 0,
|
||||||
|
"maximumThickness": 1,
|
||||||
|
"useThicknessAsDepth": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"dispersion": 0,
|
||||||
|
"diffusionDistance": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useMaskFromThicknessTexture": false,
|
||||||
|
"useGltfStyleTextures": true,
|
||||||
|
"applyAlbedoAfterSubSurface": false,
|
||||||
|
"legacyTranslucency": false,
|
||||||
|
"name": "PBRSubSurface",
|
||||||
|
"priority": 130,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": true
|
||||||
|
},
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customType": "BABYLON.PBRMaterial"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"geometries": {
|
||||||
|
"boxes": [],
|
||||||
|
"spheres": [],
|
||||||
|
"cylinders": [],
|
||||||
|
"toruses": [],
|
||||||
|
"grounds": [],
|
||||||
|
"planes": [],
|
||||||
|
"torusKnots": [],
|
||||||
|
"vertexData": []
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764787012177
|
||||||
|
},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
1.6247152644956515,
|
||||||
|
0,
|
||||||
|
4.08643597401238e-7,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1.4727547823314542,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
5.293994474577842e-7,
|
||||||
|
0,
|
||||||
|
-1.2541182156960042,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
-0.9408809412868501,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,156 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "ship.glb",
|
||||||
|
"id": "bf9cd6cd-3743-4b89-9c33-e7b12cc3eb3d",
|
||||||
|
"uniqueId": 1764787012172,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
3.1129212205596573,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
100.00000000000159,
|
||||||
|
-100,
|
||||||
|
100.00000000000159
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 1,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"materialId": "default material",
|
||||||
|
"metadata": {
|
||||||
|
"scripts": [
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"key": "scripts/editorScripts/ShipComponent.ts",
|
||||||
|
"values": {
|
||||||
|
"linearVelocity": {
|
||||||
|
"type": "vector3",
|
||||||
|
"value": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"angularVelocity": {
|
||||||
|
"type": "vector3",
|
||||||
|
"value": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"_id": "fa6b5e6d-29c3-4159-9248-cab250039a6e"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 1,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"applyFog": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [],
|
||||||
|
"metadata": {
|
||||||
|
"scripts": [
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"key": "scripts/editorScripts/ShipComponent.ts",
|
||||||
|
"values": {
|
||||||
|
"linearVelocity": {
|
||||||
|
"type": "vector3",
|
||||||
|
"value": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"angularVelocity": {
|
||||||
|
"type": "vector3",
|
||||||
|
"value": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"_id": "fa6b5e6d-29c3-4159-9248-cab250039a6e"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
-1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,247 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "base.glb",
|
||||||
|
"id": "c7b3d00d-20da-4560-8611-f3186ffda0f0",
|
||||||
|
"uniqueId": 1764786749143,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotationQuaternion": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
-100
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 1,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"materialUniqueId": 46,
|
||||||
|
"materialId": "default material",
|
||||||
|
"metadata": {
|
||||||
|
"scripts": [
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"key": "scripts/editorScripts/BaseComponent.ts",
|
||||||
|
"values": {
|
||||||
|
"baseGlbPath": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Path to base GLB model",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
"landingGlbPath": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Path to landing zone GLB",
|
||||||
|
"value": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"_id": "7741fd66-a746-4f78-a7fd-5f8f404b610c"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 1,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"applyFog": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"diffuse": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"specular": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"specularPower": 64,
|
||||||
|
"useAlphaFromDiffuseTexture": false,
|
||||||
|
"useEmissiveAsIllumination": false,
|
||||||
|
"linkEmissiveWithDiffuse": false,
|
||||||
|
"useSpecularOverAlpha": false,
|
||||||
|
"useReflectionOverAlpha": false,
|
||||||
|
"disableLighting": false,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 0.98,
|
||||||
|
"invertRefractionY": true,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useReflectionFresnelFromSpecular": false,
|
||||||
|
"useGlossinessFromSpecularMapAlpha": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "default material",
|
||||||
|
"name": "default material",
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 1,
|
||||||
|
"backFaceCulling": true,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 46,
|
||||||
|
"plugins": {
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"scripts": [
|
||||||
|
{
|
||||||
|
"enabled": true,
|
||||||
|
"key": "scripts/editorScripts/BaseComponent.ts",
|
||||||
|
"values": {
|
||||||
|
"baseGlbPath": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Path to base GLB model",
|
||||||
|
"value": ""
|
||||||
|
},
|
||||||
|
"landingGlbPath": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Path to landing zone GLB",
|
||||||
|
"value": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"_id": "7741fd66-a746-4f78-a7fd-5f8f404b610c"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
-1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,207 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "asteroid.glb",
|
||||||
|
"id": "c8ccf36e-90e4-4cef-bd6c-f9856ae91783",
|
||||||
|
"uniqueId": 1764789858421,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotationQuaternion": [
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
100,
|
||||||
|
100,
|
||||||
|
-100
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 1,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"materialUniqueId": 46,
|
||||||
|
"materialId": "default material",
|
||||||
|
"metadata": {},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 1,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"applyFog": true
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"diffuse": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"specular": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"specularPower": 64,
|
||||||
|
"useAlphaFromDiffuseTexture": false,
|
||||||
|
"useEmissiveAsIllumination": false,
|
||||||
|
"linkEmissiveWithDiffuse": false,
|
||||||
|
"useSpecularOverAlpha": false,
|
||||||
|
"useReflectionOverAlpha": false,
|
||||||
|
"disableLighting": false,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 0.98,
|
||||||
|
"invertRefractionY": true,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useReflectionFresnelFromSpecular": false,
|
||||||
|
"useGlossinessFromSpecularMapAlpha": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "default material",
|
||||||
|
"name": "default material",
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 1,
|
||||||
|
"backFaceCulling": true,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 46,
|
||||||
|
"plugins": {
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
-1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,426 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "Ship_primitive2",
|
||||||
|
"id": "cbee3b60-c52a-451e-8a43-ddeccb72c2e6",
|
||||||
|
"uniqueId": 1764787012175,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 0,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"geometryUniqueId": 1764787012182,
|
||||||
|
"geometryId": "4cda27fd-eed5-4d1a-b69a-a10585be394d",
|
||||||
|
"subMeshes": null,
|
||||||
|
"materialUniqueId": 1764787012183,
|
||||||
|
"materialId": "a37af4ed-0bc4-4e4b-bee9-63cecf56c25c",
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764787012177
|
||||||
|
},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 1,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"applyFog": true,
|
||||||
|
"delayLoadingFile": "assets/example.scene/geometries/4cda27fd-eed5-4d1a-b69a-a10585be394d.babylonbinarymeshdata",
|
||||||
|
"boundingBoxMaximum": [
|
||||||
|
0.21567727625370026,
|
||||||
|
0.7399396300315857,
|
||||||
|
4.235613822937012
|
||||||
|
],
|
||||||
|
"boundingBoxMinimum": [
|
||||||
|
-0.2839681804180145,
|
||||||
|
0.23974217474460602,
|
||||||
|
4.230499744415283
|
||||||
|
],
|
||||||
|
"_binaryInfo": {
|
||||||
|
"positionsAttrDesc": {
|
||||||
|
"count": 12,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 0,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"normalsAttrDesc": {
|
||||||
|
"count": 12,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 48,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"uvsAttrDesc": {
|
||||||
|
"count": 8,
|
||||||
|
"stride": 2,
|
||||||
|
"offset": 96,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"indicesAttrDesc": {
|
||||||
|
"count": 6,
|
||||||
|
"stride": 1,
|
||||||
|
"offset": 128,
|
||||||
|
"dataType": 0
|
||||||
|
},
|
||||||
|
"subMeshesAttrDesc": {
|
||||||
|
"count": 1,
|
||||||
|
"stride": 5,
|
||||||
|
"offset": 152,
|
||||||
|
"dataType": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"positions": null,
|
||||||
|
"normals": null,
|
||||||
|
"uvs": null,
|
||||||
|
"hasUVs": true,
|
||||||
|
"indices": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"directIntensity": 1,
|
||||||
|
"emissiveIntensity": 1,
|
||||||
|
"environmentIntensity": 1,
|
||||||
|
"specularIntensity": 1,
|
||||||
|
"disableBumpMap": false,
|
||||||
|
"ambientTextureStrength": 1,
|
||||||
|
"ambientTextureImpactOnAnalyticalLights": 0,
|
||||||
|
"metallic": 0,
|
||||||
|
"roughness": 0.5,
|
||||||
|
"metallicF0Factor": 1,
|
||||||
|
"metallicReflectanceColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useOnlyMetallicFromMetallicReflectanceTexture": false,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"albedo": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"baseWeight": 1,
|
||||||
|
"reflectivity": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"reflection": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"microSurface": 1,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useAlphaFromAlbedoTexture": false,
|
||||||
|
"forceAlphaTest": false,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useSpecularOverAlpha": true,
|
||||||
|
"useMicroSurfaceFromReflectivityMapAlpha": false,
|
||||||
|
"useRoughnessFromMetallicTextureAlpha": true,
|
||||||
|
"useRoughnessFromMetallicTextureGreen": false,
|
||||||
|
"useMetallnessFromMetallicTextureBlue": false,
|
||||||
|
"useAmbientOcclusionFromMetallicTextureRed": false,
|
||||||
|
"useAmbientInGrayScale": false,
|
||||||
|
"useAutoMicroSurfaceFromReflectivityMap": false,
|
||||||
|
"usePhysicalLightFalloff": true,
|
||||||
|
"useGLTFLightFalloff": false,
|
||||||
|
"useRadianceOverAlpha": true,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"disableLighting": false,
|
||||||
|
"forceIrradianceInFragment": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": true,
|
||||||
|
"useAlphaFresnel": false,
|
||||||
|
"useLinearAlphaFresnel": false,
|
||||||
|
"forceNormalForward": false,
|
||||||
|
"enableSpecularAntiAliasing": true,
|
||||||
|
"useHorizonOcclusion": true,
|
||||||
|
"useRadianceOcclusion": true,
|
||||||
|
"unlit": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "a37af4ed-0bc4-4e4b-bee9-63cecf56c25c",
|
||||||
|
"name": "Screen",
|
||||||
|
"metadata": {},
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 1,
|
||||||
|
"backFaceCulling": false,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"transparencyMode": 0,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 1764787012183,
|
||||||
|
"plugins": {
|
||||||
|
"PBRBRDFConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"useEnergyConservation": true,
|
||||||
|
"useSmithVisibilityHeightCorrelated": true,
|
||||||
|
"useSphericalHarmonics": true,
|
||||||
|
"useSpecularGlossinessInputEnergyConservation": true,
|
||||||
|
"mixIblRadianceWithIrradiance": true,
|
||||||
|
"useLegacySpecularEnergyConservation": true,
|
||||||
|
"baseDiffuseModel": 0,
|
||||||
|
"dielectricSpecularModel": 0,
|
||||||
|
"conductorSpecularModel": 0,
|
||||||
|
"name": "PBRBRDF",
|
||||||
|
"priority": 90,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRClearCoatConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"remapF0OnInterfaceChange": true,
|
||||||
|
"isTintEnabled": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"tintThickness": 1,
|
||||||
|
"name": "PBRClearCoat",
|
||||||
|
"priority": 100,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRIridescenceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"minimumThickness": 100,
|
||||||
|
"maximumThickness": 400,
|
||||||
|
"indexOfRefraction": 1.3,
|
||||||
|
"name": "PBRIridescence",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRAnisotropicConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"direction": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"legacy": false,
|
||||||
|
"name": "PBRAnisotropic",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSheenConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"linkSheenWithAlbedo": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"color": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"albedoScaling": false,
|
||||||
|
"name": "Sheen",
|
||||||
|
"priority": 120,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSubSurfaceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isRefractionEnabled": false,
|
||||||
|
"isTranslucencyEnabled": false,
|
||||||
|
"isDispersionEnabled": false,
|
||||||
|
"isScatteringEnabled": false,
|
||||||
|
"_scatteringDiffusionProfileIndex": 0,
|
||||||
|
"refractionIntensity": 1,
|
||||||
|
"translucencyIntensity": 1,
|
||||||
|
"useAlbedoToTintRefraction": false,
|
||||||
|
"useAlbedoToTintTranslucency": false,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"_volumeIndexOfRefraction": -1,
|
||||||
|
"invertRefractionY": false,
|
||||||
|
"linkRefractionWithTransparency": false,
|
||||||
|
"minimumThickness": 0,
|
||||||
|
"maximumThickness": 1,
|
||||||
|
"useThicknessAsDepth": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"dispersion": 0,
|
||||||
|
"diffusionDistance": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useMaskFromThicknessTexture": false,
|
||||||
|
"useGltfStyleTextures": true,
|
||||||
|
"applyAlbedoAfterSubSurface": false,
|
||||||
|
"legacyTranslucency": false,
|
||||||
|
"name": "PBRSubSurface",
|
||||||
|
"priority": 130,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": true
|
||||||
|
},
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customType": "BABYLON.PBRMaterial"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"geometries": {
|
||||||
|
"boxes": [],
|
||||||
|
"spheres": [],
|
||||||
|
"cylinders": [],
|
||||||
|
"toruses": [],
|
||||||
|
"grounds": [],
|
||||||
|
"planes": [],
|
||||||
|
"torusKnots": [],
|
||||||
|
"vertexData": []
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764787012177
|
||||||
|
},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
1.6247152644956515,
|
||||||
|
0,
|
||||||
|
4.08643597401238e-7,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1.4727547823314542,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
5.293994474577842e-7,
|
||||||
|
0,
|
||||||
|
-1.2541182156960042,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
-0.9408809412868501,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,526 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "Base",
|
||||||
|
"id": "df3bdc41-8314-45f8-9add-ccfd1d06451f",
|
||||||
|
"uniqueId": 1764786749144,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
-8.583544731140137,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotationQuaternion": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
33.146690368652344,
|
||||||
|
1,
|
||||||
|
37.254390716552734
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 0,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"geometryUniqueId": 1764786749146,
|
||||||
|
"geometryId": "101bd857-f8e8-4230-a021-5d519fefb26c",
|
||||||
|
"subMeshes": null,
|
||||||
|
"materialUniqueId": 1764786749147,
|
||||||
|
"materialId": "00d2631a-e346-4509-b0bb-64e0467c0622",
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764786749143
|
||||||
|
},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 0,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"renderOverlay": false,
|
||||||
|
"applyFog": true,
|
||||||
|
"delayLoadingFile": "assets/example.scene/geometries/101bd857-f8e8-4230-a021-5d519fefb26c.babylonbinarymeshdata",
|
||||||
|
"boundingBoxMaximum": [
|
||||||
|
1,
|
||||||
|
0.7045964002609253,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"boundingBoxMinimum": [
|
||||||
|
-1,
|
||||||
|
-2.1139473915100098,
|
||||||
|
-1
|
||||||
|
],
|
||||||
|
"_binaryInfo": {
|
||||||
|
"positionsAttrDesc": {
|
||||||
|
"count": 264,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 0,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"normalsAttrDesc": {
|
||||||
|
"count": 264,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 1056,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"uvsAttrDesc": {
|
||||||
|
"count": 176,
|
||||||
|
"stride": 2,
|
||||||
|
"offset": 2112,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"indicesAttrDesc": {
|
||||||
|
"count": 132,
|
||||||
|
"stride": 1,
|
||||||
|
"offset": 2816,
|
||||||
|
"dataType": 0
|
||||||
|
},
|
||||||
|
"subMeshesAttrDesc": {
|
||||||
|
"count": 1,
|
||||||
|
"stride": 5,
|
||||||
|
"offset": 3344,
|
||||||
|
"dataType": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"positions": null,
|
||||||
|
"normals": null,
|
||||||
|
"uvs": null,
|
||||||
|
"hasUVs": true,
|
||||||
|
"indices": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"directIntensity": 1,
|
||||||
|
"emissiveIntensity": 1.399999976158142,
|
||||||
|
"environmentIntensity": 1,
|
||||||
|
"specularIntensity": 1,
|
||||||
|
"disableBumpMap": false,
|
||||||
|
"albedoTexture": {
|
||||||
|
"tags": null,
|
||||||
|
"url": "assets/editor-generated_9f6c774a10727dd45e1e2122a14a3957.jpg",
|
||||||
|
"uOffset": 0,
|
||||||
|
"vOffset": 0,
|
||||||
|
"uScale": 1,
|
||||||
|
"vScale": -1,
|
||||||
|
"uAng": 0,
|
||||||
|
"vAng": 0,
|
||||||
|
"wAng": 0,
|
||||||
|
"uRotationCenter": 0.5,
|
||||||
|
"vRotationCenter": 0.5,
|
||||||
|
"wRotationCenter": 0.5,
|
||||||
|
"homogeneousRotationInUVTransform": false,
|
||||||
|
"isBlocking": true,
|
||||||
|
"name": "assets/editor-generated_9f6c774a10727dd45e1e2122a14a3957.jpg",
|
||||||
|
"metadata": {
|
||||||
|
"baseSize": {
|
||||||
|
"width": 2048,
|
||||||
|
"height": 2048
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hasAlpha": false,
|
||||||
|
"getAlphaFromRGB": false,
|
||||||
|
"level": 1,
|
||||||
|
"coordinatesIndex": 0,
|
||||||
|
"optimizeUVAllocation": true,
|
||||||
|
"coordinatesMode": 0,
|
||||||
|
"wrapU": 1,
|
||||||
|
"wrapV": 1,
|
||||||
|
"wrapR": 1,
|
||||||
|
"anisotropicFilteringLevel": 4,
|
||||||
|
"isCube": false,
|
||||||
|
"is3D": false,
|
||||||
|
"is2DArray": false,
|
||||||
|
"gammaSpace": false,
|
||||||
|
"invertZ": false,
|
||||||
|
"lodLevelInAlpha": false,
|
||||||
|
"lodGenerationOffset": 0,
|
||||||
|
"lodGenerationScale": 0,
|
||||||
|
"linearSpecularLOD": false,
|
||||||
|
"isRenderTarget": false,
|
||||||
|
"animations": [],
|
||||||
|
"invertY": true,
|
||||||
|
"samplingMode": 3,
|
||||||
|
"_useSRGBBuffer": false,
|
||||||
|
"internalTextureLabel": "/Users/michaelmainguy/WebstormProjects/space-game/gameEditor",
|
||||||
|
"noMipmap": false
|
||||||
|
},
|
||||||
|
"ambientTextureStrength": 1,
|
||||||
|
"ambientTextureImpactOnAnalyticalLights": 0,
|
||||||
|
"emissiveTexture": {
|
||||||
|
"tags": null,
|
||||||
|
"url": "assets/editor-generated_9f6c774a10727dd45e1e2122a14a3957.jpg",
|
||||||
|
"uOffset": 0,
|
||||||
|
"vOffset": 0,
|
||||||
|
"uScale": 1,
|
||||||
|
"vScale": -1,
|
||||||
|
"uAng": 0,
|
||||||
|
"vAng": 0,
|
||||||
|
"wAng": 0,
|
||||||
|
"uRotationCenter": 0.5,
|
||||||
|
"vRotationCenter": 0.5,
|
||||||
|
"wRotationCenter": 0.5,
|
||||||
|
"homogeneousRotationInUVTransform": false,
|
||||||
|
"isBlocking": true,
|
||||||
|
"name": "assets/editor-generated_9f6c774a10727dd45e1e2122a14a3957.jpg",
|
||||||
|
"metadata": {
|
||||||
|
"baseSize": {
|
||||||
|
"width": 2048,
|
||||||
|
"height": 2048
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hasAlpha": false,
|
||||||
|
"getAlphaFromRGB": false,
|
||||||
|
"level": 1,
|
||||||
|
"coordinatesIndex": 0,
|
||||||
|
"optimizeUVAllocation": true,
|
||||||
|
"coordinatesMode": 0,
|
||||||
|
"wrapU": 1,
|
||||||
|
"wrapV": 1,
|
||||||
|
"wrapR": 1,
|
||||||
|
"anisotropicFilteringLevel": 4,
|
||||||
|
"isCube": false,
|
||||||
|
"is3D": false,
|
||||||
|
"is2DArray": false,
|
||||||
|
"gammaSpace": false,
|
||||||
|
"invertZ": false,
|
||||||
|
"lodLevelInAlpha": false,
|
||||||
|
"lodGenerationOffset": 0,
|
||||||
|
"lodGenerationScale": 0,
|
||||||
|
"linearSpecularLOD": false,
|
||||||
|
"isRenderTarget": false,
|
||||||
|
"animations": [],
|
||||||
|
"invertY": true,
|
||||||
|
"samplingMode": 3,
|
||||||
|
"_useSRGBBuffer": false,
|
||||||
|
"internalTextureLabel": "/Users/michaelmainguy/WebstormProjects/space-game/gameEditor",
|
||||||
|
"noMipmap": false
|
||||||
|
},
|
||||||
|
"metallic": 0,
|
||||||
|
"roughness": 0.5,
|
||||||
|
"metallicF0Factor": 1,
|
||||||
|
"metallicReflectanceColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useOnlyMetallicFromMetallicReflectanceTexture": false,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"albedo": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"baseWeight": 1,
|
||||||
|
"reflectivity": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"reflection": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"microSurface": 1,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useAlphaFromAlbedoTexture": false,
|
||||||
|
"forceAlphaTest": false,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useSpecularOverAlpha": true,
|
||||||
|
"useMicroSurfaceFromReflectivityMapAlpha": false,
|
||||||
|
"useRoughnessFromMetallicTextureAlpha": true,
|
||||||
|
"useRoughnessFromMetallicTextureGreen": false,
|
||||||
|
"useMetallnessFromMetallicTextureBlue": false,
|
||||||
|
"useAmbientOcclusionFromMetallicTextureRed": false,
|
||||||
|
"useAmbientInGrayScale": false,
|
||||||
|
"useAutoMicroSurfaceFromReflectivityMap": false,
|
||||||
|
"usePhysicalLightFalloff": true,
|
||||||
|
"useGLTFLightFalloff": false,
|
||||||
|
"useRadianceOverAlpha": true,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"disableLighting": false,
|
||||||
|
"forceIrradianceInFragment": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": true,
|
||||||
|
"useAlphaFresnel": false,
|
||||||
|
"useLinearAlphaFresnel": false,
|
||||||
|
"forceNormalForward": false,
|
||||||
|
"enableSpecularAntiAliasing": true,
|
||||||
|
"useHorizonOcclusion": true,
|
||||||
|
"useRadianceOcclusion": true,
|
||||||
|
"unlit": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "00d2631a-e346-4509-b0bb-64e0467c0622",
|
||||||
|
"name": "Material.001",
|
||||||
|
"metadata": {},
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 1,
|
||||||
|
"backFaceCulling": false,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"transparencyMode": 0,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 1764786749147,
|
||||||
|
"plugins": {
|
||||||
|
"PBRBRDFConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"useEnergyConservation": true,
|
||||||
|
"useSmithVisibilityHeightCorrelated": true,
|
||||||
|
"useSphericalHarmonics": true,
|
||||||
|
"useSpecularGlossinessInputEnergyConservation": true,
|
||||||
|
"mixIblRadianceWithIrradiance": true,
|
||||||
|
"useLegacySpecularEnergyConservation": true,
|
||||||
|
"baseDiffuseModel": 0,
|
||||||
|
"dielectricSpecularModel": 0,
|
||||||
|
"conductorSpecularModel": 0,
|
||||||
|
"name": "PBRBRDF",
|
||||||
|
"priority": 90,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRClearCoatConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"remapF0OnInterfaceChange": true,
|
||||||
|
"isTintEnabled": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"tintThickness": 1,
|
||||||
|
"name": "PBRClearCoat",
|
||||||
|
"priority": 100,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRIridescenceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"minimumThickness": 100,
|
||||||
|
"maximumThickness": 400,
|
||||||
|
"indexOfRefraction": 1.3,
|
||||||
|
"name": "PBRIridescence",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRAnisotropicConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"direction": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"legacy": false,
|
||||||
|
"name": "PBRAnisotropic",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSheenConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"linkSheenWithAlbedo": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"color": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"albedoScaling": false,
|
||||||
|
"name": "Sheen",
|
||||||
|
"priority": 120,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSubSurfaceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isRefractionEnabled": false,
|
||||||
|
"isTranslucencyEnabled": false,
|
||||||
|
"isDispersionEnabled": false,
|
||||||
|
"isScatteringEnabled": false,
|
||||||
|
"_scatteringDiffusionProfileIndex": 0,
|
||||||
|
"refractionIntensity": 1,
|
||||||
|
"translucencyIntensity": 1,
|
||||||
|
"useAlbedoToTintRefraction": false,
|
||||||
|
"useAlbedoToTintTranslucency": false,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"_volumeIndexOfRefraction": -1,
|
||||||
|
"invertRefractionY": false,
|
||||||
|
"linkRefractionWithTransparency": false,
|
||||||
|
"minimumThickness": 0,
|
||||||
|
"maximumThickness": 1,
|
||||||
|
"useThicknessAsDepth": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"dispersion": 0,
|
||||||
|
"diffusionDistance": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useMaskFromThicknessTexture": false,
|
||||||
|
"useGltfStyleTextures": true,
|
||||||
|
"applyAlbedoAfterSubSurface": false,
|
||||||
|
"legacyTranslucency": false,
|
||||||
|
"name": "PBRSubSurface",
|
||||||
|
"priority": 130,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": true
|
||||||
|
},
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customType": "BABYLON.PBRMaterial"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"geometries": {
|
||||||
|
"boxes": [],
|
||||||
|
"spheres": [],
|
||||||
|
"cylinders": [],
|
||||||
|
"toruses": [],
|
||||||
|
"grounds": [],
|
||||||
|
"planes": [],
|
||||||
|
"torusKnots": [],
|
||||||
|
"vertexData": []
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764786749143
|
||||||
|
},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
-0.030168924525439955,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0.026842473618973555,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
8.583544731140138,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,524 @@
|
|||||||
|
{
|
||||||
|
"meshes": [
|
||||||
|
{
|
||||||
|
"name": "Ship_primitive0",
|
||||||
|
"id": "e76fcb83-e1df-4c7c-92cd-65b601ee9bba",
|
||||||
|
"uniqueId": 1764787012173,
|
||||||
|
"type": "Mesh",
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"isVisible": true,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"pickable": true,
|
||||||
|
"receiveShadows": true,
|
||||||
|
"billboardMode": 0,
|
||||||
|
"visibility": 1,
|
||||||
|
"alwaysSelectAsActiveMesh": false,
|
||||||
|
"checkCollisions": false,
|
||||||
|
"ellipsoid": [
|
||||||
|
0.5,
|
||||||
|
1,
|
||||||
|
0.5
|
||||||
|
],
|
||||||
|
"ellipsoidOffset": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"doNotSyncBoundingInfo": false,
|
||||||
|
"isBlocker": false,
|
||||||
|
"sideOrientation": 0,
|
||||||
|
"isUnIndexed": false,
|
||||||
|
"geometryUniqueId": 1764787012178,
|
||||||
|
"geometryId": "5a938545-3b1e-40a5-9ed3-a545ced11fd4",
|
||||||
|
"subMeshes": null,
|
||||||
|
"materialUniqueId": 1764787012179,
|
||||||
|
"materialId": "75fae723-6ee6-443b-ba23-704d76ebdb7b",
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764787012177
|
||||||
|
},
|
||||||
|
"instances": [],
|
||||||
|
"animations": [],
|
||||||
|
"ranges": [],
|
||||||
|
"layerMask": 268435455,
|
||||||
|
"alphaIndex": 1.7976931348623157e+308,
|
||||||
|
"hasVertexAlpha": false,
|
||||||
|
"overlayAlpha": 1,
|
||||||
|
"overlayColor": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"applyFog": true,
|
||||||
|
"delayLoadingFile": "assets/example.scene/geometries/5a938545-3b1e-40a5-9ed3-a545ced11fd4.babylonbinarymeshdata",
|
||||||
|
"boundingBoxMaximum": [
|
||||||
|
11.43801212310791,
|
||||||
|
2.162097454071045,
|
||||||
|
8.191577911376953
|
||||||
|
],
|
||||||
|
"boundingBoxMinimum": [
|
||||||
|
-11.43801212310791,
|
||||||
|
-1.028866171836853,
|
||||||
|
-7.255166530609131
|
||||||
|
],
|
||||||
|
"_binaryInfo": {
|
||||||
|
"positionsAttrDesc": {
|
||||||
|
"count": 2790,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 0,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"normalsAttrDesc": {
|
||||||
|
"count": 2790,
|
||||||
|
"stride": 3,
|
||||||
|
"offset": 11160,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"uvsAttrDesc": {
|
||||||
|
"count": 1860,
|
||||||
|
"stride": 2,
|
||||||
|
"offset": 22320,
|
||||||
|
"dataType": 1
|
||||||
|
},
|
||||||
|
"indicesAttrDesc": {
|
||||||
|
"count": 1284,
|
||||||
|
"stride": 1,
|
||||||
|
"offset": 29760,
|
||||||
|
"dataType": 0
|
||||||
|
},
|
||||||
|
"subMeshesAttrDesc": {
|
||||||
|
"count": 1,
|
||||||
|
"stride": 5,
|
||||||
|
"offset": 34896,
|
||||||
|
"dataType": 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"positions": null,
|
||||||
|
"normals": null,
|
||||||
|
"uvs": null,
|
||||||
|
"hasUVs": true,
|
||||||
|
"indices": null
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"transformNodes": [],
|
||||||
|
"cameras": [],
|
||||||
|
"lights": [],
|
||||||
|
"materials": [
|
||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"directIntensity": 1,
|
||||||
|
"emissiveIntensity": 1.8999998569488525,
|
||||||
|
"environmentIntensity": 1,
|
||||||
|
"specularIntensity": 1,
|
||||||
|
"disableBumpMap": false,
|
||||||
|
"albedoTexture": {
|
||||||
|
"tags": null,
|
||||||
|
"url": "assets/editor-generated_407fefb1bb1a53ce6f7be55ea1b07228.jpg",
|
||||||
|
"uOffset": 0,
|
||||||
|
"vOffset": 0,
|
||||||
|
"uScale": 1,
|
||||||
|
"vScale": -1,
|
||||||
|
"uAng": 0,
|
||||||
|
"vAng": 0,
|
||||||
|
"wAng": 0,
|
||||||
|
"uRotationCenter": 0.5,
|
||||||
|
"vRotationCenter": 0.5,
|
||||||
|
"wRotationCenter": 0.5,
|
||||||
|
"homogeneousRotationInUVTransform": false,
|
||||||
|
"isBlocking": true,
|
||||||
|
"name": "assets/editor-generated_407fefb1bb1a53ce6f7be55ea1b07228.jpg",
|
||||||
|
"metadata": {
|
||||||
|
"baseSize": {
|
||||||
|
"width": 4096,
|
||||||
|
"height": 4096
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hasAlpha": false,
|
||||||
|
"getAlphaFromRGB": false,
|
||||||
|
"level": 1,
|
||||||
|
"coordinatesIndex": 1,
|
||||||
|
"optimizeUVAllocation": true,
|
||||||
|
"coordinatesMode": 0,
|
||||||
|
"wrapU": 1,
|
||||||
|
"wrapV": 1,
|
||||||
|
"wrapR": 1,
|
||||||
|
"anisotropicFilteringLevel": 4,
|
||||||
|
"isCube": false,
|
||||||
|
"is3D": false,
|
||||||
|
"is2DArray": false,
|
||||||
|
"gammaSpace": false,
|
||||||
|
"invertZ": false,
|
||||||
|
"lodLevelInAlpha": false,
|
||||||
|
"lodGenerationOffset": 0,
|
||||||
|
"lodGenerationScale": 0,
|
||||||
|
"linearSpecularLOD": false,
|
||||||
|
"isRenderTarget": false,
|
||||||
|
"animations": [],
|
||||||
|
"invertY": true,
|
||||||
|
"samplingMode": 3,
|
||||||
|
"_useSRGBBuffer": false,
|
||||||
|
"internalTextureLabel": "/Users/michaelmainguy/WebstormProjects/space-game/gameEditor",
|
||||||
|
"noMipmap": false
|
||||||
|
},
|
||||||
|
"ambientTextureStrength": 1,
|
||||||
|
"ambientTextureImpactOnAnalyticalLights": 0,
|
||||||
|
"emissiveTexture": {
|
||||||
|
"tags": null,
|
||||||
|
"url": "assets/editor-generated_407fefb1bb1a53ce6f7be55ea1b07228.jpg",
|
||||||
|
"uOffset": 0,
|
||||||
|
"vOffset": 0,
|
||||||
|
"uScale": 1,
|
||||||
|
"vScale": -1,
|
||||||
|
"uAng": 0,
|
||||||
|
"vAng": 0,
|
||||||
|
"wAng": 0,
|
||||||
|
"uRotationCenter": 0.5,
|
||||||
|
"vRotationCenter": 0.5,
|
||||||
|
"wRotationCenter": 0.5,
|
||||||
|
"homogeneousRotationInUVTransform": false,
|
||||||
|
"isBlocking": true,
|
||||||
|
"name": "assets/editor-generated_407fefb1bb1a53ce6f7be55ea1b07228.jpg",
|
||||||
|
"metadata": {
|
||||||
|
"baseSize": {
|
||||||
|
"width": 4096,
|
||||||
|
"height": 4096
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hasAlpha": false,
|
||||||
|
"getAlphaFromRGB": false,
|
||||||
|
"level": 1,
|
||||||
|
"coordinatesIndex": 1,
|
||||||
|
"optimizeUVAllocation": true,
|
||||||
|
"coordinatesMode": 0,
|
||||||
|
"wrapU": 1,
|
||||||
|
"wrapV": 1,
|
||||||
|
"wrapR": 1,
|
||||||
|
"anisotropicFilteringLevel": 4,
|
||||||
|
"isCube": false,
|
||||||
|
"is3D": false,
|
||||||
|
"is2DArray": false,
|
||||||
|
"gammaSpace": false,
|
||||||
|
"invertZ": false,
|
||||||
|
"lodLevelInAlpha": false,
|
||||||
|
"lodGenerationOffset": 0,
|
||||||
|
"lodGenerationScale": 0,
|
||||||
|
"linearSpecularLOD": false,
|
||||||
|
"isRenderTarget": false,
|
||||||
|
"animations": [],
|
||||||
|
"invertY": true,
|
||||||
|
"samplingMode": 3,
|
||||||
|
"_useSRGBBuffer": false,
|
||||||
|
"internalTextureLabel": "/Users/michaelmainguy/WebstormProjects/space-game/gameEditor",
|
||||||
|
"noMipmap": false
|
||||||
|
},
|
||||||
|
"metallic": 0.5344085693359375,
|
||||||
|
"roughness": 0.4500977396965027,
|
||||||
|
"metallicF0Factor": 1,
|
||||||
|
"metallicReflectanceColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useOnlyMetallicFromMetallicReflectanceTexture": false,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"albedo": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"baseWeight": 1,
|
||||||
|
"reflectivity": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"reflection": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"microSurface": 1,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useAlphaFromAlbedoTexture": false,
|
||||||
|
"forceAlphaTest": false,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useSpecularOverAlpha": true,
|
||||||
|
"useMicroSurfaceFromReflectivityMapAlpha": false,
|
||||||
|
"useRoughnessFromMetallicTextureAlpha": true,
|
||||||
|
"useRoughnessFromMetallicTextureGreen": false,
|
||||||
|
"useMetallnessFromMetallicTextureBlue": false,
|
||||||
|
"useAmbientOcclusionFromMetallicTextureRed": false,
|
||||||
|
"useAmbientInGrayScale": false,
|
||||||
|
"useAutoMicroSurfaceFromReflectivityMap": false,
|
||||||
|
"usePhysicalLightFalloff": true,
|
||||||
|
"useGLTFLightFalloff": false,
|
||||||
|
"useRadianceOverAlpha": true,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"disableLighting": false,
|
||||||
|
"forceIrradianceInFragment": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": true,
|
||||||
|
"useAlphaFresnel": false,
|
||||||
|
"useLinearAlphaFresnel": false,
|
||||||
|
"forceNormalForward": false,
|
||||||
|
"enableSpecularAntiAliasing": true,
|
||||||
|
"useHorizonOcclusion": true,
|
||||||
|
"useRadianceOcclusion": true,
|
||||||
|
"unlit": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "75fae723-6ee6-443b-ba23-704d76ebdb7b",
|
||||||
|
"name": "Hull",
|
||||||
|
"metadata": {},
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 1,
|
||||||
|
"backFaceCulling": false,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"transparencyMode": 0,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 1764787012179,
|
||||||
|
"plugins": {
|
||||||
|
"PBRBRDFConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"useEnergyConservation": true,
|
||||||
|
"useSmithVisibilityHeightCorrelated": true,
|
||||||
|
"useSphericalHarmonics": true,
|
||||||
|
"useSpecularGlossinessInputEnergyConservation": true,
|
||||||
|
"mixIblRadianceWithIrradiance": true,
|
||||||
|
"useLegacySpecularEnergyConservation": true,
|
||||||
|
"baseDiffuseModel": 0,
|
||||||
|
"dielectricSpecularModel": 0,
|
||||||
|
"conductorSpecularModel": 0,
|
||||||
|
"name": "PBRBRDF",
|
||||||
|
"priority": 90,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRClearCoatConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"remapF0OnInterfaceChange": true,
|
||||||
|
"isTintEnabled": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"tintThickness": 1,
|
||||||
|
"name": "PBRClearCoat",
|
||||||
|
"priority": 100,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRIridescenceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"minimumThickness": 100,
|
||||||
|
"maximumThickness": 400,
|
||||||
|
"indexOfRefraction": 1.3,
|
||||||
|
"name": "PBRIridescence",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRAnisotropicConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"direction": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"legacy": false,
|
||||||
|
"name": "PBRAnisotropic",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSheenConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"linkSheenWithAlbedo": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"color": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"albedoScaling": false,
|
||||||
|
"name": "Sheen",
|
||||||
|
"priority": 120,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSubSurfaceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isRefractionEnabled": false,
|
||||||
|
"isTranslucencyEnabled": false,
|
||||||
|
"isDispersionEnabled": false,
|
||||||
|
"isScatteringEnabled": false,
|
||||||
|
"_scatteringDiffusionProfileIndex": 0,
|
||||||
|
"refractionIntensity": 1,
|
||||||
|
"translucencyIntensity": 1,
|
||||||
|
"useAlbedoToTintRefraction": false,
|
||||||
|
"useAlbedoToTintTranslucency": false,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"_volumeIndexOfRefraction": -1,
|
||||||
|
"invertRefractionY": false,
|
||||||
|
"linkRefractionWithTransparency": false,
|
||||||
|
"minimumThickness": 0,
|
||||||
|
"maximumThickness": 1,
|
||||||
|
"useThicknessAsDepth": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"dispersion": 0,
|
||||||
|
"diffusionDistance": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useMaskFromThicknessTexture": false,
|
||||||
|
"useGltfStyleTextures": true,
|
||||||
|
"applyAlbedoAfterSubSurface": false,
|
||||||
|
"legacyTranslucency": false,
|
||||||
|
"name": "PBRSubSurface",
|
||||||
|
"priority": 130,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": true
|
||||||
|
},
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customType": "BABYLON.PBRMaterial"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"geometries": {
|
||||||
|
"boxes": [],
|
||||||
|
"spheres": [],
|
||||||
|
"cylinders": [],
|
||||||
|
"toruses": [],
|
||||||
|
"grounds": [],
|
||||||
|
"planes": [],
|
||||||
|
"torusKnots": [],
|
||||||
|
"vertexData": []
|
||||||
|
},
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764787012177
|
||||||
|
},
|
||||||
|
"basePoseMatrix": [
|
||||||
|
1.6247152644956515,
|
||||||
|
0,
|
||||||
|
4.08643597401238e-7,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1.4727547823314542,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
5.293994474577842e-7,
|
||||||
|
0,
|
||||||
|
-1.2541182156960042,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
-0.9408809412868501,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
}
|
||||||
@ -0,0 +1,58 @@
|
|||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"position": [
|
||||||
|
0,
|
||||||
|
0.6388578414916992,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotation": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"rotationQuaternion": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"scaling": [
|
||||||
|
0.6154924631118774,
|
||||||
|
0.678999662399292,
|
||||||
|
0.7973729968070984
|
||||||
|
],
|
||||||
|
"billboardMode": 0,
|
||||||
|
"scalingDeterminant": 1,
|
||||||
|
"infiniteDistance": false,
|
||||||
|
"ignoreNonUniformScaling": false,
|
||||||
|
"reIntegrateRotationIntoRotationQuaternion": false,
|
||||||
|
"name": "Ship",
|
||||||
|
"id": "315c338c-b9a0-4509-839c-8802b52dc0b3",
|
||||||
|
"state": "",
|
||||||
|
"metadata": {
|
||||||
|
"parentId": 1764787012172
|
||||||
|
},
|
||||||
|
"type": "TransformNode",
|
||||||
|
"uniqueId": 1764787012177,
|
||||||
|
"localMatrix": [
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"isEnabled": true,
|
||||||
|
"animations": [],
|
||||||
|
"ranges": []
|
||||||
|
}
|
||||||
BIN
gameEditor/assets/example.scene/preview.png
Normal file
|
After Width: | Height: | Size: 41 KiB |
BIN
gameEditor/assets/ship.glb
Normal file
17
gameEditor/index.html
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<meta name="theme-color" content="#000000" />
|
||||||
|
<title>VanillaJS App</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
|
<main id="app" class="flex w-screen h-screen flex-col items-center justify-between">
|
||||||
|
<canvas id="canvas" class="w-full h-full outline-none select-none"></canvas>
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<script src="/src/main.ts" type="module"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
1802
gameEditor/package-lock.json
generated
Normal file
28
gameEditor/package.json
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
{
|
||||||
|
"name": "babylonjs-editor-vanillajs-template",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"description": "",
|
||||||
|
"type": "module",
|
||||||
|
"private": true,
|
||||||
|
"scripts": {
|
||||||
|
"start": "vite",
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"serve": "vite preview"
|
||||||
|
},
|
||||||
|
"license": "MIT",
|
||||||
|
"devDependencies": {
|
||||||
|
"@tailwindcss/vite": "^4.0.7",
|
||||||
|
"@types/node": "^22",
|
||||||
|
"tailwindcss": "^4.0.7",
|
||||||
|
"typescript": "^5.7.2",
|
||||||
|
"vite": "^6.4.1"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@babylonjs/core": "8.33.2",
|
||||||
|
"@babylonjs/gui": "8.33.2",
|
||||||
|
"@babylonjs/havok": "1.3.10",
|
||||||
|
"@babylonjs/materials": "8.33.2",
|
||||||
|
"babylonjs-editor-tools": "^5.2.4"
|
||||||
|
}
|
||||||
|
}
|
||||||
12
gameEditor/project.bjseditor
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"plugins": [
|
||||||
|
{
|
||||||
|
"nameOrPath": "/Users/michaelmainguy/WebstormProjects/space-game/bjsEditorPlugin/dist"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"version": "5.2.4",
|
||||||
|
"packageManager": "npm",
|
||||||
|
"lastOpenedScene": "/assets/example.scene",
|
||||||
|
"compressedTexturesEnabled": false,
|
||||||
|
"compressedTexturesEnabledInPreview": false
|
||||||
|
}
|
||||||
BIN
gameEditor/public/scene/assets/albedo.png
Normal file
|
After Width: | Height: | Size: 383 KiB |
BIN
gameEditor/public/scene/assets/amiga.jpg
Normal file
|
After Width: | Height: | Size: 593 B |
BIN
gameEditor/public/scene/assets/country.env
Normal file
303
gameEditor/public/scene/assets/cube.material
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"directIntensity": 1,
|
||||||
|
"emissiveIntensity": 1,
|
||||||
|
"environmentIntensity": 1,
|
||||||
|
"specularIntensity": 1,
|
||||||
|
"disableBumpMap": false,
|
||||||
|
"albedoTexture": {
|
||||||
|
"tags": null,
|
||||||
|
"url": "assets/amiga.jpg",
|
||||||
|
"uOffset": 0,
|
||||||
|
"vOffset": 0,
|
||||||
|
"uScale": 1,
|
||||||
|
"vScale": 1,
|
||||||
|
"uAng": 0,
|
||||||
|
"vAng": 0,
|
||||||
|
"wAng": 0,
|
||||||
|
"uRotationCenter": 0.5,
|
||||||
|
"vRotationCenter": 0.5,
|
||||||
|
"wRotationCenter": 0.5,
|
||||||
|
"homogeneousRotationInUVTransform": false,
|
||||||
|
"isBlocking": true,
|
||||||
|
"name": "assets/amiga.jpg",
|
||||||
|
"metadata": {
|
||||||
|
"baseSize": {
|
||||||
|
"width": 128,
|
||||||
|
"height": 128
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hasAlpha": false,
|
||||||
|
"getAlphaFromRGB": false,
|
||||||
|
"level": 1,
|
||||||
|
"coordinatesIndex": 0,
|
||||||
|
"optimizeUVAllocation": true,
|
||||||
|
"coordinatesMode": 0,
|
||||||
|
"wrapU": 1,
|
||||||
|
"wrapV": 1,
|
||||||
|
"wrapR": 1,
|
||||||
|
"anisotropicFilteringLevel": 4,
|
||||||
|
"isCube": false,
|
||||||
|
"is3D": false,
|
||||||
|
"is2DArray": false,
|
||||||
|
"gammaSpace": true,
|
||||||
|
"invertZ": false,
|
||||||
|
"lodLevelInAlpha": false,
|
||||||
|
"lodGenerationOffset": 0,
|
||||||
|
"lodGenerationScale": 0,
|
||||||
|
"linearSpecularLOD": false,
|
||||||
|
"isRenderTarget": false,
|
||||||
|
"animations": [],
|
||||||
|
"invertY": true,
|
||||||
|
"samplingMode": 3,
|
||||||
|
"_useSRGBBuffer": false,
|
||||||
|
"noMipmap": false
|
||||||
|
},
|
||||||
|
"ambientTextureStrength": 1,
|
||||||
|
"ambientTextureImpactOnAnalyticalLights": 0,
|
||||||
|
"metallic": 0,
|
||||||
|
"roughness": 1,
|
||||||
|
"metallicF0Factor": 1,
|
||||||
|
"metallicReflectanceColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useOnlyMetallicFromMetallicReflectanceTexture": false,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"albedo": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"baseWeight": 1,
|
||||||
|
"reflectivity": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"reflection": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"microSurface": 1,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useAlphaFromAlbedoTexture": false,
|
||||||
|
"forceAlphaTest": false,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useSpecularOverAlpha": true,
|
||||||
|
"useMicroSurfaceFromReflectivityMapAlpha": false,
|
||||||
|
"useRoughnessFromMetallicTextureAlpha": true,
|
||||||
|
"useRoughnessFromMetallicTextureGreen": false,
|
||||||
|
"useMetallnessFromMetallicTextureBlue": false,
|
||||||
|
"useAmbientOcclusionFromMetallicTextureRed": false,
|
||||||
|
"useAmbientInGrayScale": false,
|
||||||
|
"useAutoMicroSurfaceFromReflectivityMap": false,
|
||||||
|
"usePhysicalLightFalloff": true,
|
||||||
|
"useGLTFLightFalloff": false,
|
||||||
|
"useRadianceOverAlpha": true,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"disableLighting": false,
|
||||||
|
"forceIrradianceInFragment": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": false,
|
||||||
|
"useAlphaFresnel": false,
|
||||||
|
"useLinearAlphaFresnel": false,
|
||||||
|
"forceNormalForward": false,
|
||||||
|
"enableSpecularAntiAliasing": false,
|
||||||
|
"useHorizonOcclusion": true,
|
||||||
|
"useRadianceOcclusion": true,
|
||||||
|
"unlit": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "9f2b8769-ac8e-4289-b8a4-171c5b7d3139",
|
||||||
|
"name": "box",
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 1,
|
||||||
|
"backFaceCulling": true,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"sideOrientation": 1,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"transparencyMode": 0,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 1711813856778,
|
||||||
|
"plugins": {
|
||||||
|
"PBRBRDFConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"useEnergyConservation": true,
|
||||||
|
"useSmithVisibilityHeightCorrelated": true,
|
||||||
|
"useSphericalHarmonics": true,
|
||||||
|
"useSpecularGlossinessInputEnergyConservation": true,
|
||||||
|
"mixIblRadianceWithIrradiance": true,
|
||||||
|
"useLegacySpecularEnergyConservation": true,
|
||||||
|
"baseDiffuseModel": 0,
|
||||||
|
"dielectricSpecularModel": 0,
|
||||||
|
"conductorSpecularModel": 0,
|
||||||
|
"name": "PBRBRDF",
|
||||||
|
"priority": 90,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRClearCoatConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"remapF0OnInterfaceChange": true,
|
||||||
|
"isTintEnabled": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"tintThickness": 1,
|
||||||
|
"name": "PBRClearCoat",
|
||||||
|
"priority": 100,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRIridescenceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"minimumThickness": 100,
|
||||||
|
"maximumThickness": 400,
|
||||||
|
"indexOfRefraction": 1.3,
|
||||||
|
"name": "PBRIridescence",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRAnisotropicConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"direction": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"legacy": false,
|
||||||
|
"name": "PBRAnisotropic",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSheenConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"linkSheenWithAlbedo": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"color": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"albedoScaling": false,
|
||||||
|
"name": "Sheen",
|
||||||
|
"priority": 120,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSubSurfaceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isRefractionEnabled": false,
|
||||||
|
"isTranslucencyEnabled": false,
|
||||||
|
"isDispersionEnabled": false,
|
||||||
|
"isScatteringEnabled": false,
|
||||||
|
"_scatteringDiffusionProfileIndex": 0,
|
||||||
|
"refractionIntensity": 1,
|
||||||
|
"translucencyIntensity": 1,
|
||||||
|
"useAlbedoToTintRefraction": false,
|
||||||
|
"useAlbedoToTintTranslucency": false,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"_volumeIndexOfRefraction": -1,
|
||||||
|
"invertRefractionY": false,
|
||||||
|
"linkRefractionWithTransparency": false,
|
||||||
|
"minimumThickness": 0,
|
||||||
|
"maximumThickness": 1,
|
||||||
|
"useThicknessAsDepth": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"dispersion": 0,
|
||||||
|
"diffusionDistance": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useMaskFromThicknessTexture": false,
|
||||||
|
"useGltfStyleTextures": false,
|
||||||
|
"applyAlbedoAfterSubSurface": false,
|
||||||
|
"legacyTranslucency": false,
|
||||||
|
"name": "PBRSubSurface",
|
||||||
|
"priority": 130,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": true
|
||||||
|
},
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customType": "BABYLON.PBRMaterial"
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 465 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 119 KiB |
|
After Width: | Height: | Size: 1.8 MiB |
303
gameEditor/public/scene/assets/floor.material
Normal file
@ -0,0 +1,303 @@
|
|||||||
|
{
|
||||||
|
"tags": null,
|
||||||
|
"directIntensity": 1,
|
||||||
|
"emissiveIntensity": 1,
|
||||||
|
"environmentIntensity": 1,
|
||||||
|
"specularIntensity": 1,
|
||||||
|
"disableBumpMap": false,
|
||||||
|
"albedoTexture": {
|
||||||
|
"tags": null,
|
||||||
|
"url": "assets/albedo.png",
|
||||||
|
"uOffset": 0,
|
||||||
|
"vOffset": 0,
|
||||||
|
"uScale": 500,
|
||||||
|
"vScale": 500,
|
||||||
|
"uAng": 0,
|
||||||
|
"vAng": 0,
|
||||||
|
"wAng": 0,
|
||||||
|
"uRotationCenter": 0.5,
|
||||||
|
"vRotationCenter": 0.5,
|
||||||
|
"wRotationCenter": 0.5,
|
||||||
|
"homogeneousRotationInUVTransform": false,
|
||||||
|
"isBlocking": true,
|
||||||
|
"name": "assets/albedo.png",
|
||||||
|
"metadata": {
|
||||||
|
"baseSize": {
|
||||||
|
"width": 512,
|
||||||
|
"height": 512
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"hasAlpha": false,
|
||||||
|
"getAlphaFromRGB": false,
|
||||||
|
"level": 1,
|
||||||
|
"coordinatesIndex": 0,
|
||||||
|
"optimizeUVAllocation": true,
|
||||||
|
"coordinatesMode": 0,
|
||||||
|
"wrapU": 1,
|
||||||
|
"wrapV": 1,
|
||||||
|
"wrapR": 1,
|
||||||
|
"anisotropicFilteringLevel": 4,
|
||||||
|
"isCube": false,
|
||||||
|
"is3D": false,
|
||||||
|
"is2DArray": false,
|
||||||
|
"gammaSpace": true,
|
||||||
|
"invertZ": false,
|
||||||
|
"lodLevelInAlpha": false,
|
||||||
|
"lodGenerationOffset": 0,
|
||||||
|
"lodGenerationScale": 0,
|
||||||
|
"linearSpecularLOD": false,
|
||||||
|
"isRenderTarget": false,
|
||||||
|
"animations": [],
|
||||||
|
"invertY": true,
|
||||||
|
"samplingMode": 3,
|
||||||
|
"_useSRGBBuffer": false,
|
||||||
|
"noMipmap": false
|
||||||
|
},
|
||||||
|
"ambientTextureStrength": 1,
|
||||||
|
"ambientTextureImpactOnAnalyticalLights": 0,
|
||||||
|
"metallic": 0,
|
||||||
|
"roughness": 1,
|
||||||
|
"metallicF0Factor": 1,
|
||||||
|
"metallicReflectanceColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useOnlyMetallicFromMetallicReflectanceTexture": false,
|
||||||
|
"ambient": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"albedo": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"baseWeight": 1,
|
||||||
|
"reflectivity": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"reflection": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"emissive": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"microSurface": 1,
|
||||||
|
"useLightmapAsShadowmap": false,
|
||||||
|
"useAlphaFromAlbedoTexture": false,
|
||||||
|
"forceAlphaTest": false,
|
||||||
|
"alphaCutOff": 0.4,
|
||||||
|
"useSpecularOverAlpha": true,
|
||||||
|
"useMicroSurfaceFromReflectivityMapAlpha": false,
|
||||||
|
"useRoughnessFromMetallicTextureAlpha": true,
|
||||||
|
"useRoughnessFromMetallicTextureGreen": false,
|
||||||
|
"useMetallnessFromMetallicTextureBlue": false,
|
||||||
|
"useAmbientOcclusionFromMetallicTextureRed": false,
|
||||||
|
"useAmbientInGrayScale": false,
|
||||||
|
"useAutoMicroSurfaceFromReflectivityMap": false,
|
||||||
|
"usePhysicalLightFalloff": true,
|
||||||
|
"useGLTFLightFalloff": false,
|
||||||
|
"useRadianceOverAlpha": true,
|
||||||
|
"useObjectSpaceNormalMap": false,
|
||||||
|
"useParallax": false,
|
||||||
|
"useParallaxOcclusion": false,
|
||||||
|
"parallaxScaleBias": 0.05,
|
||||||
|
"disableLighting": false,
|
||||||
|
"forceIrradianceInFragment": false,
|
||||||
|
"maxSimultaneousLights": 32,
|
||||||
|
"invertNormalMapX": false,
|
||||||
|
"invertNormalMapY": false,
|
||||||
|
"twoSidedLighting": false,
|
||||||
|
"useAlphaFresnel": false,
|
||||||
|
"useLinearAlphaFresnel": false,
|
||||||
|
"forceNormalForward": false,
|
||||||
|
"enableSpecularAntiAliasing": false,
|
||||||
|
"useHorizonOcclusion": true,
|
||||||
|
"useRadianceOcclusion": true,
|
||||||
|
"unlit": false,
|
||||||
|
"applyDecalMapAfterDetailMap": false,
|
||||||
|
"id": "27c18987-1817-46cd-bdb0-2328f55c7f8b",
|
||||||
|
"name": "ground",
|
||||||
|
"checkReadyOnEveryCall": false,
|
||||||
|
"checkReadyOnlyOnce": false,
|
||||||
|
"state": "",
|
||||||
|
"alpha": 1,
|
||||||
|
"backFaceCulling": true,
|
||||||
|
"cullBackFaces": true,
|
||||||
|
"sideOrientation": 1,
|
||||||
|
"_alphaMode": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"_needDepthPrePass": false,
|
||||||
|
"disableDepthWrite": false,
|
||||||
|
"disableColorWrite": false,
|
||||||
|
"forceDepthWrite": false,
|
||||||
|
"depthFunction": 0,
|
||||||
|
"separateCullingPass": false,
|
||||||
|
"fogEnabled": true,
|
||||||
|
"pointSize": 1,
|
||||||
|
"zOffset": 0,
|
||||||
|
"zOffsetUnits": 0,
|
||||||
|
"pointsCloud": false,
|
||||||
|
"fillMode": 0,
|
||||||
|
"_isVertexOutputInvariant": false,
|
||||||
|
"transparencyMode": 0,
|
||||||
|
"stencil": {
|
||||||
|
"tags": null,
|
||||||
|
"func": 519,
|
||||||
|
"backFunc": 519,
|
||||||
|
"funcRef": 1,
|
||||||
|
"funcMask": 255,
|
||||||
|
"opStencilFail": 7680,
|
||||||
|
"opDepthFail": 7680,
|
||||||
|
"opStencilDepthPass": 7681,
|
||||||
|
"backOpStencilFail": 7680,
|
||||||
|
"backOpDepthFail": 7680,
|
||||||
|
"backOpStencilDepthPass": 7681,
|
||||||
|
"mask": 255,
|
||||||
|
"enabled": false
|
||||||
|
},
|
||||||
|
"uniqueId": 1711813881026,
|
||||||
|
"plugins": {
|
||||||
|
"PBRBRDFConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"useEnergyConservation": true,
|
||||||
|
"useSmithVisibilityHeightCorrelated": true,
|
||||||
|
"useSphericalHarmonics": true,
|
||||||
|
"useSpecularGlossinessInputEnergyConservation": true,
|
||||||
|
"mixIblRadianceWithIrradiance": true,
|
||||||
|
"useLegacySpecularEnergyConservation": true,
|
||||||
|
"baseDiffuseModel": 0,
|
||||||
|
"dielectricSpecularModel": 0,
|
||||||
|
"conductorSpecularModel": 0,
|
||||||
|
"name": "PBRBRDF",
|
||||||
|
"priority": 90,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRClearCoatConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"roughness": 0,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"remapF0OnInterfaceChange": true,
|
||||||
|
"isTintEnabled": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"tintThickness": 1,
|
||||||
|
"name": "PBRClearCoat",
|
||||||
|
"priority": 100,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRIridescenceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"minimumThickness": 100,
|
||||||
|
"maximumThickness": 400,
|
||||||
|
"indexOfRefraction": 1.3,
|
||||||
|
"name": "PBRIridescence",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRAnisotropicConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"direction": [
|
||||||
|
1,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"legacy": false,
|
||||||
|
"name": "PBRAnisotropic",
|
||||||
|
"priority": 110,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSheenConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isEnabled": false,
|
||||||
|
"linkSheenWithAlbedo": false,
|
||||||
|
"intensity": 1,
|
||||||
|
"color": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useRoughnessFromMainTexture": true,
|
||||||
|
"albedoScaling": false,
|
||||||
|
"name": "Sheen",
|
||||||
|
"priority": 120,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
},
|
||||||
|
"PBRSubSurfaceConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"isRefractionEnabled": false,
|
||||||
|
"isTranslucencyEnabled": false,
|
||||||
|
"isDispersionEnabled": false,
|
||||||
|
"isScatteringEnabled": false,
|
||||||
|
"_scatteringDiffusionProfileIndex": 0,
|
||||||
|
"refractionIntensity": 1,
|
||||||
|
"translucencyIntensity": 1,
|
||||||
|
"useAlbedoToTintRefraction": false,
|
||||||
|
"useAlbedoToTintTranslucency": false,
|
||||||
|
"indexOfRefraction": 1.5,
|
||||||
|
"_volumeIndexOfRefraction": -1,
|
||||||
|
"invertRefractionY": false,
|
||||||
|
"linkRefractionWithTransparency": false,
|
||||||
|
"minimumThickness": 0,
|
||||||
|
"maximumThickness": 1,
|
||||||
|
"useThicknessAsDepth": false,
|
||||||
|
"tintColor": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"tintColorAtDistance": 1,
|
||||||
|
"dispersion": 0,
|
||||||
|
"diffusionDistance": [
|
||||||
|
1,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"useMaskFromThicknessTexture": false,
|
||||||
|
"useGltfStyleTextures": false,
|
||||||
|
"applyAlbedoAfterSubSurface": false,
|
||||||
|
"legacyTranslucency": false,
|
||||||
|
"name": "PBRSubSurface",
|
||||||
|
"priority": 130,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": true
|
||||||
|
},
|
||||||
|
"DetailMapConfiguration": {
|
||||||
|
"tags": null,
|
||||||
|
"diffuseBlendLevel": 1,
|
||||||
|
"roughnessBlendLevel": 1,
|
||||||
|
"bumpLevel": 1,
|
||||||
|
"normalBlendMethod": 0,
|
||||||
|
"isEnabled": false,
|
||||||
|
"name": "DetailMap",
|
||||||
|
"priority": 140,
|
||||||
|
"resolveIncludes": false,
|
||||||
|
"registerForExtraEvents": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"customType": "BABYLON.PBRMaterial"
|
||||||
|
}
|
||||||