//! //! 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); }
//! //! 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); }
//! //! 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); }