@@ -12,6 +12,8 @@ import { parseModel, loadAndMergeModel, loadModelTexture, modelCacheKey, toRadia
1212
1313import work from 'webworkify-webpack' ;
1414import SkinRender from "../skin" ;
15+ import off from "onscreen/lib/methods/off" ;
16+
1517const 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