Skip to content

Commit b963c60

Browse files
store instance info by position
1 parent 940989d commit b963c60

1 file changed

Lines changed: 32 additions & 21 deletions

File tree

src/model/index.js

Lines changed: 32 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import { parseModel, loadAndMergeModel, loadModelTexture, modelCacheKey, toRadia
1212

1313
import work from 'webworkify-webpack';
1414
import SkinRender from "../skin";
15+
import off from "onscreen/lib/methods/off";
16+
1517
const ModelWorker = require.resolve("./ModelWorker.js");
1618

1719

@@ -88,6 +90,7 @@ class ModelRender extends Render {
8890
this.renderType = "ModelRender";
8991

9092
this.models = [];
93+
this.instancePositionMap = {};
9194
this.attached = false;
9295
}
9396

@@ -144,7 +147,7 @@ function parseModels(modelRender, models, parsedModelList) {
144147

145148
// parsePromises.push(parseModel(model, model, parsedModelList, modelRender.options.assetRoot))
146149
parsePromises.push(new Promise(resolve => {
147-
if(modelRender.options.useWebWorkers) {
150+
if (modelRender.options.useWebWorkers) {
148151
let w = work(ModelWorker);
149152
w.addEventListener('message', event => {
150153
parsedModelList.push(...event.data.parsedModelList);
@@ -157,8 +160,8 @@ function parseModels(modelRender, models, parsedModelList) {
157160
parsedModelList: parsedModelList,
158161
assetRoot: modelRender.options.assetRoot
159162
})
160-
}else{
161-
parseModel(model, model, parsedModelList, modelRender.options.assetRoot).then(()=>{
163+
} else {
164+
parseModel(model, model, parsedModelList, modelRender.options.assetRoot).then(() => {
162165
resolve();
163166
})
164167
}
@@ -192,13 +195,12 @@ function loadAndMergeModels(modelRender, parsedModelList) {
192195
console.debug("loadAndMerge " + cacheKey);
193196

194197

195-
196198
if (mergedModelCache.hasOwnProperty(cacheKey)) {
197199
resolve();
198200
return;
199201
}
200202

201-
if(modelRender.options.useWebWorkers) {
203+
if (modelRender.options.useWebWorkers) {
202204
let w = work(ModelWorker);
203205
w.addEventListener('message', event => {
204206
mergedModelCache[cacheKey] = event.data.mergedModel;
@@ -209,8 +211,8 @@ function loadAndMergeModels(modelRender, parsedModelList) {
209211
model: model,
210212
assetRoot: modelRender.options.assetRoot
211213
});
212-
}else{
213-
loadAndMergeModel(model,modelRender.options.assetRoot).then((mergedModel)=>{
214+
} else {
215+
loadAndMergeModel(model, modelRender.options.assetRoot).then((mergedModel) => {
214216
mergedModelCache[cacheKey] = mergedModel;
215217
resolve();
216218
})
@@ -261,7 +263,7 @@ function loadModelTextures(modelRender, parsedModelList) {
261263
return;
262264
}
263265

264-
if(modelRender.options.useWebWorkers) {
266+
if (modelRender.options.useWebWorkers) {
265267
let w = work(ModelWorker);
266268
w.addEventListener('message', event => {
267269
loadedTextureCache[cacheKey] = event.data.textures;
@@ -272,8 +274,8 @@ function loadModelTextures(modelRender, parsedModelList) {
272274
textures: mergedModel.textures,
273275
assetRoot: modelRender.options.assetRoot
274276
});
275-
}else{
276-
loadTextures(mergedModel.textures, modelRender.options.assetRoot).then((textures)=>{
277+
} else {
278+
loadTextures(mergedModel.textures, modelRender.options.assetRoot).then((textures) => {
277279
loadedTextureCache[cacheKey] = textures;
278280
resolve();
279281
})
@@ -357,11 +359,20 @@ let renderModel = function (modelRender, model, textures, textureNames, type, na
357359
let _v3s = new THREE.Vector3();
358360
let _q = new THREE.Quaternion();
359361

362+
let instanceInfo = {
363+
key: modelKey,
364+
index: instanceIndex,
365+
offset: offset,
366+
scale: scale,
367+
rotation: rotation
368+
};
369+
360370
if (rotation) {
361371
mesh.setQuaternionAt(instanceIndex, _q.setFromEuler(new THREE.Euler(toRadians(rotation[0]), toRadians(Math.abs(rotation[0]) > 0 ? rotation[1] : -rotation[1]), toRadians(rotation[2]))));
362372
}
363373
if (offset) {
364374
mesh.setPositionAt(instanceIndex, _v3o.set(offset[0], offset[1], offset[2]));
375+
modelRender.instancePositionMap[offset[0] + "_" + offset[1] + "_" + offset[2]] = instanceInfo;
365376
}
366377
if (scale) {
367378
mesh.setScaleAt(instanceIndex, _v3s.set(scale[0], scale[1], scale[2]));
@@ -516,7 +527,7 @@ let renderModel = function (modelRender, model, textures, textureNames, type, na
516527
};
517528

518529
promises.push(new Promise((resolve) => {
519-
let baseName =name.replaceAll(" ", "_").replaceAll("-", "_").toLowerCase() + "_" + (element.__comment ? element.__comment.replaceAll(" ", "_").replaceAll("-", "_").toLowerCase() + "_" : "");
530+
let baseName = name.replaceAll(" ", "_").replaceAll("-", "_").toLowerCase() + "_" + (element.__comment ? element.__comment.replaceAll(" ", "_").replaceAll("-", "_").toLowerCase() + "_" : "");
520531
createCube(element.to[0] - element.from[0], element.to[1] - element.from[1], element.to[2] - element.from[2],
521532
baseName + Date.now(),
522533
element.faces, fallbackFaces, textures, textureNames, modelRender.options.assetRoot, baseName)
@@ -705,7 +716,7 @@ let createCube = function (width, height, depth, name, faces, fallbackFaces, tex
705716

706717
let canvasKey = textureRef + "_" + f + "_" + baseName;
707718

708-
let processImgToCanvasData = (img)=>{
719+
let processImgToCanvasData = (img) => {
709720
let uv = face.uv;
710721
if (!uv) {
711722
// console.warn("Missing UV mapping for face " + f + " in model " + name + ". Using defaults");
@@ -754,7 +765,7 @@ let createCube = function (width, height, depth, name, faces, fallbackFaces, tex
754765
}
755766
}
756767

757-
let dataUrl = canvas.toDataURL("image/png");
768+
let dataUrl = canvas.toDataURL("image/png");
758769
let dataHash = md5(dataUrl);
759770

760771
let d = {
@@ -765,17 +776,17 @@ let createCube = function (width, height, depth, name, faces, fallbackFaces, tex
765776
width: canvas.width,
766777
height: canvas.height
767778
};
768-
console.debug("Caching new canvas ("+canvasKey+"/"+dataHash+")")
779+
console.debug("Caching new canvas (" + canvasKey + "/" + dataHash + ")")
769780
canvasCache[canvasKey] = d;
770781
return d;
771782
};
772783

773-
let loadTextureFromCanvas = (canvas)=>{
784+
let loadTextureFromCanvas = (canvas) => {
774785

775786

776787
let loadTextureDefault = function (canvas) {
777788
let data = canvas.dataUrl;
778-
let hash =canvas.dataUrlHash;
789+
let hash = canvas.dataUrlHash;
779790
let hasTransparency = canvas.hasTransparency;
780791

781792
if (materialCache.hasOwnProperty(hash)) {// Use material from cache
@@ -931,11 +942,11 @@ let createCube = function (width, height, depth, name, faces, fallbackFaces, tex
931942
let cachedCanvas = canvasCache[canvasKey];
932943

933944
if (cachedCanvas.hasOwnProperty("img")) {
934-
console.debug("Waiting for canvas image that's already loading ("+canvasKey+")")
935-
let img= cachedCanvas.img;
936-
img.waitingForCanvas.push(function (canvas) {
937-
loadTextureFromCanvas(canvas);
938-
});
945+
console.debug("Waiting for canvas image that's already loading (" + canvasKey + ")")
946+
let img = cachedCanvas.img;
947+
img.waitingForCanvas.push(function (canvas) {
948+
loadTextureFromCanvas(canvas);
949+
});
939950
} else {
940951
console.debug("Using cached canvas (" + canvasKey + ")")
941952
loadTextureFromCanvas(canvasCache[canvasKey]);

0 commit comments

Comments
 (0)