David Catuhe 5 سال پیش
والد
کامیت
a41662657d

+ 4 - 0
inspector/src/components/actionTabs/tabs/propertyGrids/meshes/bonePropertyGridComponent.tsx

@@ -42,6 +42,10 @@ export class BonePropertyGridComponent extends React.Component<IBonePropertyGrid
                     <TextLineComponent label="Index" value={bone.getIndex().toString()} />
                     <TextLineComponent label="Index" value={bone.getIndex().toString()} />
                     <TextLineComponent label="Unique ID" value={bone.uniqueId.toString()} />
                     <TextLineComponent label="Unique ID" value={bone.uniqueId.toString()} />
                     {
                     {
+                        bone.getParent() &&
+                        <TextLineComponent label="Parent" value={bone.getParent()!.name} onLink={() => this.props.globalState.onSelectionChangedObservable.notifyObservers(bone.getParent())}/>
+                    }                    
+                    {
                         bone.getTransformNode() &&
                         bone.getTransformNode() &&
                         <TextLineComponent label="Linked node" value={bone.getTransformNode()!.name} onLink={() => this.onTransformNodeLink()}/>
                         <TextLineComponent label="Linked node" value={bone.getTransformNode()!.name} onLink={() => this.onTransformNodeLink()}/>
                     }
                     }

+ 4 - 0
inspector/src/components/actionTabs/tabs/propertyGrids/meshes/meshPropertyGridComponent.tsx

@@ -298,6 +298,10 @@ export class MeshPropertyGridComponent extends React.Component<IMeshPropertyGrid
                     <TextLineComponent label="Faces" value={(mesh.getTotalIndices() / 3).toFixed(0)} />
                     <TextLineComponent label="Faces" value={(mesh.getTotalIndices() / 3).toFixed(0)} />
                     <TextLineComponent label="Sub-meshes" value={mesh.subMeshes ? mesh.subMeshes.length.toString() : "0"} />
                     <TextLineComponent label="Sub-meshes" value={mesh.subMeshes ? mesh.subMeshes.length.toString() : "0"} />
                     {
                     {
+                        mesh.parent &&
+                        <TextLineComponent label="Parent" value={mesh.parent.name} onLink={() => this.props.globalState.onSelectionChangedObservable.notifyObservers(mesh.parent)}/>
+                    }                      
+                    {
                         mesh.skeleton &&
                         mesh.skeleton &&
                         <TextLineComponent label="Skeleton" value={mesh.skeleton.name} onLink={() => this.onSkeletonLink()}/>
                         <TextLineComponent label="Skeleton" value={mesh.skeleton.name} onLink={() => this.onSkeletonLink()}/>
                     }
                     }

+ 13 - 0
inspector/src/components/actionTabs/tabs/propertyGrids/meshes/skeletonPropertyGridComponent.tsx

@@ -91,6 +91,15 @@ export class SkeletonPropertyGridComponent extends React.Component<ISkeletonProp
         return true;
         return true;
     }
     }
 
 
+    onOverrideMeshLink() {
+        if (!this.props.globalState.onSelectionChangedObservable) {
+            return;
+        }
+
+        const skeleton = this.props.skeleton;
+        this.props.globalState.onSelectionChangedObservable.notifyObservers(skeleton.overrideMesh);
+    }        
+
     render() {
     render() {
         const skeleton = this.props.skeleton;
         const skeleton = this.props.skeleton;
 
 
@@ -102,6 +111,10 @@ export class SkeletonPropertyGridComponent extends React.Component<ISkeletonProp
                 <LineContainerComponent globalState={this.props.globalState} title="GENERAL">
                 <LineContainerComponent globalState={this.props.globalState} title="GENERAL">
                     <TextLineComponent label="ID" value={skeleton.id} />
                     <TextLineComponent label="ID" value={skeleton.id} />
                     <TextLineComponent label="Bone count" value={skeleton.bones.length.toString()} />
                     <TextLineComponent label="Bone count" value={skeleton.bones.length.toString()} />
+                    {
+                        skeleton.overrideMesh &&
+                        <TextLineComponent label="Override mesh" value={skeleton.overrideMesh.name} onLink={() => this.onOverrideMeshLink()}/>
+                    }                        
                     <CheckBoxLineComponent label="Use texture to store matrices" target={skeleton} propertyName="useTextureToStoreBoneMatrices" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
                     <CheckBoxLineComponent label="Use texture to store matrices" target={skeleton} propertyName="useTextureToStoreBoneMatrices" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
                     <CheckBoxLineComponent label="Debug mode" isSelected={() => this._skeletonViewersEnabled} onSelect={() => this.switchSkeletonViewers()} />
                     <CheckBoxLineComponent label="Debug mode" isSelected={() => this._skeletonViewersEnabled} onSelect={() => this.switchSkeletonViewers()} />
                 </LineContainerComponent>
                 </LineContainerComponent>

+ 5 - 1
inspector/src/components/actionTabs/tabs/propertyGrids/meshes/transformNodePropertyGridComponent.tsx

@@ -36,8 +36,12 @@ export class TransformNodePropertyGridComponent extends React.Component<ITransfo
                 <LineContainerComponent globalState={this.props.globalState} title="GENERAL">
                 <LineContainerComponent globalState={this.props.globalState} title="GENERAL">
                     <TextLineComponent label="ID" value={transformNode.id} />
                     <TextLineComponent label="ID" value={transformNode.id} />
                     <TextLineComponent label="Unique ID" value={transformNode.uniqueId.toString()} />
                     <TextLineComponent label="Unique ID" value={transformNode.uniqueId.toString()} />
-                    <TextLineComponent label="Class" value={transformNode.getClassName()} />
+                    <TextLineComponent label="Class" value={transformNode.getClassName()} />                    
                     <CheckBoxLineComponent label="IsEnabled" isSelected={() => transformNode.isEnabled()} onSelect={(value) => transformNode.setEnabled(value)} />
                     <CheckBoxLineComponent label="IsEnabled" isSelected={() => transformNode.isEnabled()} onSelect={(value) => transformNode.setEnabled(value)} />
+                    {
+                        transformNode.parent &&
+                        <TextLineComponent label="Parent" value={transformNode.parent.name} onLink={() => this.props.globalState.onSelectionChangedObservable.notifyObservers(transformNode.parent)}/>
+                    }                      
                 </LineContainerComponent>
                 </LineContainerComponent>
                 <LineContainerComponent globalState={this.props.globalState} title="TRANSFORMATIONS">
                 <LineContainerComponent globalState={this.props.globalState} title="TRANSFORMATIONS">
                     <Vector3LineComponent label="Position" target={transformNode} propertyName="position" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />
                     <Vector3LineComponent label="Position" target={transformNode} propertyName="position" onPropertyChangedObservable={this.props.onPropertyChangedObservable} />

+ 2 - 0
src/Bones/skeleton.ts

@@ -565,6 +565,8 @@ export class Skeleton implements IAnimatable {
             }
             }
 
 
             var bone = new Bone(source.name, result, parentBone, source.getBaseMatrix().clone(), source.getRestPose().clone());
             var bone = new Bone(source.name, result, parentBone, source.getBaseMatrix().clone(), source.getRestPose().clone());
+            bone._index = source._index;
+
 
 
             if (source._linkedTransformNode) {
             if (source._linkedTransformNode) {
                 bone.linkTransformNode(source._linkedTransformNode);
                 bone.linkTransformNode(source._linkedTransformNode);

+ 1 - 1
src/Culling/ray.ts

@@ -603,7 +603,7 @@ Scene.prototype.createPickingRayToRef = function(x: number, y: number, world: Ma
 
 
     if (!camera) {
     if (!camera) {
         if (!this.activeCamera) {
         if (!this.activeCamera) {
-            throw new Error("Active camera not set");
+            return this;
         }
         }
 
 
         camera = this.activeCamera;
         camera = this.activeCamera;

+ 19 - 12
src/assetContainer.ts

@@ -1,9 +1,9 @@
 import { AbstractScene } from "./abstractScene";
 import { AbstractScene } from "./abstractScene";
 import { Scene } from "./scene";
 import { Scene } from "./scene";
 import { Mesh } from "./Meshes/mesh";
 import { Mesh } from "./Meshes/mesh";
-import { TransformNode } from './Meshes';
-import { Skeleton } from './Bones';
-import { AnimationGroup } from './Animations';
+import { TransformNode } from './Meshes/transformNode';
+import { Skeleton } from './Bones/skeleton';
+import { AnimationGroup } from './Animations/animationGroup';
 
 
 /**
 /**
  * Set of assets to keep when moving a scene into an asset container.
  * Set of assets to keep when moving a scene into an asset container.
@@ -21,7 +21,7 @@ export class InstantiatedEntries {
 
 
     /**
     /**
      * List of new skeletons
      * List of new skeletons
-     */    
+     */
     public skeletons: Skeleton[] = [];
     public skeletons: Skeleton[] = [];
 
 
     /**
     /**
@@ -58,14 +58,15 @@ export class AssetContainer extends AbstractScene {
      * Instantiate or clone all meshes and add the new ones to the scene.
      * Instantiate or clone all meshes and add the new ones to the scene.
      * Skeletons and animation groups will all be cloned
      * Skeletons and animation groups will all be cloned
      */
      */
-    public instantiateAllMeshesToScene(): InstantiatedEntries {
+    public instantiateModelsToScene(): InstantiatedEntries {
         let convertionMap: {[key: number]: number} = {};
         let convertionMap: {[key: number]: number} = {};
         let storeMap: {[key: number]: any} = {};
         let storeMap: {[key: number]: any} = {};
         let result = new InstantiatedEntries();
         let result = new InstantiatedEntries();
+        let alreadySwapped: Skeleton[] = [];
 
 
         let options = {
         let options = {
             doNotInstantiate: true
             doNotInstantiate: true
-        }
+        };
 
 
         let onClone = (source: TransformNode, clone: TransformNode) => {
         let onClone = (source: TransformNode, clone: TransformNode) => {
             convertionMap[source.uniqueId] = clone.uniqueId;
             convertionMap[source.uniqueId] = clone.uniqueId;
@@ -82,12 +83,12 @@ export class AssetContainer extends AbstractScene {
                         let oldTarget = oldMorphTargetManager.getTarget(index);
                         let oldTarget = oldMorphTargetManager.getTarget(index);
                         let newTarget = clonedMesh.morphTargetManager.getTarget(index);
                         let newTarget = clonedMesh.morphTargetManager.getTarget(index);
 
 
-                        convertionMap[oldTarget.uniqueId] = newTarget.uniqueId;                    
+                        convertionMap[oldTarget.uniqueId] = newTarget.uniqueId;
                         storeMap[newTarget.uniqueId] = newTarget;
                         storeMap[newTarget.uniqueId] = newTarget;
                     }
                     }
                 }
                 }
             }
             }
-        }
+        };
 
 
         this.transformNodes.forEach((o) => {
         this.transformNodes.forEach((o) => {
             if (!o.parent) {
             if (!o.parent) {
@@ -112,9 +113,9 @@ export class AssetContainer extends AbstractScene {
                 }
                 }
             }
             }
         });
         });
-        
+
         this.skeletons.forEach((s) => {
         this.skeletons.forEach((s) => {
-            let clone = s.clone("clone of " + s.name);
+            let clone = s.clone("Clone of " + s.name);
 
 
             if (s.overrideMesh) {
             if (s.overrideMesh) {
                 clone.overrideMesh = storeMap[convertionMap[s.overrideMesh.uniqueId]];
                 clone.overrideMesh = storeMap[convertionMap[s.overrideMesh.uniqueId]];
@@ -125,6 +126,12 @@ export class AssetContainer extends AbstractScene {
                     let copy = storeMap[convertionMap[m.uniqueId]];
                     let copy = storeMap[convertionMap[m.uniqueId]];
                     (copy as Mesh).skeleton = clone;
                     (copy as Mesh).skeleton = clone;
 
 
+                    if (alreadySwapped.indexOf(clone) !== -1) {
+                        continue;
+                    }
+
+                    alreadySwapped.push(clone);
+
                     // Check if bones are mesh linked
                     // Check if bones are mesh linked
                     for (var bone of clone.bones) {
                     for (var bone of clone.bones) {
                         if (bone._linkedTransformNode) {
                         if (bone._linkedTransformNode) {
@@ -136,9 +143,9 @@ export class AssetContainer extends AbstractScene {
 
 
             result.skeletons.push(clone);
             result.skeletons.push(clone);
         });
         });
-        
+
         this.animationGroups.forEach((o) => {
         this.animationGroups.forEach((o) => {
-            let clone = o.clone(o.name, oldTarget => {
+            let clone = o.clone(o.name, (oldTarget) => {
                 let newTarget = storeMap[convertionMap[oldTarget.uniqueId]];
                 let newTarget = storeMap[convertionMap[oldTarget.uniqueId]];
 
 
                 return newTarget || oldTarget;
                 return newTarget || oldTarget;