Exemple #1
0
        //!
        //! function to create the object from mesh data for non-skinned meshes
        //! @param  scnObjKtn   object which holds the data
        //!
        public static GameObject CreateObject(SceneNodeGeo nodeGeo, Transform parentTransform)
        {
            GameObject objMain;

            // Transform / convert handiness
            Vector3 pos = new Vector3(nodeGeo.position[0], nodeGeo.position[1], nodeGeo.position[2]);

            // Rotation / convert handiness
            Quaternion rot = new Quaternion(nodeGeo.rotation[0], nodeGeo.rotation[1], nodeGeo.rotation[2], nodeGeo.rotation[3]);

            // Scale
            Vector3 scl = new Vector3(nodeGeo.scale[0], nodeGeo.scale[1], nodeGeo.scale[2]);

            if (!parentTransform.Find(Encoding.ASCII.GetString(nodeGeo.name)))
            {
                // Material Properties and Textures
                Material mat;
#if TRUNK
                // assign material from material list
                if (nodeGeo.materialId > -1 && nodeGeo.materialId < SceneLoader.SceneMaterialList.Count)
                {
                    mat = SceneLoader.SceneMaterialList[nodeGeo.materialId];
                }
                else // or set standard
                {
                    mat = new Material(Shader.Find("Standard"));
                }
#else
                mat = new Material(Shader.Find("Standard"));
#endif

                // map properties
                if (VPETSettings.Instance.doLoadTextures)
                {
                    SceneLoader.MapMaterialProperties(mat, nodeGeo);
                }

                // set up object basics
                objMain      = new GameObject();
                objMain.name = Encoding.ASCII.GetString(nodeGeo.name);

                // Add Material
                Renderer renderer;
                renderer = objMain.AddComponent <MeshRenderer>();

                renderer.material = mat;

                // Add Mesh
                if (nodeGeo.geoId > -1 && nodeGeo.geoId < SceneLoader.SceneMeshList.Count)
                {
                    Mesh[] meshes = SceneLoader.SceneMeshList[nodeGeo.geoId];

                    objMain.AddComponent <MeshFilter>();
                    objMain.GetComponent <MeshFilter>().mesh = meshes[0];
                    VPETSettings.Instance.sceneBoundsMax     = Vector3.Max(VPETSettings.Instance.sceneBoundsMax, renderer.bounds.max);
                    VPETSettings.Instance.sceneBoundsMin     = Vector3.Min(VPETSettings.Instance.sceneBoundsMin, renderer.bounds.min);

                    for (int i = 1; i < meshes.Length; i++)
                    {
                        GameObject subObj = new GameObject(objMain.name + "_part" + i.ToString());

                        Renderer subRenderer;
                        subRenderer = subObj.AddComponent <MeshRenderer>();
                        subObj.AddComponent <MeshFilter>();
                        subObj.GetComponent <MeshFilter>().mesh = meshes[i];

                        subRenderer.material    = mat;
                        subObj.transform.parent = objMain.transform;
                        VPETSettings.Instance.sceneBoundsMax = Vector3.Max(VPETSettings.Instance.sceneBoundsMax, subRenderer.bounds.max);
                        VPETSettings.Instance.sceneBoundsMin = Vector3.Min(VPETSettings.Instance.sceneBoundsMin, subRenderer.bounds.min);
                    }

                    Vector3 sceneExtends = VPETSettings.Instance.sceneBoundsMax - VPETSettings.Instance.sceneBoundsMin;
                    VPETSettings.Instance.maxExtend = Mathf.Max(Mathf.Max(sceneExtends.x, sceneExtends.y), sceneExtends.z);
                }

                //place object
                objMain.transform.parent = parentTransform; // GameObject.Find( "Scene" ).transform;
            }
            else
            {
                objMain = parentTransform.Find(Encoding.ASCII.GetString(nodeGeo.name)).gameObject;
            }

            objMain.transform.localPosition = pos; // new Vector3( 0, 0, 0 );
            objMain.transform.localRotation = rot; //  Quaternion.identity;
            objMain.transform.localScale    = scl; // new Vector3( 1, 1, 1 );

            if (nodeGeo.editable)
            {
                SceneObject sceneObject = objMain.AddComponent <SceneObject>();
                sceneObject.id = idCount++;
            }

            return(objMain);
        }
Exemple #2
0
        //!
        //! function to create the object from mesh data for skinned meshes
        //! @param  scnObjKtn   object which holds the data
        //!
        public static GameObject CreateSkinnedObject(SceneNodeSkinnedGeo nodeGeo, Transform parentTransform, ref List <Tuple <Renderer, string, string[]> > skinnedMeshRootBones)
        {
            GameObject objMain;

            // Transform / convert handiness
            Vector3 pos = new Vector3(nodeGeo.position[0], nodeGeo.position[1], nodeGeo.position[2]);

            // Rotation / convert handiness
            Quaternion rot = new Quaternion(nodeGeo.rotation[0], nodeGeo.rotation[1], nodeGeo.rotation[2], nodeGeo.rotation[3]);

            // Scale
            Vector3 scl = new Vector3(nodeGeo.scale[0], nodeGeo.scale[1], nodeGeo.scale[2]);

            if (!parentTransform.Find(Encoding.ASCII.GetString(nodeGeo.name)))
            {
                // Material Properties and Textures
                Material mat;
#if TRUNK
                // assign material from material list
                if (nodeGeo.materialId > -1 && nodeGeo.materialId < SceneLoader.SceneMaterialList.Count)
                {
                    mat = SceneLoader.SceneMaterialList[nodeGeo.materialId];
                }
                else // or set standard
                {
                    mat = new Material(Shader.Find("Standard"));
                }
#else
                mat = new Material(Shader.Find("Standard"));
#endif

                // map properties
                if (VPETSettings.Instance.doLoadTextures)
                {
                    SceneLoader.MapMaterialProperties(mat, nodeGeo);
                }

                // set up object basics
                objMain      = new GameObject();
                objMain.name = Encoding.ASCII.GetString(nodeGeo.name);

                // Add Material
                Renderer renderer;
                renderer = objMain.AddComponent <SkinnedMeshRenderer>();

                // Add Mesh
                if (nodeGeo.geoId > -1 && nodeGeo.geoId < SceneLoader.SceneMeshList.Count)
                {
                    Mesh[] meshes = SceneLoader.SceneMeshList[nodeGeo.geoId];

                    SkinnedMeshRenderer sRenderer = ((SkinnedMeshRenderer)renderer);

                    string rootBoneDagPath = nodeGeo.rootBoneDagPath;

                    skinnedMeshRootBones.Add(new Tuple <Renderer, string, string[]>(renderer, rootBoneDagPath, nodeGeo.skinnedMeshBonesArray.Split('\r')));
                    VPETSettings.Instance.sceneBoundsMax = Vector3.Max(VPETSettings.Instance.sceneBoundsMax, renderer.bounds.max);
                    VPETSettings.Instance.sceneBoundsMin = Vector3.Min(VPETSettings.Instance.sceneBoundsMin, renderer.bounds.min);
                    Bounds bounds = new Bounds(new Vector3(nodeGeo.boundCenter[0], nodeGeo.boundCenter[1], nodeGeo.boundCenter[2]),
                                               new Vector3(nodeGeo.boundExtents[0] * 2f, nodeGeo.boundExtents[1] * 2f, nodeGeo.boundExtents[2] * 2f));
                    sRenderer.localBounds = bounds;

                    Matrix4x4[] bindposes = new Matrix4x4[nodeGeo.bindPoseLength];
                    for (int i = 0; i < nodeGeo.bindPoseLength; i++)
                    {
                        bindposes[i]       = new Matrix4x4();
                        bindposes[i][0, 0] = nodeGeo.bindPoses[i * 16];
                        bindposes[i][0, 1] = nodeGeo.bindPoses[i * 16 + 1];
                        bindposes[i][0, 2] = nodeGeo.bindPoses[i * 16 + 2];
                        bindposes[i][0, 3] = nodeGeo.bindPoses[i * 16 + 3];
                        bindposes[i][1, 0] = nodeGeo.bindPoses[i * 16 + 4];
                        bindposes[i][1, 1] = nodeGeo.bindPoses[i * 16 + 5];
                        bindposes[i][1, 2] = nodeGeo.bindPoses[i * 16 + 6];
                        bindposes[i][1, 3] = nodeGeo.bindPoses[i * 16 + 7];
                        bindposes[i][2, 0] = nodeGeo.bindPoses[i * 16 + 8];
                        bindposes[i][2, 1] = nodeGeo.bindPoses[i * 16 + 9];
                        bindposes[i][2, 2] = nodeGeo.bindPoses[i * 16 + 10];
                        bindposes[i][2, 3] = nodeGeo.bindPoses[i * 16 + 11];
                        bindposes[i][3, 0] = nodeGeo.bindPoses[i * 16 + 12];
                        bindposes[i][3, 1] = nodeGeo.bindPoses[i * 16 + 13];
                        bindposes[i][3, 2] = nodeGeo.bindPoses[i * 16 + 14];
                        bindposes[i][3, 3] = nodeGeo.bindPoses[i * 16 + 15];
                    }
                    meshes[0].bindposes  = bindposes;
                    sRenderer.sharedMesh = meshes[0];
                    sRenderer.material   = mat;
                    //Note to commented part below:
                    //Splitting of meshes disabled as we are using 32bit index buffers now!

                    /*for (int i = 1; i < meshes.Length; i++)
                     * {
                     *  GameObject subObj = new GameObject(objMain.name + "_part" + i.ToString());
                     *
                     *  SkinnedMeshRenderer subRenderer;
                     *  subRenderer = subObj.AddComponent<SkinnedMeshRenderer>();
                     *
                     *  rootBoneDagPath = nodeGeo.rootBoneDagPath;
                     *  skinnedMeshRootBones.Add(new Tuple<Renderer, string, string[]>(subRenderer, rootBoneDagPath, nodeGeo.skinnedMeshBonesArray.Split('\r')));
                     *  Matrix4x4[] subBindposes = new Matrix4x4[nodeGeo.bindPoseLength];
                     *  for (int j = 0; j < nodeGeo.bindPoseLength; j++)
                     *  {
                     *      subBindposes[j] = new Matrix4x4();
                     *      subBindposes[j].m00 = nodeGeo.bindPoses[j * 16];
                     *      subBindposes[j].m01 = nodeGeo.bindPoses[j * 16 + 1];
                     *      subBindposes[j].m02 = nodeGeo.bindPoses[j * 16 + 2];
                     *      subBindposes[j].m03 = nodeGeo.bindPoses[j * 16 + 3];
                     *      subBindposes[j].m10 = nodeGeo.bindPoses[j * 16 + 4];
                     *      subBindposes[j].m11 = nodeGeo.bindPoses[j * 16 + 5];
                     *      subBindposes[j].m12 = nodeGeo.bindPoses[j * 16 + 6];
                     *      subBindposes[j].m13 = nodeGeo.bindPoses[j * 16 + 7];
                     *      subBindposes[j].m20 = nodeGeo.bindPoses[j * 16 + 8];
                     *      subBindposes[j].m21 = nodeGeo.bindPoses[j * 16 + 9];
                     *      subBindposes[j].m22 = nodeGeo.bindPoses[j * 16 + 10];
                     *      subBindposes[j].m23 = nodeGeo.bindPoses[j * 16 + 11];
                     *      subBindposes[j].m30 = nodeGeo.bindPoses[j * 16 + 12];
                     *      subBindposes[j].m31 = nodeGeo.bindPoses[j * 16 + 13];
                     *      subBindposes[j].m32 = nodeGeo.bindPoses[j * 16 + 14];
                     *      subBindposes[j].m33 = nodeGeo.bindPoses[j * 16 + 15];
                     *  }
                     *  meshes[i].bindposes = bindposes;
                     *  subRenderer.sharedMesh = meshes[i];
                     *
                     *  subRenderer.material = mat;
                     *  subObj.transform.parent = objMain.transform;
                     *  VPETSettings.Instance.sceneBoundsMax = Vector3.Max(VPETSettings.Instance.sceneBoundsMax, subRenderer.bounds.max);
                     *  VPETSettings.Instance.sceneBoundsMin = Vector3.Min(VPETSettings.Instance.sceneBoundsMin, subRenderer.bounds.min);
                     *  Bounds subBounds = new Bounds(new Vector3(nodeGeo.boundCenter[0], nodeGeo.boundCenter[1], nodeGeo.boundCenter[2]),
                     *                                new Vector3(nodeGeo.boundExtents[0], nodeGeo.boundExtents[1], nodeGeo.boundExtents[2]));
                     *  subRenderer.localBounds = bounds;
                     * }*/

                    Vector3 sceneExtends = VPETSettings.Instance.sceneBoundsMax - VPETSettings.Instance.sceneBoundsMin;
                    VPETSettings.Instance.maxExtend = Mathf.Max(Mathf.Max(sceneExtends.x, sceneExtends.y), sceneExtends.z);
                }

                //place object back at original position
                objMain.transform.parent = parentTransform;
            }
            else
            {
                objMain = parentTransform.Find(Encoding.ASCII.GetString(nodeGeo.name)).gameObject;
            }

            objMain.transform.localPosition = pos; // new Vector3( 0, 0, 0 );
            objMain.transform.localRotation = rot; //  Quaternion.identity;
            objMain.transform.localScale    = scl; // new Vector3( 1, 1, 1 );

            if (nodeGeo.editable)
            {
                SceneObject sceneObject = objMain.AddComponent <SceneObject>();
                sceneObject.id = idCount++;
            }

            return(objMain);
        }
Exemple #3
0
        //!
        //! function to create the object from mesh data for skinned meshes
        //! @param  scnObjKtn   object which holds the data
        //!
        public static GameObject CreateSkinnedObject(SceneNodeSkinnedGeo nodeGeo, Transform parentTransform, ref List <Tuple <Renderer, GameObject, int[]> > skinnedMeshRootBones)
        {
            GameObject objMain;

            // Transform / convert handiness
            Vector3 pos = new Vector3(nodeGeo.position[0], nodeGeo.position[1], nodeGeo.position[2]);

            // Rotation / convert handiness
            Quaternion rot = new Quaternion(nodeGeo.rotation[0], nodeGeo.rotation[1], nodeGeo.rotation[2], nodeGeo.rotation[3]);

            // Scale
            Vector3 scl = new Vector3(nodeGeo.scale[0], nodeGeo.scale[1], nodeGeo.scale[2]);

            if (!parentTransform.Find(Encoding.ASCII.GetString(nodeGeo.name)))
            {
                // Material Properties and Textures
                Material mat;
#if TRUNK
                // assign material from material list
                if (nodeGeo.materialId > -1 && nodeGeo.materialId < SceneLoader.SceneMaterialList.Count)
                {
                    mat = SceneLoader.SceneMaterialList[nodeGeo.materialId];
                }
                else // or set standard
                {
                    mat = new Material(Shader.Find("Standard"));
                }
#else
                mat = new Material(Shader.Find("Standard"));
#endif

                // map properties
                if (VPETSettings.Instance.doLoadTextures)
                {
                    SceneLoader.MapMaterialProperties(mat, nodeGeo);
                }

                // set up object basics
                objMain      = new GameObject();
                objMain.name = Encoding.ASCII.GetString(nodeGeo.name);

                // Add Material
                Renderer renderer;
                renderer = objMain.AddComponent <SkinnedMeshRenderer>();

                // Add Mesh
                if (nodeGeo.geoId > -1 && nodeGeo.geoId < SceneLoader.SceneMeshList.Count)
                {
                    Mesh[] meshes = SceneLoader.SceneMeshList[nodeGeo.geoId];

                    SkinnedMeshRenderer sRenderer = ((SkinnedMeshRenderer)renderer);

                    skinnedMeshRootBones.Add(new Tuple <Renderer, GameObject, int[]>(renderer, objMain, nodeGeo.skinnedMeshBoneIDs));
                    VPETSettings.Instance.sceneBoundsMax = Vector3.Max(VPETSettings.Instance.sceneBoundsMax, renderer.bounds.max);
                    VPETSettings.Instance.sceneBoundsMin = Vector3.Min(VPETSettings.Instance.sceneBoundsMin, renderer.bounds.min);
                    Bounds bounds = new Bounds(new Vector3(nodeGeo.boundCenter[0], nodeGeo.boundCenter[1], nodeGeo.boundCenter[2]),
                                               new Vector3(nodeGeo.boundExtents[0] * 2f, nodeGeo.boundExtents[1] * 2f, nodeGeo.boundExtents[2] * 2f));
                    sRenderer.localBounds = bounds;

                    Matrix4x4[] bindposes = new Matrix4x4[nodeGeo.bindPoseLength];
                    for (int i = 0; i < nodeGeo.bindPoseLength; i++)
                    {
                        bindposes[i]       = new Matrix4x4();
                        bindposes[i][0, 0] = nodeGeo.bindPoses[i * 16];
                        bindposes[i][0, 1] = nodeGeo.bindPoses[i * 16 + 1];
                        bindposes[i][0, 2] = nodeGeo.bindPoses[i * 16 + 2];
                        bindposes[i][0, 3] = nodeGeo.bindPoses[i * 16 + 3];
                        bindposes[i][1, 0] = nodeGeo.bindPoses[i * 16 + 4];
                        bindposes[i][1, 1] = nodeGeo.bindPoses[i * 16 + 5];
                        bindposes[i][1, 2] = nodeGeo.bindPoses[i * 16 + 6];
                        bindposes[i][1, 3] = nodeGeo.bindPoses[i * 16 + 7];
                        bindposes[i][2, 0] = nodeGeo.bindPoses[i * 16 + 8];
                        bindposes[i][2, 1] = nodeGeo.bindPoses[i * 16 + 9];
                        bindposes[i][2, 2] = nodeGeo.bindPoses[i * 16 + 10];
                        bindposes[i][2, 3] = nodeGeo.bindPoses[i * 16 + 11];
                        bindposes[i][3, 0] = nodeGeo.bindPoses[i * 16 + 12];
                        bindposes[i][3, 1] = nodeGeo.bindPoses[i * 16 + 13];
                        bindposes[i][3, 2] = nodeGeo.bindPoses[i * 16 + 14];
                        bindposes[i][3, 3] = nodeGeo.bindPoses[i * 16 + 15];
                    }
                    meshes[0].bindposes  = bindposes;
                    sRenderer.sharedMesh = meshes[0];
                    sRenderer.material   = mat;

                    Vector3 sceneExtends = VPETSettings.Instance.sceneBoundsMax - VPETSettings.Instance.sceneBoundsMin;
                    VPETSettings.Instance.maxExtend = Mathf.Max(Mathf.Max(sceneExtends.x, sceneExtends.y), sceneExtends.z);
                }

                //place object back at original position
                objMain.transform.parent = parentTransform;
            }
            else
            {
                objMain = parentTransform.Find(Encoding.ASCII.GetString(nodeGeo.name)).gameObject;
            }

            objMain.transform.localPosition = pos; // new Vector3( 0, 0, 0 );
            objMain.transform.localRotation = rot; //  Quaternion.identity;
            objMain.transform.localScale    = scl; // new Vector3( 1, 1, 1 );

            if (nodeGeo.editable)
            {
                SceneObject sceneObject = objMain.AddComponent <SceneObject>();
                sceneObject.id = idCount++;
            }

            return(objMain);
        }