incanto 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/3d.d.ts +3 -0
- package/dist/3d.js +3 -3
- package/dist/{create-game-BK0RAa-8.js → create-game-DKdR28SI.js} +9 -2
- package/dist/index.js +1 -1
- package/dist/{physics-3d-ueniRlc-.js → physics-3d-DXODbpY1.js} +1 -1
- package/dist/react.js +1 -1
- package/dist/{register-P5PDzb7s.js → register-CljkZG08.js} +132 -38
- package/dist/test.js +3 -3
- package/editor/assets/{agent8-CjLdyAp1.js → agent8-CXBTOrkj.js} +1 -1
- package/editor/assets/{index-C82h2nk2.js → index-DMghTAy4.js} +36 -36
- package/editor/index.html +1 -1
- package/package.json +1 -1
- package/schemas/scene.schema.json +10 -0
- package/skills/incanto-building-3d-games.md +1 -0
- package/skills/incanto-node-reference.md +2 -0
package/dist/3d.d.ts
CHANGED
|
@@ -101,6 +101,9 @@ interface RenderContext3D {
|
|
|
101
101
|
gl: WebGLRenderer;
|
|
102
102
|
scene: Scene;
|
|
103
103
|
camera: PerspectiveCamera;
|
|
104
|
+
/** Unit world direction TOWARD the scene's shadow-casting sun (reused vector),
|
|
105
|
+
* so a billboard shadow caster can face the light. `null` when no sun light. */
|
|
106
|
+
sunDir?: Vector3 | null;
|
|
104
107
|
}
|
|
105
108
|
/**
|
|
106
109
|
* Implement on a Node3D subclass to receive {@link RenderContext3D} once per
|
package/dist/3d.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { a as Environment3D, c as sunDirectionFromElevationAzimuth, i as syncTree, l as sunDirectionFromSky, o as horizonColorFromSky, r as Renderer3D, s as parseEnvironment3D, t as createGame3D, u as AssetStore3D } from "./create-game-
|
|
2
|
-
import { A as QUARTER_PITCH, C as Area3D, D as StaticBody3D, E as RigidBody3D, M as keyboardIntensity, N as movementState, O as Node3D, P as rigPose, S as terrainThemeLayers, T as PhysicsBody3D, _ as CharacterController3D, a as VoxelGrid3D, b as DEFAULT_TERRAIN_TEXTURE_BASE, c as ModelInstance3D, d as OmniLight3D, f as Foliage3D, g as FLOWER_VARIETIES, h as resolveFlowerDensity, i as VOXEL_PALETTE, j as cameraRelative, l as MeshInstance3D, m as Flowers3D, n as Water3D, o as Tree3D, p as DENSITY_PRESETS, r as WATER_MAX_RIPPLES, s as Particles3D, t as registerNodes3D, u as DirectionalLight3D, v as Camera3D, w as CharacterBody3D, x as TERRAIN_THEMES, y as Terrain3D } from "./register-
|
|
1
|
+
import { a as Environment3D, c as sunDirectionFromElevationAzimuth, i as syncTree, l as sunDirectionFromSky, o as horizonColorFromSky, r as Renderer3D, s as parseEnvironment3D, t as createGame3D, u as AssetStore3D } from "./create-game-DKdR28SI.js";
|
|
2
|
+
import { A as QUARTER_PITCH, C as Area3D, D as StaticBody3D, E as RigidBody3D, M as keyboardIntensity, N as movementState, O as Node3D, P as rigPose, S as terrainThemeLayers, T as PhysicsBody3D, _ as CharacterController3D, a as VoxelGrid3D, b as DEFAULT_TERRAIN_TEXTURE_BASE, c as ModelInstance3D, d as OmniLight3D, f as Foliage3D, g as FLOWER_VARIETIES, h as resolveFlowerDensity, i as VOXEL_PALETTE, j as cameraRelative, l as MeshInstance3D, m as Flowers3D, n as Water3D, o as Tree3D, p as DENSITY_PRESETS, r as WATER_MAX_RIPPLES, s as Particles3D, t as registerNodes3D, u as DirectionalLight3D, v as Camera3D, w as CharacterBody3D, x as TERRAIN_THEMES, y as Terrain3D } from "./register-CljkZG08.js";
|
|
3
3
|
import { n as splatWeights, t as buildHeightmap } from "./heightmap-CroQPEER.js";
|
|
4
|
-
import { n as enablePhysics3D, t as Physics3D } from "./physics-3d-
|
|
4
|
+
import { n as enablePhysics3D, t as Physics3D } from "./physics-3d-DXODbpY1.js";
|
|
5
5
|
export { Area3D, AssetStore3D, Camera3D, CharacterBody3D, CharacterController3D, DEFAULT_TERRAIN_TEXTURE_BASE, DirectionalLight3D, Environment3D, DENSITY_PRESETS as FLOWER_DENSITY_PRESETS, FLOWER_VARIETIES, Flowers3D, Foliage3D, MeshInstance3D, ModelInstance3D, Node3D, OmniLight3D, Particles3D, Physics3D, PhysicsBody3D, QUARTER_PITCH, Renderer3D, RigidBody3D, StaticBody3D, TERRAIN_THEMES, Terrain3D, Tree3D, VOXEL_PALETTE, VoxelGrid3D, WATER_MAX_RIPPLES, Water3D, buildHeightmap, cameraRelative, createGame3D, enablePhysics3D, horizonColorFromSky, keyboardIntensity, movementState, parseEnvironment3D, registerNodes3D, resolveFlowerDensity, rigPose, splatWeights, sunDirectionFromElevationAzimuth, sunDirectionFromSky, syncTree, terrainThemeLayers };
|
|
@@ -6,8 +6,8 @@ import { r as AudioPlayer } from "./register-BuUV1_KB.js";
|
|
|
6
6
|
import { i as resolveRendering, n as attachTouchControls } from "./touch-031PxtCR.js";
|
|
7
7
|
import { n as registerGameplayBehaviors } from "./gameplay-Ccruc3Wd.js";
|
|
8
8
|
import { t as debugSources } from "./debug-draw-CZmOYjL2.js";
|
|
9
|
-
import { O as Node3D, T as PhysicsBody3D, c as ModelInstance3D, t as registerNodes3D, u as DirectionalLight3D, v as Camera3D } from "./register-
|
|
10
|
-
import { n as enablePhysics3D } from "./physics-3d-
|
|
9
|
+
import { O as Node3D, T as PhysicsBody3D, c as ModelInstance3D, t as registerNodes3D, u as DirectionalLight3D, v as Camera3D } from "./register-CljkZG08.js";
|
|
10
|
+
import { n as enablePhysics3D } from "./physics-3d-DXODbpY1.js";
|
|
11
11
|
import { ACESFilmicToneMapping, AmbientLight, BufferAttribute, BufferGeometry, Color, DepthTexture, EquirectangularReflectionMapping, FloatType, Fog, LineBasicMaterial, LineSegments, Matrix4, Mesh, PCFShadowMap, PMREMGenerator, PerspectiveCamera, PlaneGeometry, Quaternion, Raycaster, Scene, ShaderMaterial, Vector2, Vector3, WebGLRenderTarget, WebGLRenderer } from "three";
|
|
12
12
|
import { VRMLoaderPlugin, VRMUtils } from "@pixiv/three-vrm";
|
|
13
13
|
import { GLTFLoader } from "three/addons/loaders/GLTFLoader.js";
|
|
@@ -1318,6 +1318,11 @@ var Renderer3D = class {
|
|
|
1318
1318
|
};
|
|
1319
1319
|
const ctx = this.renderCtx;
|
|
1320
1320
|
ctx.camera = activeCamera;
|
|
1321
|
+
if (threeLight) {
|
|
1322
|
+
threeLight.updateWorldMatrix(true, false);
|
|
1323
|
+
threeLight.target.updateWorldMatrix(true, false);
|
|
1324
|
+
ctx.sunDir = sunDirScratch.setFromMatrixPosition(threeLight.matrixWorld).sub(sunTargetScratch.setFromMatrixPosition(threeLight.target.matrixWorld)).normalize();
|
|
1325
|
+
} else ctx.sunDir = null;
|
|
1321
1326
|
for (let i = 0; i < renderHooks.length; i++) renderHooks[i]?._onRender3D(ctx);
|
|
1322
1327
|
let underwater = null;
|
|
1323
1328
|
for (let i = 0; i < renderHooks.length; i++) {
|
|
@@ -1576,6 +1581,8 @@ var Renderer3D = class {
|
|
|
1576
1581
|
const sizeScratch = new Vector2();
|
|
1577
1582
|
const lookScratch = new Vector3();
|
|
1578
1583
|
const projScratch = new Vector3();
|
|
1584
|
+
const sunDirScratch = new Vector3();
|
|
1585
|
+
const sunTargetScratch = new Vector3();
|
|
1579
1586
|
const basisQuat = new Quaternion();
|
|
1580
1587
|
/** Reused camera world-position scratch (shadow-follow focus + underwater test). */
|
|
1581
1588
|
const camPosScratch = new Vector3();
|
package/dist/index.js
CHANGED
|
@@ -57,6 +57,6 @@ function newUid() {
|
|
|
57
57
|
//#endregion
|
|
58
58
|
//#region src/index.ts
|
|
59
59
|
/** Engine version. Kept in sync with package.json by the release pipeline. */
|
|
60
|
-
const VERSION = "0.3.
|
|
60
|
+
const VERSION = "0.3.3";
|
|
61
61
|
//#endregion
|
|
62
62
|
export { AudioBuses, AudioPlayer, Behavior, CONST_REF_KEY, Engine, IncantoError, InputMap, LogManager, MusicManager, Node, PARTICLE_PRESETS, PARTICLE_PRESET_NAMES, ParticleSim, ROLLOFF_MODELS, Rng, SCENE_FORMAT, SFX_PRESETS, SFX_PRESET_NAMES, Scene, SceneTree, SfxEngine, Signal, Timer, TouchControls, VERSION, WebAudioMusicBackend, applyParticlePreset, assetUrls, attachTouchControls, clearBehaviors, clearRegistry, computeViewport, createNode, createNoise2D, crossfadeGains, duplicateNode, fadeGain, getBehavior, getNodeSchema, getNodeSignals, getNodeType, isAudioContextAvailable, isConstRef, joystickVector, jsonClone, jsonEquals, jsonKind, loadScene, mergeStaticSignals, newUid, parseNodePath, preloadUrls, registerBehavior, registerCoreNodes, registerNode, registeredBehaviors, registeredTypes, resolveConstants, resolveRendering, resolveViewport, serializeNode, spatialGain, spatialPan, synthSfx };
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as __exportAll } from "./rolldown-runtime-D7D4PA-g.js";
|
|
2
2
|
import { t as IncantoError } from "./errors-BpWbnbb_.js";
|
|
3
3
|
import { n as registerDebugSource } from "./debug-draw-CZmOYjL2.js";
|
|
4
|
-
import { C as Area3D, E as RigidBody3D, O as Node3D, T as PhysicsBody3D, k as validateCollider3D, w as CharacterBody3D, y as Terrain3D } from "./register-
|
|
4
|
+
import { C as Area3D, E as RigidBody3D, O as Node3D, T as PhysicsBody3D, k as validateCollider3D, w as CharacterBody3D, y as Terrain3D } from "./register-CljkZG08.js";
|
|
5
5
|
import { Euler, Quaternion } from "three";
|
|
6
6
|
//#region src/3d/physics/physics-3d.ts
|
|
7
7
|
var physics_3d_exports = /* @__PURE__ */ __exportAll({
|
package/dist/react.js
CHANGED
|
@@ -156,7 +156,7 @@ function IncantoCanvas(props) {
|
|
|
156
156
|
pointer: latest.pointer,
|
|
157
157
|
...keyboard !== void 0 ? { keyboard } : {}
|
|
158
158
|
};
|
|
159
|
-
const next = await (_gameFactory ?? (mode === "3d" ? async (o) => (await import("./create-game-
|
|
159
|
+
const next = await (_gameFactory ?? (mode === "3d" ? async (o) => (await import("./create-game-DKdR28SI.js").then((n) => n.n)).createGame3D(o) : async (o) => (await import("./create-game-CZHROKcT.js").then((n) => n.n)).createGame2D(o)))(opts);
|
|
160
160
|
if (disposed) {
|
|
161
161
|
next.dispose();
|
|
162
162
|
return;
|
|
@@ -1320,11 +1320,39 @@ function validateLayer(nodeName, layer, index) {
|
|
|
1320
1320
|
//#region src/3d/nodes/sprite-3d.ts
|
|
1321
1321
|
/** Shared unit quad — sprites are sized via the quad's scale, never THREE.Sprite. */
|
|
1322
1322
|
const UNIT_PLANE = new PlaneGeometry(1, 1);
|
|
1323
|
+
/** Shared soft radial-gradient texture for `shadowMode: "blob"` (lazily built). */
|
|
1324
|
+
let _blobTex = null;
|
|
1325
|
+
function blobTexture() {
|
|
1326
|
+
if (_blobTex) return _blobTex;
|
|
1327
|
+
if (typeof document === "undefined") return null;
|
|
1328
|
+
const c = document.createElement("canvas");
|
|
1329
|
+
c.width = 64;
|
|
1330
|
+
c.height = 64;
|
|
1331
|
+
const g = c.getContext("2d");
|
|
1332
|
+
if (!g) return null;
|
|
1333
|
+
const grad = g.createRadialGradient(32, 32, 0, 32, 32, 31);
|
|
1334
|
+
grad.addColorStop(0, "rgba(0,0,0,0.55)");
|
|
1335
|
+
grad.addColorStop(.55, "rgba(0,0,0,0.34)");
|
|
1336
|
+
grad.addColorStop(1, "rgba(0,0,0,0)");
|
|
1337
|
+
g.fillStyle = grad;
|
|
1338
|
+
g.fillRect(0, 0, 64, 64);
|
|
1339
|
+
_blobTex = new CanvasTexture(c);
|
|
1340
|
+
return _blobTex;
|
|
1341
|
+
}
|
|
1323
1342
|
const Z_AXIS = new Vector3(0, 0, 1);
|
|
1324
1343
|
const _spritePos = new Vector3();
|
|
1325
1344
|
const _dir = new Vector3();
|
|
1326
1345
|
const _target = new Quaternion();
|
|
1327
1346
|
const _parent = new Quaternion();
|
|
1347
|
+
const _sunLocal = new Vector3();
|
|
1348
|
+
/** Slide the silhouette shadow caster this many world-units TOWARD the light,
|
|
1349
|
+
* ALONG the light direction. Moving along the light is projection-invariant
|
|
1350
|
+
* (the shadow's shape/position is unchanged), but it lowers the caster's depth
|
|
1351
|
+
* in the shadow map — so the light's anti-acne bias can no longer eat the
|
|
1352
|
+
* near-ground contact (feet/legs). The terrain keeps its own bias untouched, so
|
|
1353
|
+
* terrain self-shadow acne prevention is unaffected. Tune if the foot still
|
|
1354
|
+
* detaches (raise) or over-darkens (lower). */
|
|
1355
|
+
const SHADOW_CONTACT_PUSH = .5;
|
|
1328
1356
|
/**
|
|
1329
1357
|
* Sprite3D — a 2D texture drawn as a camera-facing billboard quad inside a 3D
|
|
1330
1358
|
* scene (the 2.5D look: Octopath, Don't Starve). The visual is an inner quad
|
|
@@ -1357,7 +1385,11 @@ var Sprite3D = class extends Node3D {
|
|
|
1357
1385
|
flipX: { default: false },
|
|
1358
1386
|
pixelArt: { default: true },
|
|
1359
1387
|
alphaTest: { default: .5 },
|
|
1360
|
-
castShadow: { default: false }
|
|
1388
|
+
castShadow: { default: false },
|
|
1389
|
+
shadowMode: {
|
|
1390
|
+
default: "silhouette",
|
|
1391
|
+
options: ["silhouette", "blob"]
|
|
1392
|
+
}
|
|
1361
1393
|
};
|
|
1362
1394
|
/** Image URL (sampled sRGB, tinted by `tint`). Empty = hidden. */
|
|
1363
1395
|
texture = "";
|
|
@@ -1376,18 +1408,22 @@ var Sprite3D = class extends Node3D {
|
|
|
1376
1408
|
alphaTest = .5;
|
|
1377
1409
|
/** Cast a sprite-shaped (alpha-tested) shadow onto the scene. */
|
|
1378
1410
|
castShadow = false;
|
|
1411
|
+
/** Shape of the cast shadow — see {@link ShadowMode}. */
|
|
1412
|
+
shadowMode = "silhouette";
|
|
1379
1413
|
quadMesh = null;
|
|
1380
1414
|
textureRef = "";
|
|
1381
1415
|
loadedTexture = null;
|
|
1382
|
-
/**
|
|
1383
|
-
|
|
1384
|
-
|
|
1416
|
+
/** Dedicated light-facing caster for `shadowMode: "silhouette"` (lazily made). */
|
|
1417
|
+
shadowMesh = null;
|
|
1418
|
+
/** Flat ground oval for `shadowMode: "blob"` (lazily made). */
|
|
1419
|
+
blobMesh = null;
|
|
1385
1420
|
/** @internal The drawable quad (lazily created, attached under the backing object). */
|
|
1386
1421
|
_quad() {
|
|
1387
1422
|
if (!this.quadMesh) {
|
|
1388
1423
|
this.quadMesh = new Mesh(UNIT_PLANE, new MeshBasicMaterial({
|
|
1389
1424
|
transparent: false,
|
|
1390
|
-
depthWrite: true
|
|
1425
|
+
depthWrite: true,
|
|
1426
|
+
side: DoubleSide
|
|
1391
1427
|
}));
|
|
1392
1428
|
this._ensureObject3D().add(this.quadMesh);
|
|
1393
1429
|
}
|
|
@@ -1432,43 +1468,86 @@ var Sprite3D = class extends Node3D {
|
|
|
1432
1468
|
mat.transparent = this.opacity < 1;
|
|
1433
1469
|
mat.alphaTest = this.alphaTest;
|
|
1434
1470
|
quad.renderOrder = this.renderOrder;
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1471
|
+
const wantShadow = this.castShadow && tex !== null;
|
|
1472
|
+
quad.castShadow = false;
|
|
1473
|
+
if (wantShadow && this.shadowMode === "silhouette") {
|
|
1474
|
+
const s = this._shadowCaster();
|
|
1475
|
+
s.visible = true;
|
|
1476
|
+
s.castShadow = true;
|
|
1477
|
+
s.scale.set(this.flipX ? -w : w, h, 1);
|
|
1478
|
+
s.position.set((.5 - ax) * w, (.5 - ay) * h, 0);
|
|
1479
|
+
const sm = s.material;
|
|
1480
|
+
if (sm.map !== tex) {
|
|
1481
|
+
sm.map = tex;
|
|
1482
|
+
sm.needsUpdate = true;
|
|
1445
1483
|
}
|
|
1446
|
-
|
|
1447
|
-
if (
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
if (this.billboard === "none") return;
|
|
1451
|
-
this._faceToward(quad, shadowCam.position);
|
|
1452
|
-
quad.updateWorldMatrix(true, false);
|
|
1453
|
-
};
|
|
1454
|
-
quad.onAfterShadow = () => {
|
|
1455
|
-
if (this.billboard === "none") return;
|
|
1456
|
-
quad.quaternion.copy(this._camFaceQuat);
|
|
1457
|
-
quad.updateWorldMatrix(true, false);
|
|
1458
|
-
};
|
|
1484
|
+
const dm = s.customDepthMaterial;
|
|
1485
|
+
if (dm.map !== tex) {
|
|
1486
|
+
dm.map = tex;
|
|
1487
|
+
dm.needsUpdate = true;
|
|
1459
1488
|
}
|
|
1489
|
+
sm.alphaTest = this.alphaTest;
|
|
1490
|
+
dm.alphaTest = this.alphaTest;
|
|
1491
|
+
} else if (this.shadowMesh) {
|
|
1492
|
+
this.shadowMesh.visible = false;
|
|
1493
|
+
this.shadowMesh.castShadow = false;
|
|
1494
|
+
}
|
|
1495
|
+
if (wantShadow && this.shadowMode === "blob") {
|
|
1496
|
+
const b = this._blob();
|
|
1497
|
+
b.visible = true;
|
|
1498
|
+
b.scale.set(w * .52, w * .52, 1);
|
|
1499
|
+
} else if (this.blobMesh) this.blobMesh.visible = false;
|
|
1500
|
+
}
|
|
1501
|
+
/** @internal Lazily make the silhouette caster — an invisible plane (no colour/
|
|
1502
|
+
* depth write) that exists only to throw a physical shadow, kept broad to the
|
|
1503
|
+
* light in `_onRender3D`. A custom depth material is explicit so the shadow
|
|
1504
|
+
* pass always uses the current texture frame + low alpha cutoff. */
|
|
1505
|
+
_shadowCaster() {
|
|
1506
|
+
if (!this.shadowMesh) {
|
|
1507
|
+
this.shadowMesh = new Mesh(UNIT_PLANE, new MeshBasicMaterial({
|
|
1508
|
+
colorWrite: false,
|
|
1509
|
+
depthWrite: false,
|
|
1510
|
+
side: DoubleSide
|
|
1511
|
+
}));
|
|
1512
|
+
this.shadowMesh.customDepthMaterial = new MeshDepthMaterial({
|
|
1513
|
+
depthPacking: RGBADepthPacking,
|
|
1514
|
+
side: DoubleSide
|
|
1515
|
+
});
|
|
1516
|
+
this._ensureObject3D().add(this.shadowMesh);
|
|
1460
1517
|
}
|
|
1518
|
+
return this.shadowMesh;
|
|
1519
|
+
}
|
|
1520
|
+
/** @internal Lazily make the blob oval — a flat ground decal with a soft radial
|
|
1521
|
+
* gradient, lying in the XZ plane at the node origin (the feet). */
|
|
1522
|
+
_blob() {
|
|
1523
|
+
if (!this.blobMesh) {
|
|
1524
|
+
this.blobMesh = new Mesh(UNIT_PLANE, new MeshBasicMaterial({
|
|
1525
|
+
map: blobTexture(),
|
|
1526
|
+
color: 0,
|
|
1527
|
+
transparent: true,
|
|
1528
|
+
depthWrite: false
|
|
1529
|
+
}));
|
|
1530
|
+
this.blobMesh.rotation.x = -Math.PI / 2;
|
|
1531
|
+
this.blobMesh.position.y = .02;
|
|
1532
|
+
this.blobMesh.renderOrder = -1;
|
|
1533
|
+
this._ensureObject3D().add(this.blobMesh);
|
|
1534
|
+
}
|
|
1535
|
+
return this.blobMesh;
|
|
1461
1536
|
}
|
|
1462
|
-
/** @internal Billboard the quad toward the
|
|
1463
|
-
* Renderer3D and never call this, so
|
|
1537
|
+
/** @internal Billboard the visible quad toward the camera, and aim the silhouette
|
|
1538
|
+
* caster at the light. Headless runs have no Renderer3D and never call this, so
|
|
1539
|
+
* plain trees pay nothing. */
|
|
1464
1540
|
_onRender3D(ctx) {
|
|
1465
|
-
if (this.billboard
|
|
1466
|
-
const
|
|
1467
|
-
|
|
1468
|
-
|
|
1541
|
+
if (this.billboard !== "none") this._faceToward(this._quad(), ctx.camera.position);
|
|
1542
|
+
const caster = this.shadowMesh;
|
|
1543
|
+
if (caster?.castShadow && ctx.sunDir) {
|
|
1544
|
+
this._faceDir(caster, ctx.sunDir);
|
|
1545
|
+
caster.parent?.getWorldQuaternion(_parent);
|
|
1546
|
+
_sunLocal.copy(ctx.sunDir).applyQuaternion(_parent.invert());
|
|
1547
|
+
caster.position.addScaledVector(_sunLocal, SHADOW_CONTACT_PUSH);
|
|
1548
|
+
}
|
|
1469
1549
|
}
|
|
1470
|
-
/** @internal Aim the quad's +Z at a world point, honoring billboard mode.
|
|
1471
|
-
* by the colour pass (face the camera) and the shadow pass (face the light). */
|
|
1550
|
+
/** @internal Aim the quad's +Z at a world point, honoring billboard mode. */
|
|
1472
1551
|
_faceToward(quad, targetWorld) {
|
|
1473
1552
|
quad.getWorldPosition(_spritePos);
|
|
1474
1553
|
_dir.copy(targetWorld).sub(_spritePos);
|
|
@@ -1479,10 +1558,25 @@ var Sprite3D = class extends Node3D {
|
|
|
1479
1558
|
quad.parent?.getWorldQuaternion(_parent);
|
|
1480
1559
|
quad.quaternion.copy(_parent.invert()).multiply(_target);
|
|
1481
1560
|
}
|
|
1561
|
+
/** @internal Aim a mesh's +Z along a world DIRECTION (vs a point), honoring
|
|
1562
|
+
* billboard mode — keeps the silhouette shadow caster broad to the light. */
|
|
1563
|
+
_faceDir(mesh, dir) {
|
|
1564
|
+
_dir.copy(dir);
|
|
1565
|
+
if (this.billboard === "y") _dir.y = 0;
|
|
1566
|
+
if (_dir.lengthSq() < 1e-12) return;
|
|
1567
|
+
_dir.normalize();
|
|
1568
|
+
_target.setFromUnitVectors(Z_AXIS, _dir);
|
|
1569
|
+
mesh.parent?.getWorldQuaternion(_parent);
|
|
1570
|
+
mesh.quaternion.copy(_parent.invert()).multiply(_target);
|
|
1571
|
+
}
|
|
1482
1572
|
free() {
|
|
1483
1573
|
this.loadedTexture?.dispose();
|
|
1484
1574
|
this.loadedTexture = null;
|
|
1485
|
-
(this.
|
|
1575
|
+
if (this.shadowMesh) {
|
|
1576
|
+
this.shadowMesh.material.dispose();
|
|
1577
|
+
this.shadowMesh.customDepthMaterial?.dispose();
|
|
1578
|
+
}
|
|
1579
|
+
if (this.blobMesh) this.blobMesh.material.dispose();
|
|
1486
1580
|
super.free();
|
|
1487
1581
|
}
|
|
1488
1582
|
};
|
|
@@ -4664,7 +4758,7 @@ var DirectionalLight3D = class extends Node3D {
|
|
|
4664
4758
|
}
|
|
4665
4759
|
light.shadow.mapSize.set(this.shadowMapSize, this.shadowMapSize);
|
|
4666
4760
|
light.shadow.bias = -2e-4;
|
|
4667
|
-
light.shadow.normalBias =
|
|
4761
|
+
light.shadow.normalBias = .002;
|
|
4668
4762
|
}
|
|
4669
4763
|
}
|
|
4670
4764
|
};
|
package/dist/test.js
CHANGED
|
@@ -5,7 +5,7 @@ import { n as jsonEquals, t as jsonClone } from "./json-BLk7H2Qa.js";
|
|
|
5
5
|
import { i as getNodeSchema, s as mergeStaticProps } from "./registry-BVJ2HbCn.js";
|
|
6
6
|
import { n as registerGameplayBehaviors } from "./gameplay-Ccruc3Wd.js";
|
|
7
7
|
import { t as registerNodes2D } from "./register-DPEV9_9t.js";
|
|
8
|
-
import { t as registerNodes3D } from "./register-
|
|
8
|
+
import { t as registerNodes3D } from "./register-CljkZG08.js";
|
|
9
9
|
import { t as registerNodesNet } from "./register-Dasmnurl.js";
|
|
10
10
|
//#region src/test/index.ts
|
|
11
11
|
/**
|
|
@@ -132,7 +132,7 @@ async function runScript(json, opts) {
|
|
|
132
132
|
const { enablePhysics2D } = await import("./physics-2d-KuMWPTf6.js").then((n) => n.r);
|
|
133
133
|
await enablePhysics2D(engine);
|
|
134
134
|
} else if (physics === "3d" || physics === "auto" && scene.dimension === "3d") {
|
|
135
|
-
const { enablePhysics3D } = await import("./physics-3d-
|
|
135
|
+
const { enablePhysics3D } = await import("./physics-3d-DXODbpY1.js").then((n) => n.r);
|
|
136
136
|
await enablePhysics3D(engine);
|
|
137
137
|
}
|
|
138
138
|
const failures = [];
|
|
@@ -237,7 +237,7 @@ async function createPlaySession(json, opts = {}) {
|
|
|
237
237
|
const { enablePhysics2D } = await import("./physics-2d-KuMWPTf6.js").then((n) => n.r);
|
|
238
238
|
await enablePhysics2D(engine);
|
|
239
239
|
} else if (physics === "3d" || physics === "auto" && scene.dimension === "3d") {
|
|
240
|
-
const { enablePhysics3D } = await import("./physics-3d-
|
|
240
|
+
const { enablePhysics3D } = await import("./physics-3d-DXODbpY1.js").then((n) => n.r);
|
|
241
241
|
await enablePhysics3D(engine);
|
|
242
242
|
}
|
|
243
243
|
const stepMs = 1e3 / (opts.fixedHz ?? 60);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./index-
|
|
1
|
+
import{t as e}from"./index-DMghTAy4.js";async function t(t){return new n((await e(()=>import(`./GameServer-C56iOUgF.js`),[],import.meta.url)).GameServer,t)}var n=class{raw;active=new Map;constructor(e,t){this.raw=new e({...t})}get account(){return this.raw.account}get connected(){return this.raw.connected}connect(){return this.rawConnect()}rawConnect(){return this.raw.connect({onDisconnect:()=>void this.reconnect()})}disconnect(){for(let e of this.active.values())e.off();return this.active.clear(),this.raw.disconnect()}remoteFunction(e,t,n){return this.raw.remoteFunction(e,t,n)}track(e){let t=Symbol(`sub`),n={make:e,off:e()};return this.active.set(t,n),()=>{n.off(),this.active.delete(t)}}async reconnect(){await this.rawConnect();for(let e of this.active.values())e.off(),e.off=e.make()}subscribeRoomState(e,t){return this.track(()=>this.raw.subscribeRoomState(e,t))}subscribeRoomMyState(e,t){return this.track(()=>this.raw.subscribeRoomMyState(e,t))}subscribeRoomAllUserStates(e,t){return this.track(()=>this.raw.subscribeRoomAllUserStates(e,e=>{let n={};for(let t of e??[]){if(!t||typeof t.account!=`string`||t.__leaved)continue;let{account:e,__updated:r,__leaved:i,...a}=t;n[e]=a}t(n)}))}subscribeRoomCollection(e,t,n){return this.track(()=>this.raw.subscribeRoomCollection(e,t,({items:e})=>{let t={};for(let n of e??[])n&&typeof n.__id==`string`&&(t[n.__id]=n);n(t)}))}onRoomMessage(e,t,n){return this.track(()=>this.raw.onRoomMessage(e,t,n))}onRoomUserJoin(e,t){return this.track(()=>this.raw.onRoomUserJoin(e,t))}onRoomUserLeave(e,t){return this.track(()=>this.raw.onRoomUserLeave(e,t))}subscribeGlobalState(e){return this.track(()=>this.raw.subscribeGlobalState(e))}subscribeGlobalMyState(e){return this.track(()=>this.raw.subscribeGlobalMyState(e))}subscribeGlobalUserState(e,t){return this.track(()=>this.raw.subscribeGlobalUserState(e,t))}subscribeGlobalCollection(e,t){return this.track(()=>this.raw.subscribeGlobalCollection(e,({items:e})=>{let n={};for(let t of e??[])t&&typeof t.__id==`string`&&(n[t.__id]=t);t(n)}))}subscribeAsset(e,t){return this.track(()=>this.raw.subscribeAsset(e,t))}onGlobalMessage(e,t){return this.track(()=>this.raw.onGlobalMessage(e,t))}};export{t as createAgent8Server};
|