Update water contact patch handling in runtime and viewport components
This commit is contained in:
@@ -3,7 +3,7 @@ import { createModelInstanceRenderGroup, disposeModelInstance } from "../assets/
|
|||||||
import { buildBoxBrushDerivedMeshData } from "../geometry/box-brush-mesh";
|
import { buildBoxBrushDerivedMeshData } from "../geometry/box-brush-mesh";
|
||||||
import { createStarterMaterialSignature, createStarterMaterialTexture } from "../materials/starter-material-textures";
|
import { createStarterMaterialSignature, createStarterMaterialTexture } from "../materials/starter-material-textures";
|
||||||
import { applyAdvancedRenderingLightShadowFlags, applyAdvancedRenderingRenderableShadowFlags, configureAdvancedRenderingRenderer, createAdvancedRenderingComposer, resolveBoxVolumeRenderPaths } from "../rendering/advanced-rendering";
|
import { applyAdvancedRenderingLightShadowFlags, applyAdvancedRenderingRenderableShadowFlags, configureAdvancedRenderingRenderer, createAdvancedRenderingComposer, resolveBoxVolumeRenderPaths } from "../rendering/advanced-rendering";
|
||||||
import { collectWaterContactPatches, createWaterContactPatchUniformValue, createWaterMaterial } from "../rendering/water-material";
|
import { collectWaterContactPatches, createWaterContactPatchAxisUniformValue, createWaterContactPatchUniformValue, createWaterMaterial } from "../rendering/water-material";
|
||||||
import { areAdvancedRenderingSettingsEqual, cloneAdvancedRenderingSettings } from "../document/world-settings";
|
import { areAdvancedRenderingSettingsEqual, cloneAdvancedRenderingSettings } from "../document/world-settings";
|
||||||
import { FirstPersonNavigationController } from "./first-person-navigation-controller";
|
import { FirstPersonNavigationController } from "./first-person-navigation-controller";
|
||||||
import { RapierCollisionWorld } from "./rapier-collision-world";
|
import { RapierCollisionWorld } from "./rapier-collision-world";
|
||||||
@@ -441,10 +441,11 @@ export class RuntimeHost {
|
|||||||
if (waterMaterial.animationUniform !== null) {
|
if (waterMaterial.animationUniform !== null) {
|
||||||
this.volumeAnimatedUniforms.push(waterMaterial.animationUniform);
|
this.volumeAnimatedUniforms.push(waterMaterial.animationUniform);
|
||||||
}
|
}
|
||||||
if (faceId === "posY" && waterMaterial.contactPatchesUniform !== null) {
|
if (faceId === "posY" && waterMaterial.contactPatchesUniform !== null && waterMaterial.contactPatchAxesUniform !== null) {
|
||||||
this.runtimeWaterContactUniforms.push({
|
this.runtimeWaterContactUniforms.push({
|
||||||
brush,
|
brush,
|
||||||
uniform: waterMaterial.contactPatchesUniform,
|
uniform: waterMaterial.contactPatchesUniform,
|
||||||
|
axisUniform: waterMaterial.contactPatchAxesUniform,
|
||||||
staticContactPatches
|
staticContactPatches
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -590,10 +591,27 @@ export class RuntimeHost {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
collectRuntimeStaticWaterContactPatches(brush) {
|
collectRuntimeStaticWaterContactPatches(brush) {
|
||||||
const contactBounds = this.runtimeScene?.colliders.map((collider) => ({
|
const contactBounds = [];
|
||||||
min: collider.worldBounds.min,
|
for (const otherBrush of this.runtimeScene?.brushes ?? []) {
|
||||||
max: collider.worldBounds.max
|
if (otherBrush.id === brush.id || otherBrush.volume.mode !== "none") {
|
||||||
})) ?? [];
|
continue;
|
||||||
|
}
|
||||||
|
contactBounds.push({
|
||||||
|
kind: "orientedBox",
|
||||||
|
center: otherBrush.center,
|
||||||
|
rotationDegrees: otherBrush.rotationDegrees,
|
||||||
|
size: otherBrush.size
|
||||||
|
});
|
||||||
|
}
|
||||||
|
for (const collider of this.runtimeScene?.colliders ?? []) {
|
||||||
|
if (collider.source !== "modelInstance") {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
contactBounds.push({
|
||||||
|
min: collider.worldBounds.min,
|
||||||
|
max: collider.worldBounds.max
|
||||||
|
});
|
||||||
|
}
|
||||||
return collectWaterContactPatches({
|
return collectWaterContactPatches({
|
||||||
center: brush.center,
|
center: brush.center,
|
||||||
rotationDegrees: brush.rotationDegrees,
|
rotationDegrees: brush.rotationDegrees,
|
||||||
@@ -616,7 +634,9 @@ export class RuntimeHost {
|
|||||||
}
|
}
|
||||||
updateRuntimeWaterContactUniforms() {
|
updateRuntimeWaterContactUniforms() {
|
||||||
for (const binding of this.runtimeWaterContactUniforms) {
|
for (const binding of this.runtimeWaterContactUniforms) {
|
||||||
binding.uniform.value = createWaterContactPatchUniformValue(this.mergeRuntimeWaterContactPatches(binding.staticContactPatches, this.collectRuntimePlayerWaterContactPatches(binding.brush)));
|
const mergedPatches = this.mergeRuntimeWaterContactPatches(binding.staticContactPatches, this.collectRuntimePlayerWaterContactPatches(binding.brush));
|
||||||
|
binding.uniform.value = createWaterContactPatchUniformValue(mergedPatches);
|
||||||
|
binding.axisUniform.value = createWaterContactPatchAxisUniformValue(mergedPatches);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
clearModelInstances() {
|
clearModelInstances() {
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import { DEFAULT_INTERACTABLE_RADIUS, DEFAULT_PLAYER_START_BOX_SIZE, DEFAULT_PLA
|
|||||||
import { BOX_EDGE_IDS, BOX_FACE_IDS, BOX_VERTEX_IDS, cloneBoxBrushGeometry, deriveBoxBrushSizeFromGeometry, scaleBoxBrushGeometryToSize, DEFAULT_BOX_BRUSH_SIZE } from "../document/brushes";
|
import { BOX_EDGE_IDS, BOX_FACE_IDS, BOX_VERTEX_IDS, cloneBoxBrushGeometry, deriveBoxBrushSizeFromGeometry, scaleBoxBrushGeometryToSize, DEFAULT_BOX_BRUSH_SIZE } from "../document/brushes";
|
||||||
import { getBoxBrushEdgeAxis, getBoxBrushEdgeTransformMeta, getBoxBrushEdgeWorldSegment, getBoxBrushFaceAxis, getBoxBrushFaceTransformMeta, getBoxBrushFaceWorldCenter, getBoxBrushVertexWorldPosition, transformBoxBrushWorldPointToLocal, transformBoxBrushWorldVectorToLocal } from "../geometry/box-brush-components";
|
import { getBoxBrushEdgeAxis, getBoxBrushEdgeTransformMeta, getBoxBrushEdgeWorldSegment, getBoxBrushFaceAxis, getBoxBrushFaceTransformMeta, getBoxBrushFaceWorldCenter, getBoxBrushVertexWorldPosition, transformBoxBrushWorldPointToLocal, transformBoxBrushWorldVectorToLocal } from "../geometry/box-brush-components";
|
||||||
import { buildBoxBrushDerivedMeshData, getBoxBrushEdgeVertexIds, getBoxBrushFaceVertexIds, getBoxBrushLocalVertexPosition } from "../geometry/box-brush-mesh";
|
import { buildBoxBrushDerivedMeshData, getBoxBrushEdgeVertexIds, getBoxBrushFaceVertexIds, getBoxBrushLocalVertexPosition } from "../geometry/box-brush-mesh";
|
||||||
import { getBoxBrushBounds } from "../geometry/box-brush";
|
|
||||||
import { createModelColliderDebugGroup } from "../geometry/model-instance-collider-debug-mesh";
|
import { createModelColliderDebugGroup } from "../geometry/model-instance-collider-debug-mesh";
|
||||||
import { buildGeneratedModelCollider } from "../geometry/model-instance-collider-generation";
|
import { buildGeneratedModelCollider } from "../geometry/model-instance-collider-generation";
|
||||||
import { DEFAULT_GRID_SIZE, snapValueToGrid } from "../geometry/grid-snapping";
|
import { DEFAULT_GRID_SIZE, snapValueToGrid } from "../geometry/grid-snapping";
|
||||||
@@ -2205,7 +2204,12 @@ export class ViewportHost {
|
|||||||
if (brush.id === excludedBrushId || brush.volume.mode !== "none") {
|
if (brush.id === excludedBrushId || brush.volume.mode !== "none") {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
contactBounds.push(getBoxBrushBounds(brush));
|
contactBounds.push({
|
||||||
|
kind: "orientedBox",
|
||||||
|
center: brush.center,
|
||||||
|
rotationDegrees: brush.rotationDegrees,
|
||||||
|
size: brush.size
|
||||||
|
});
|
||||||
}
|
}
|
||||||
for (const modelInstance of getModelInstances(document.modelInstances)) {
|
for (const modelInstance of getModelInstances(document.modelInstances)) {
|
||||||
if (modelInstance.collision.mode === "none") {
|
if (modelInstance.collision.mode === "none") {
|
||||||
|
|||||||
Reference in New Issue
Block a user