Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
125 commits
Select commit Hold shift + click to select a range
d17fac8
Bump totum
Aug 8, 2022
f960f70
Add avatar-optimizer.js
Apr 10, 2022
d9b8cad
Hook in optimized model test in avatars.js high quality mode
Apr 10, 2022
018d815
Exports cleanup
Apr 10, 2022
ef0e6e2
Hook in avatarOptimizer to metaversefile
Apr 10, 2022
94449fa
Spacing cleanup
Apr 10, 2022
921ffe0
Major avatar optimizer work
Apr 12, 2022
0b57a2c
More major avatar optimizer work
Apr 12, 2022
72fc5db
More major avatar optimizer work
Apr 12, 2022
16ee09d
Dead locals cleanup
Apr 12, 2022
32225af
Avatars spacing debugging
Apr 12, 2022
681fe32
Avatars.js hook in optimized model
Apr 12, 2022
f00ec0f
Avatar optimizer morph targets latching
Apr 12, 2022
88fd094
Avatar optimizer material rewriting
Apr 12, 2022
76dc695
Avatar optimizer return object with child meshes
Apr 12, 2022
091a50e
More major avatar optimizer work
Apr 13, 2022
b62b0fe
Avatar optimizer cleanup
Apr 13, 2022
66e3eda
UV remap debugging
Apr 13, 2022
2805b59
New UV rewrite
Apr 13, 2022
926d084
Hook in phong debug material to avatar optimizer
Apr 13, 2022
c9cc753
Avatar optimizer shader debugging
Apr 13, 2022
f6bc594
Port shade textures in avatar optimizer
Apr 13, 2022
44e2710
Remove avatar optimizer dead addendum
Apr 13, 2022
4f5c585
Avatar optimizer commenting cleanup
Apr 13, 2022
4c86ecd
Major avatar optimizer work
Apr 13, 2022
1f1bdd9
Update package-lock.json
Apr 13, 2022
66c03b0
Only merge BufferGeometry in avatar optimizer
Apr 13, 2022
396ea5e
Avatar optimizer logging cleanup
Apr 13, 2022
111ac61
Avatar optimizer clamp uvs
Apr 13, 2022
314ceac
Avatar optimizer atlas debug code cleanup
Apr 13, 2022
c30ff6b
Comment out avatar optimizer debug code
Apr 13, 2022
bd5835b
Avatar optimizer cleanup
Apr 13, 2022
952f971
Avatar optimizer mod uvs instead of clamping
Apr 13, 2022
1bdb5ca
Avatar optimizer refactoring
Apr 13, 2022
69af042
Add avatar optimizer caching
Apr 13, 2022
0d09c1e
Avatar optimizer textures aliasing
Apr 13, 2022
c09dab8
Commented code cleanup
Apr 13, 2022
d03b9bc
Break out avatar optimizer crunching
Apr 22, 2022
02518d5
Route avatar chruncher through avatar optimizer methods
Apr 22, 2022
58f9b4d
Add geometry-texture-atlas.js
Apr 22, 2022
7393da6
Dead code cleanup
Apr 22, 2022
8445503
Avatar spriter export cleanup
Apr 23, 2022
28bffcc
Avatar spriter imports cleanup
Apr 23, 2022
f197721
Avatar spriter rendering cleanup
Apr 23, 2022
9a6d88f
Avatar spriter reset methods cleanup
Apr 23, 2022
fcd7257
Rename classes in avatar spriter
Apr 23, 2022
5a51335
Avatars dead import cleanup
Apr 23, 2022
868342d
Avatars hook in more async subavatars rendering
Apr 23, 2022
136ba22
Add new exporters.js
Jul 28, 2022
4f6e6b2
Add new avatar renderer
Jul 28, 2022
b5b2e94
Latch new avatar renderer in avatars.js
Jul 28, 2022
2093ca3
Major morphs debugging
Jul 29, 2022
ae29627
More morphs debugging
Jul 29, 2022
1d7a2b0
Add more morph targets resolution
Jul 29, 2022
b424791
More morphs work
Jul 29, 2022
3a94afe
Temporarily lock out avatar icon
Jul 29, 2022
ca2d4db
Bugfix avatar-renderer morphs bind
Aug 10, 2022
213525c
Avatar renderer code cleanup
Aug 10, 2022
b893ee2
More major avatars optimization cleanup
Aug 10, 2022
5290612
Avatar optimizer code cleanup
Aug 10, 2022
da9c5d4
Bugfix avatar optimizer texture encoding copy
Aug 10, 2022
0848d45
Avatar renderer quality settings attachment
Aug 10, 2022
19b49e6
Clean up model initialization in avatars.js
Aug 10, 2022
e29fbf6
Avatar optimizer return GLB data
Aug 10, 2022
74feed2
PAss through abord controller in avatar renderer
Aug 10, 2022
64e7946
Avatar renderr cleanup
Aug 10, 2022
1aa3d86
Avatar renderer current mesh API cleanup
Aug 10, 2022
276c0f2
Avatar.js avatar renderer cleanup
Aug 10, 2022
67975a9
More avatar renderer load work
Aug 10, 2022
b7ab821
Avatar renderer commenting
Aug 10, 2022
262b3b0
Avatar renderer load debugging
Aug 10, 2022
9744811
Avatar renderer logging cleanup
Aug 10, 2022
a6672a0
Avatar renderer culling
Aug 10, 2022
7b45d63
Hook in avatar renderer abort
Aug 10, 2022
a0bbaf2
Offscreen engine abort cleanup
Aug 10, 2022
ed0a040
Add avatars frustum culling
Aug 10, 2022
521bfdb
Add instancing optimization comment
Aug 10, 2022
f80801d
Remove auto set quality from TabGraphics
Aug 10, 2022
e35f8cd
Rewrite avatar renderer to use bound control object
Aug 10, 2022
261c066
Use new avatar renderer in avatars.js
Aug 10, 2022
4bbe1b8
Expose AvatarRenderer in metaversefile-api.js
Aug 10, 2022
4d35e40
Add avatars adjustQuality method
Aug 11, 2022
53a7347
Update player avatar binding to use new avatar renderer
Aug 11, 2022
3c8eda5
Add avatar quality adjustment keyboard shortcut
Aug 11, 2022
6247aac
Add binary export from avatar cruncher
Aug 11, 2022
4605df9
Webaverse.js syntax
Aug 11, 2022
8e86d94
Avatar cruncher rewrite
Aug 11, 2022
713c911
Remove alpha to coverage toggling
Aug 11, 2022
debf260
Add missing user.png
Aug 11, 2022
f6b8d46
Avatar spriter compute bounding sphere
Aug 12, 2022
1e6f100
Update avatar spriter to work on avatar renderer
Aug 12, 2022
ef8a586
Avatar renderer defer offscreen engine creation
Aug 12, 2022
e8f9fcd
More avatar renderer code work
Aug 12, 2022
aa9d495
Add min/max avatar quality constants
Aug 12, 2022
6015988
Use avatar quality constants in avatar renderer
Aug 12, 2022
d53e269
Add avatar spriter canvas debugging
Aug 12, 2022
80dc5c0
Small util.js cleanup
Aug 12, 2022
fa1f77e
Add util.js getJsDataUrl method
Aug 12, 2022
194ac55
Set default avatar quality to max
Aug 12, 2022
db3b793
Update avatar spriter API
Aug 12, 2022
0c62a62
Add local createSpriteAvatarMesh method
Aug 12, 2022
97d2ff4
Clean up avatar spriter canvas debugging
Aug 12, 2022
9bec8af
Add avatar spriter updateAvatar method
Aug 12, 2022
9d26929
Hook in avatars.js updateAvatar method for avatar sprites
Aug 12, 2022
cd8e82e
Abstract engine worker getJsDataUrl method
Aug 12, 2022
1932359
Offscreen engine proxy/direct cleanup
Aug 12, 2022
e80f1d1
Avatar renderer commenting cleanup
Aug 12, 2022
f1e6817
Use MeshBasicMaterial for avatar cruncher
Aug 12, 2022
5eed31b
Bugfix abort error passthrough in offscreen engine
Aug 12, 2022
dd138cb
Rewrite abort handling in avatar renderer
Aug 12, 2022
d53fa62
Bugfix avatar renderer placeholder icon
Aug 12, 2022
5ddcef4
Avatar renderer switch icon
Aug 12, 2022
7811099
Clean up avatar placeholder mesh
Aug 12, 2022
5e8a117
Avatar loading icon checkpoint
Aug 12, 2022
00d8354
Checkpoint avatar loading
Aug 12, 2022
cf4793b
Clean up avatar load placeholder
Aug 12, 2022
77ffb58
Bugfix optimized avatar hair mesh shader
Aug 13, 2022
06918f7
Bump totum
Aug 14, 2022
aab7512
Major avatar spriter work
Aug 14, 2022
97699d5
Small import cleanup
Aug 14, 2022
6ce0869
Major avatar spriter debugging
Aug 14, 2022
e7b206a
Avatar spriter disable preview mode
Aug 14, 2022
b6f2be2
Replace avatar spriter wait for key with wait for idle
Aug 14, 2022
f99f089
Avatar spirter do not latch canvases to document
Aug 14, 2022
a7909df
Avatar renderer sprite optimizer run off main thread
Aug 14, 2022
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
539 changes: 98 additions & 441 deletions avatar-cruncher.js

Large diffs are not rendered by default.

680 changes: 680 additions & 0 deletions avatar-optimizer.js

Large diffs are not rendered by default.

366 changes: 214 additions & 152 deletions avatar-spriter.js

Large diffs are not rendered by default.

876 changes: 876 additions & 0 deletions avatars/avatar-renderer.js

Large diffs are not rendered by default.

123 changes: 35 additions & 88 deletions avatars/avatars.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,14 @@ import {
import {
crouchMaxTime,
// useMaxTime,
aimMaxTime,
// aimMaxTime,
aimTransitionMaxTime,
// avatarInterpolationFrameRate,
// avatarInterpolationTimeDelay,
// avatarInterpolationNumFrames,
} from '../constants.js';
// import {FixedTimeStep} from '../interpolants.js';
import * as avatarCruncher from '../avatar-cruncher.js';
import * as avatarSpriter from '../avatar-spriter.js';
// import {AvatarRenderer} from './avatar-renderer.js';
// import * as sceneCruncher from '../scene-cruncher.js';
import {
idleFactorSpeed,
Expand Down Expand Up @@ -59,15 +58,12 @@ import Looker from './Looker.js'

import * as wind from './simulation/wind.js';


const localVector = new THREE.Vector3();
const localVector2 = new THREE.Vector3();
const localVector3 = new THREE.Vector3();
// const localVector4 = new THREE.Vector3();
// const localVector5 = new THREE.Vector3();
// const localVector6 = new THREE.Vector3();


const localQuaternion = new THREE.Quaternion();
const localQuaternion2 = new THREE.Quaternion();
// const localQuaternion3 = new THREE.Quaternion();
Expand All @@ -78,7 +74,8 @@ const localEuler = new THREE.Euler(0, 0, 0, 'YXZ');
const localEuler2 = new THREE.Euler(0, 0, 0, 'YXZ');
const localMatrix = new THREE.Matrix4();
const localMatrix2 = new THREE.Matrix4();
// const localPlane = new THREE.Plane();
// const localPlane = new THREE.Plane();
const localFrustum = new THREE.Frustum();

const textEncoder = new TextEncoder();

Expand Down Expand Up @@ -321,8 +318,8 @@ const _makeDebugMesh = (avatar) => {
mesh.setFromAvatar = avatar => {
for (const k in avatar.modelBoneOutputs) {
const modelBone = avatar.modelBoneOutputs[k];

const meshBone = modelBoneToMeshBoneMap.get(modelBone);

(modelBone.parent ?
modelBone.parent.matrixWorld
:
Expand Down Expand Up @@ -397,11 +394,9 @@ const _makeDebugMesh = (avatar) => {
// const testMesh = new THREE.Mesh(g, m);
// scene.add(testMesh);



class Avatar {
constructor(object, options = {}) {
if (!object) {
constructor(avatarRenderer, options = {}) {
/* if (!object) {
object = {};
}
if (!object.parser) {
Expand All @@ -410,40 +405,30 @@ class Avatar {
extensions: {},
},
};
}
} */

this.avatarRenderer = avatarRenderer;
this.isLocalPlayer = options.isLocalPlayer !== undefined ? options.isLocalPlayer : true;
const object = avatarRenderer.controlObject;
this.object = object;

const model = (() => {
let o = object;
if (o && !o.isMesh) {
o = o.scene;
}
/* if (!o) {
const scene = new THREE.Scene();

const skinnedMesh = new THREE.Object3D();
skinnedMesh.isSkinnedMesh = true;
skinnedMesh.skeleton = null;
skinnedMesh.bind = function(skeleton) {
this.skeleton = skeleton;
};
skinnedMesh.bind(_importSkeleton(skeletonString));
scene.add(skinnedMesh);

const hips = _findHips(skinnedMesh.skeleton);
const armature = _findArmature(hips);
scene.add(armature);
if (!this.object) {
debugger;
}

o = scene;
} */
return o;
})();
const model = this.object.scene;
this.model = model; // XXX still needed?
this.model.visible = false;

/* {
this.renderer = new AvatarRenderer(object);
scene.add(this.renderer.scene);
this.renderer.scene.updateMatrixWorld();
} */

this.model = model;
this.spriteMegaAvatarMesh = null;
this.crunchedModel = null;
this.optimizedModel = null;
this.options = options;

this.vrmExtension = object?.parser?.json?.extensions?.VRM;
Expand All @@ -459,10 +444,10 @@ class Avatar {
flipZ,
flipY,
flipLeg,
tailBones,
armature,
armatureQuaternion,
armatureMatrixInverse,
// tailBones,
// armature,
// armatureQuaternion,
// armatureMatrixInverse,
// retargetedAnimations,
} = Avatar.bindAvatar(object);
this.skinnedMeshes = skinnedMeshes;
Expand Down Expand Up @@ -878,6 +863,8 @@ class Avatar {
this.microphoneWorker = null;
this.volume = 0;

// this.quality = 4;

this.shoulderTransforms.Start();
this.legsManager.Start();

Expand Down Expand Up @@ -1408,40 +1395,7 @@ class Avatar {
return localEuler.y;
}
async setQuality(quality) {

this.model.visible = false;
if ( this.crunchedModel ) this.crunchedModel.visible = false;
if ( this.spriteMegaAvatarMesh ) this.spriteMegaAvatarMesh.visible = false;

switch (quality) {
case 1: {
const skinnedMesh = await this.object.cloneVrm();
this.spriteMegaAvatarMesh = this.spriteMegaAvatarMesh ?? avatarSpriter.createSpriteMegaMesh( skinnedMesh );
scene.add( this.spriteMegaAvatarMesh );
this.spriteMegaAvatarMesh.visible = true;
break;
}
case 2: {
this.crunchedModel = this.crunchedModel ?? avatarCruncher.crunchAvatarModel( this.model );
this.crunchedModel.frustumCulled = false;
scene.add( this.crunchedModel );
this.crunchedModel.visible = true;
break;
}
case 3: {
console.log('not implemented'); // XXX
this.model.visible = true;
break;
}
case 4: {
console.log('not implemented'); // XXX
this.model.visible = true;
break;
}
default: {
throw new Error('unknown avatar quality: ' + quality);
}
}
await this.avatarRenderer.setQuality(quality);
}
lerpShoulderTransforms() {
if (this.shoulderTransforms.handsEnabled[0]) {
Expand Down Expand Up @@ -1858,17 +1812,6 @@ class Avatar {
}
};


const _updateSubAvatars = () => {
if (this.spriteMegaAvatarMesh) {
this.spriteMegaAvatarMesh.update(timestamp, timeDiff, {
playerAvatar: this,
camera,
});
}
};


const _motionControls = () => {
this.sdkInputs.hmd.position.copy(this.inputs.hmd.position);
this.sdkInputs.hmd.quaternion.copy(this.inputs.hmd.quaternion);
Expand Down Expand Up @@ -1996,7 +1939,8 @@ class Avatar {
this.emoter.update(now);

this.options.visemes && _updateVisemes();
_updateSubAvatars();

this.avatarRenderer.update(timestamp, timeDiff, this);

const debug = metaversefile.useDebug();
if (debug.enabled && !this.debugMesh) {
Expand Down Expand Up @@ -2180,6 +2124,9 @@ class Avatar {
} */

destroy() {
this.avatarRenderer.destroy();
scene.remove(this.avatarRenderer.scene);

this.setAudioEnabled(false);
}
}
Expand Down
5 changes: 3 additions & 2 deletions character-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import {getRenderer, scene, camera, dolly} from './renderer.js';
import physicsManager from './physics-manager.js';
import {world} from './world.js';
// import cameraManager from './camera-manager.js';
import physx from './physx.js';
// import physx from './physx.js';
import audioManager from './audio-manager.js';
import metaversefile from 'metaversefile';
import {
Expand All @@ -23,7 +23,7 @@ import {
activateMaxTime,
// useMaxTime,
aimTransitionMaxTime,
avatarInterpolationFrameRate,
// avatarInterpolationFrameRate,
avatarInterpolationTimeDelay,
avatarInterpolationNumFrames,
// groundFriction,
Expand Down Expand Up @@ -1062,6 +1062,7 @@ class LocalPlayer extends UninterpolatedPlayer {
async setAvatarUrl(u) {
const localAvatarEpoch = ++this.avatarEpoch;
const avatarApp = await this.appManager.addTrackedApp(u);
// avatarApp.parent.remove(avatarApp);
if (this.avatarEpoch !== localAvatarEpoch) {
this.appManager.removeTrackedApp(avatarApp.instanceId);
return;
Expand Down
8 changes: 5 additions & 3 deletions character-fx.js
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,13 @@ class CharacterFx {

const _initHairMeshes = () => {
this.hairMeshes = [];
this.player.avatar.object.scene.traverse(o => {
const avatarRenderer = this.player.avatar.avatarRenderer;
const model = avatarRenderer.quality === 4 ? avatarRenderer.mesh : null;
model && model.traverse(o => {
// console.log(o.name, o.isMesh);
if (o.isSkinnedMesh) {
const {geometry, skeleton} = o;
const skeletonBoneHariBooleans = skeleton.bones.map(bone => /hair/i.test(bone.name));
const skeletonBoneHairBooleans = skeleton.bones.map(bone => /hair/i.test(bone.name));
const {attributes, index: indexAttribute} = geometry;
const indices = indexAttribute.array;
const {skinIndex, skinWeight} = attributes;
Expand All @@ -128,7 +130,7 @@ class CharacterFx {
for (let j = 0; j < itemSize; j++) {
const skinIndex = skinIndices[index * itemSize + j];
const skinWeight = skinWeights[index * itemSize + j];
if (skinWeight !== 0 && skeletonBoneHariBooleans[skinIndex]) {
if (skinWeight !== 0 && skeletonBoneHairBooleans[skinIndex]) {
this.hairMeshes.push(o);
done = true;
break;
Expand Down
4 changes: 4 additions & 0 deletions constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,10 @@ export const defaultDioramaSize = 512;
export const defaultChunkSize = 16;
export const defaultWorldSeed = 100;

export const minAvatarQuality = 1;
export const maxAvatarQuality = 4;
export const defaultAvatarQuality = 3;

export const defaultVoiceEndpoint = `Sweetie Belle`;
export const defaultVoicePackName = `ShiShi voice pack`;

Expand Down
11 changes: 5 additions & 6 deletions engine-worker.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import {
bindCanvas,
} from './renderer.js';
import {bindCanvas} from './renderer.js';
import {getJsDataUrl} from './util.js';

window.addEventListener('message', e => {
const method = e.data?.method;
Expand Down Expand Up @@ -85,7 +84,7 @@ const _bindPort = port => {
let error = null;
let result = null;
try {
const u = `data:application/javascript;charset=utf-8,${encodeURIComponent(src)}`;
const u = getJsDataUrl(src);
const module = await import2(u);
if (typeof module.default === 'function') {
const fn = module.default;
Expand Down Expand Up @@ -138,10 +137,10 @@ window.innerHeight = canvas.height;
window.devicePixelRatio = 1;
bindCanvas(canvas);

const match = location.hash.match(/^#id=(.+)$/);
/* const match = location.hash.match(/^#id=(.+)$/);
const id = match ? match[1] : null;
if (id) {
// nothing
} else {
throw new Error('no id in engine worker');
}
} */
14 changes: 14 additions & 0 deletions exporters.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import {GLTFExporter} from 'three/examples/jsm/exporters/GLTFExporter.js';
import {memoize} from './util.js';

const _gltfExporter = memoize(() => {
const gltfExporter = new GLTFExporter();
return gltfExporter;
});

const exporters = {
get gltfExporter() {
return _gltfExporter();
},
};
export default exporters;
Loading