Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
238f7a6
Add avatar-optimizer.js
Apr 10, 2022
faeb7d6
Hook in optimized model test in avatars.js high quality mode
Apr 10, 2022
f16f82b
Exports cleanup
Apr 10, 2022
0cd0dbf
Hook in avatarOptimizer to metaversefile
Apr 10, 2022
751943d
Spacing cleanup
Apr 10, 2022
9e82965
Merge branch 'master' into avatar-optimizer
Apr 12, 2022
cf8d759
Bump three
Apr 12, 2022
96e3b46
Major avatar optimizer work
Apr 12, 2022
348d771
More major avatar optimizer work
Apr 12, 2022
8bc3a87
More major avatar optimizer work
Apr 12, 2022
a1b3510
Dead locals cleanup
Apr 12, 2022
3a7840b
Avatars spacing debugging
Apr 12, 2022
8daead8
Avatars.js hook in optimized model
Apr 12, 2022
8a531f1
Avatar optimizer morph targets latching
Apr 12, 2022
53355d3
Avatar optimizer material rewriting
Apr 12, 2022
2afcdef
Avatar optimizer return object with child meshes
Apr 12, 2022
1bd3160
More major avatar optimizer work
Apr 13, 2022
0d64491
Avatar optimizer cleanup
Apr 13, 2022
632bf57
UV remap debugging
Apr 13, 2022
8f89d68
New UV rewrite
Apr 13, 2022
bac652f
Hook in phong debug material to avatar optimizer
Apr 13, 2022
957a723
Avatar optimizer shader debugging
Apr 13, 2022
4a0f171
Port shade textures in avatar optimizer
Apr 13, 2022
bcc8e65
Remove avatar optimizer dead addendum
Apr 13, 2022
c0020be
Avatar optimizer commenting cleanup
Apr 13, 2022
b4a6ea5
Major avatar optimizer work
Apr 13, 2022
1b7a826
Update package-lock.json
Apr 13, 2022
2e06556
Only merge BufferGeometry in avatar optimizer
Apr 13, 2022
d36bfb9
Avatar optimizer logging cleanup
Apr 13, 2022
f4236cb
Avatar optimizer clamp uvs
Apr 13, 2022
461df17
Avatar optimizer atlas debug code cleanup
Apr 13, 2022
c5dccf3
Comment out avatar optimizer debug code
Apr 13, 2022
01bdb7c
Avatar optimizer cleanup
Apr 13, 2022
2dcc0c7
Avatar optimizer mod uvs instead of clamping
Apr 13, 2022
a0d9e95
Avatar optimizer refactoring
Apr 13, 2022
deb7a59
Add avatar optimizer caching
Apr 13, 2022
dfbcb10
Avatar optimizer textures aliasing
Apr 13, 2022
e776a79
Commented code cleanup
Apr 13, 2022
182e4b7
Merge branch 'master' into avatar-optimizer
Apr 21, 2022
78b2409
Merge branch 'master' into avatar-optimizer
Apr 22, 2022
f328cb0
Break out avatar optimizer crunching
Apr 22, 2022
3803225
Route avatar chruncher through avatar optimizer methods
Apr 22, 2022
7022d5e
Add geometry-texture-atlas.js
Apr 22, 2022
bf0844b
Dead code cleanup
Apr 22, 2022
b76091b
Avatar spriter export cleanup
Apr 23, 2022
d0e87a8
Avatar spriter imports cleanup
Apr 23, 2022
1f1ccbc
Avatar spriter rendering cleanup
Apr 23, 2022
6c99d92
Avatar spriter reset methods cleanup
Apr 23, 2022
7f5999f
Rename classes in avatar spriter
Apr 23, 2022
9cc9fdc
Avatars dead import cleanup
Apr 23, 2022
3657692
Avatars hook in more async subavatars rendering
Apr 23, 2022
6bfceb7
Add util.js modUv method
Apr 23, 2022
5591a43
Merge branch 'master' into avatar-optimizer
Jul 27, 2022
d2e6846
Add new exporters.js
Jul 28, 2022
5ed08d4
Add new avatar renderer
Jul 28, 2022
a6c7884
Latch new avatar renderer in avatars.js
Jul 28, 2022
57d9e47
Merge branch 'master' into bone-transplant
Jul 28, 2022
0332eac
Major morphs debugging
Jul 29, 2022
18fcd64
More morphs debugging
Jul 29, 2022
d42392e
Add more morph targets resolution
Jul 29, 2022
836280a
Merge branch 'master' into bone-transplant
Jul 29, 2022
86fad17
More morphs work
Jul 29, 2022
9c526b4
Temporarily lock out avatar icon
Jul 29, 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
470 changes: 35 additions & 435 deletions avatar-cruncher.js

Large diffs are not rendered by default.

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

Large diffs are not rendered by default.

88 changes: 36 additions & 52 deletions avatar-spriter.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import * as THREE from 'three';
// import easing from './easing.js';
import metaversefile from 'metaversefile';
const {useApp, useFrame, useLocalPlayer, usePhysics, useGeometries, useMaterials, useAvatarAnimations, useCleanup} = metaversefile;
// const {useApp, useFrame, useLocalPlayer, usePhysics, useGeometries, useMaterials, useAvatarAnimations, useCleanup} = metaversefile;
// import * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';
import {DoubleSidedPlaneGeometry, CameraGeometry} from './geometries.js';
import {WebaverseShaderMaterial} from './materials.js';
import Avatar from './avatars/avatars.js';
import {mod, angleDifference} from './util.js';

const preview = false; // whether to draw debug meshes

Expand Down Expand Up @@ -53,7 +54,7 @@ const alphaTest = 0.9;

const planeSpriteMeshes = [];
const spriteAvatarMeshes = [];
class SpritePlaneMesh extends THREE.Mesh {
class SpriteAnimationPlaneMesh extends THREE.Mesh {
constructor(tex, {angleIndex}) {
const planeSpriteMaterial = new WebaverseShaderMaterial({
uniforms: {
Expand Down Expand Up @@ -188,7 +189,7 @@ class SpritePlaneMesh extends THREE.Mesh {
return this;
}
}
class SpriteAvatarMesh extends THREE.Mesh {
class SpriteAnimation360Mesh extends THREE.Mesh {
constructor(tex) {
const avatarSpriteMaterial = new WebaverseShaderMaterial({
uniforms: {
Expand Down Expand Up @@ -320,13 +321,12 @@ class SpriteAvatarMesh extends THREE.Mesh {
this.customPostMaterial = new AvatarSpriteDepthMaterial(undefined, {
tex,
});
// return spriteAvatarMesh;

this.lastSpriteSpecName = '';
this.lastSpriteSpecTimestamp = 0;
}
}
class SpriteMegaAvatarMesh extends THREE.Mesh {
class SpriteAvatarMesh extends THREE.Mesh {
constructor(texs) {
const tex = texs[0];
const avatarMegaSpriteMaterial = new WebaverseShaderMaterial({
Expand Down Expand Up @@ -462,7 +462,9 @@ class SpriteMegaAvatarMesh extends THREE.Mesh {
this.texs = texs;
}
setTexture(name) {
const tex = this.texs.find(t => t.name === name);
const spriteSpecs = getSpriteSpecs();
const spriteSpecIndex = spriteSpecs.findIndex(spriteSpec => spriteSpec.name === name);
const tex = this.texs[spriteSpecIndex];
if (tex) {
this.material.uniforms.uTex.value = tex;
this.material.uniforms.uTex.needsUpdate = true;
Expand Down Expand Up @@ -682,14 +684,6 @@ class SpriteMegaAvatarMesh extends THREE.Mesh {
}
}

function mod(a, n) {
return ((a % n) + n) % n;
}
function angleDifference(angle1, angle2) {
let a = angle2 - angle1;
a = mod(a + Math.PI, Math.PI*2) - Math.PI;
return a;
}
const animationAngles = [
{name: 'left', angle: Math.PI/2},
{name: 'right', angle: -Math.PI/2},
Expand Down Expand Up @@ -782,7 +776,6 @@ const getSpriteSpecs = () => {
init({angle, avatar: localRig}) {
let positionOffset = 0;
return {
reset() {},
update(timestamp, timeDiffMs) {
// positionOffset -= walkSpeed/1000 * timeDiffMs;

Expand All @@ -806,7 +799,6 @@ const getSpriteSpecs = () => {
init({angle, avatar: localRig}) {
let positionOffset = 0;
return {
reset() {},
update(timestamp, timeDiffMs) {
positionOffset -= walkSpeed/1000 * timeDiffMs;

Expand All @@ -830,7 +822,6 @@ const getSpriteSpecs = () => {
init({angle, avatar: localRig}) {
let positionOffset = 0;
return {
reset() {},
update(timestamp, timeDiffMs) {
positionOffset -= walkSpeed/1000 * timeDiffMs;

Expand All @@ -854,7 +845,6 @@ const getSpriteSpecs = () => {
init({angle, avatar: localRig}) {
let positionOffset = 0;
return {
reset() {},
update(timestamp, timeDiffMs) {
positionOffset += walkSpeed/1000 * timeDiffMs;

Expand All @@ -878,7 +868,6 @@ const getSpriteSpecs = () => {
init({angle, avatar: localRig}) {
let positionOffset = 0;
return {
reset() {},
update(timestamp, timeDiffMs) {
positionOffset += walkSpeed/1000 * timeDiffMs;

Expand All @@ -902,7 +891,6 @@ const getSpriteSpecs = () => {
init({angle, avatar: localRig}) {
let positionOffset = 0;
return {
reset() {},
update(timestamp, timeDiffMs) {
positionOffset -= runSpeed/1000 * timeDiffMs;

Expand All @@ -926,7 +914,6 @@ const getSpriteSpecs = () => {
init({angle, avatar: localRig}) {
let positionOffset = 0;
return {
reset() {},
update(timestamp, timeDiffMs) {
positionOffset -= runSpeed/1000 * timeDiffMs;

Expand All @@ -950,7 +937,6 @@ const getSpriteSpecs = () => {
init({angle, avatar: localRig}) {
let positionOffset = 0;
return {
reset() {},
update(timestamp, timeDiffMs) {
positionOffset += runSpeed/1000 * timeDiffMs;

Expand All @@ -974,7 +960,6 @@ const getSpriteSpecs = () => {
init({angle, avatar: localRig}) {
let positionOffset = 0;
return {
reset() {},
update(timestamp, timeDiffMs) {
positionOffset += runSpeed/1000 * timeDiffMs;

Expand Down Expand Up @@ -1014,7 +999,6 @@ const getSpriteSpecs = () => {

localRig.update(timestamp, timeDiffMs);
},
reset() {},
cleanup() {
localRig.crouchTime = maxCrouchTime;
},
Expand Down Expand Up @@ -1043,7 +1027,6 @@ const getSpriteSpecs = () => {

localRig.update(timestamp, timeDiffMs);
},
reset() {},
cleanup() {
localRig.crouchTime = maxCrouchTime;
},
Expand Down Expand Up @@ -1072,7 +1055,6 @@ const getSpriteSpecs = () => {

localRig.update(timestamp, timeDiffMs);
},
reset() {},
cleanup() {
localRig.crouchTime = maxCrouchTime;
},
Expand Down Expand Up @@ -1101,7 +1083,6 @@ const getSpriteSpecs = () => {

localRig.update(timestamp, timeDiffMs);
},
reset() {},
cleanup() {
localRig.crouchTime = maxCrouchTime;
},
Expand Down Expand Up @@ -1130,7 +1111,6 @@ const getSpriteSpecs = () => {

localRig.update(timestamp, timeDiffMs);
},
reset() {},
cleanup() {
localRig.crouchTime = maxCrouchTime;
},
Expand Down Expand Up @@ -1180,8 +1160,7 @@ const getSpriteSpecs = () => {
init({angle, avatar: localRig}) {
let positionOffset = 0;

const defaultJumpTime = 0;
let jumpTime = defaultJumpTime;
let jumpTime = 0;
// const jumpIncrementSpeed = 400;

return {
Expand Down Expand Up @@ -1209,7 +1188,7 @@ const getSpriteSpecs = () => {
localRig.update(timestamp, timeDiffMs);
},
reset() {
jumpTime = defaultJumpTime;
jumpTime = 0;
},
cleanup() {
localRig.jumpState = false;
Expand Down Expand Up @@ -1507,7 +1486,7 @@ class AvatarSpriteDepthMaterial extends THREE.MeshNormalMaterial {
}
}

const _renderSpriteImages = skinnedVrm => {
export const renderSpriteImages = skinnedVrm => {
const localRig = new Avatar(skinnedVrm, {
fingers: true,
hair: true,
Expand Down Expand Up @@ -1583,12 +1562,13 @@ const _renderSpriteImages = skinnedVrm => {
const canvas = document.createElement('canvas');
canvas.width = size;
canvas.height = size;
// canvas.style.cssText = `position: fixed; top: ${canvasIndex2*1024}px; left: 0; width: 1024px; height: 1024px; z-index: 10;`;
const ctx = canvas.getContext('2d');
const tex = new THREE.Texture(canvas);
tex.name = name;
// tex.minFilter = THREE.NearestFilter;
// tex.magFilter = THREE.NearestFilter;

let tex;
if (preview) {
tex = new THREE.Texture(canvas);
tex.name = name;
}
let canvasIndex = 0;

// console.log('generate sprite', name);
Expand Down Expand Up @@ -1616,7 +1596,6 @@ const _renderSpriteImages = skinnedVrm => {
// pre-run the animation one cycle first, to stabilize the hair physics
let now = 0;
const startAngleIndex = angleIndex;
// localRig.springBoneManager.reset();
{
const startNow = now;
for (let j = 0; j < numFrames; j++) {
Expand All @@ -1628,7 +1607,7 @@ const _renderSpriteImages = skinnedVrm => {
}
const initialPositionOffset = localRig.inputs.hmd.position.z;

spriteGenerator.reset();
spriteGenerator.reset && spriteGenerator.reset();

// now perform the real capture
const startNow = now;
Expand Down Expand Up @@ -1658,13 +1637,15 @@ const _renderSpriteImages = skinnedVrm => {
0, renderer.domElement.height - texSize, texSize, texSize,
x * texSize, y * texSize, texSize, texSize
);
tex.needsUpdate = true;
if (preview) {
tex.needsUpdate = true;
}

// await _timeout(50);
}

if (preview) {
const planeSpriteMesh = new SpritePlaneMesh(tex, {
const planeSpriteMesh = new SpriteAnimationPlaneMesh(tex, {
angleIndex: startAngleIndex,
});
planeSpriteMesh.position.set(-canvasIndex*worldSize, 2, -canvasIndex2*worldSize);
Expand All @@ -1680,7 +1661,7 @@ const _renderSpriteImages = skinnedVrm => {
}

if (preview) {
const spriteAvatarMesh = new SpriteAvatarMesh(tex);
const spriteAvatarMesh = new SpriteAnimation360Mesh(tex);
spriteAvatarMesh.position.set(
-canvasIndex*worldSize,
0,
Expand All @@ -1694,18 +1675,21 @@ const _renderSpriteImages = skinnedVrm => {

canvasIndex2++;

spriteImages.push(tex);
spriteImages.push(canvas);
}
// console.timeEnd('render');

return spriteImages;
};
function createSpriteMegaMesh(skinnedVrm) {
const spriteImages = _renderSpriteImages(skinnedVrm);
const spriteMegaAvatarMesh = new SpriteMegaAvatarMesh(spriteImages);
return spriteMegaAvatarMesh;
}

export {
createSpriteMegaMesh
export const createSpriteAvatarMeshFromTextures = spriteImages => {
const spriteTextures = spriteImages.map(img => {
const t = new THREE.Texture(img);
t.needsUpdate = true;
return t;
});
const spriteAvatarMesh = new SpriteAvatarMesh(spriteTextures);
return spriteAvatarMesh;
};
export const createSpriteAvatarMesh = skinnedVrm => {
const spriteImages = renderSpriteImages(skinnedVrm);
return createSpriteAvatarMeshFromTextures(spriteImages);
};
Loading