private int CSLoadFBXFile(string _fbxFilePath) { int result = CPPDLLLoadMeshFromFBXFile(m_cppImportedFBXScene, _fbxFilePath); int result2 = CPPDLLLoadMaterialFromFBXFile(m_cppImportedFBXScene, _fbxFilePath); if (result == 0) { print("Incorrect file path"); return(0); } else if (result == 1) { m_csImportedFBXScene = (CSImportedFBXScene)Marshal.PtrToStructure(m_cppImportedFBXScene, typeof(CSImportedFBXScene)); m_csImportedFBXScene.m_mesh = (CSImportedFBXScene.CPPMesh)Marshal.PtrToStructure(m_csImportedFBXScene.m_CPPMeshPtr, typeof(CSImportedFBXScene.CPPMesh)); uint vertexCount = m_csImportedFBXScene.m_mesh.m_vertexCount; uint indexCount = m_csImportedFBXScene.m_mesh.m_indexCount; uint materialCount = m_csImportedFBXScene.m_mesh.m_materialCount; m_csMesh.m_vertexCount = vertexCount; m_csMesh.m_indexCount = indexCount; m_csMesh.m_materialCount = materialCount; if (vertexCount > 0) { m_csMesh.m_allVerticesPositions = new CSMesh.Vector3[vertexCount]; m_csMesh.m_indices = new uint[indexCount]; unsafe { CSMesh.Vector3 *vertices = (CSMesh.Vector3 *)m_csImportedFBXScene.m_mesh.m_allVerticesPositions.ToPointer(); if (vertices != null) { for (int i = 0; i < vertexCount; i++) { m_csMesh.m_allVerticesPositions[i].x = vertices[i].x; m_csMesh.m_allVerticesPositions[i].y = vertices[i].y; m_csMesh.m_allVerticesPositions[i].z = vertices[i].z; } } else { print("The mesh VERTEX POSITION data did not get read properly."); } uint *indices = (uint *)m_csImportedFBXScene.m_mesh.m_indices.ToPointer(); if (indices != null) { for (int i = 0; i < indexCount; i++) { m_csMesh.m_indices[i] = indices[i]; } } else { print("The mesh INDICE data did not get read properly."); } CSMesh.Vector3 *normals = (CSMesh.Vector3 *)m_csImportedFBXScene.m_mesh.m_normals.ToPointer(); if (normals != null) { m_csMesh.m_allVerticesNormals = new CSMesh.Vector3[vertexCount]; for (int i = 0; i < vertexCount; i++) { m_csMesh.m_allVerticesNormals[i].x = normals[i].x; m_csMesh.m_allVerticesNormals[i].y = normals[i].y; m_csMesh.m_allVerticesNormals[i].z = normals[i].z; } } else { print("This mesh did not have NORMALS"); } CSMesh.Vector2 *uvs = (CSMesh.Vector2 *)m_csImportedFBXScene.m_mesh.m_uvs.ToPointer(); if (uvs != null) { m_csMesh.m_allVerticesUVs = new CSMesh.Vector2[vertexCount]; for (int i = 0; i < vertexCount; i++) { m_csMesh.m_allVerticesUVs[i].x = uvs[i].x; m_csMesh.m_allVerticesUVs[i].y = uvs[i].y; } if (materialCount > 0) { m_csMesh.m_materials = new CSMaterial[materialCount]; m_meshRenderer.materials = new Material[materialCount]; CPPMaterial **materials = (CPPMaterial **)m_csImportedFBXScene.m_mesh.m_materials.ToPointer(); for (int i = 0; i < materialCount; i++) { m_meshRenderer.materials[i].shader = Shader.Find("Standard"); m_csMesh.m_materials[i].m_materialType = materials[i]->m_materialType; m_csMesh.m_materials[i].m_materialProperties = new CSMaterial.PropertyData[(int)PropertyType.PROPERTYTYPE_COUNT]; if (materials[i]->m_textureCount > 0) { m_csMesh.m_materials[i].m_textures = new Texture2D[materials[i]->m_textureCount]; } uint currentTextureIndex = 0; for (int j = 0; j < (int)PropertyType.PROPERTYTYPE_COUNT; j++) { CPPMaterial.PropertyData **propertyData = (CPPMaterial.PropertyData * *)materials[i]->m_materialProperties.ToPointer(); m_csMesh.m_materials[i].m_materialProperties[j].m_propertyType = propertyData[j]->m_propertyType; m_csMesh.m_materials[i].m_materialProperties[j].m_textureRelativeFileName = Marshal.PtrToStringAnsi(propertyData[j]->m_textureRelativeFileName); m_csMesh.m_materials[i].m_materialProperties[j].m_textureAbsoluteFilePath = Marshal.PtrToStringAnsi(propertyData[j]->m_textureAbsoluteFilePath); m_csMesh.m_materials[i].m_materialProperties[j].m_dataColorValues = propertyData[j]->m_dataColorValues; if (m_csMesh.m_materials[i].m_materialProperties[j].m_textureRelativeFileName != null || m_csMesh.m_materials[i].m_materialProperties[j].m_textureAbsoluteFilePath != null) { m_csMesh.m_materials[i].m_textures[currentTextureIndex] = LoadPNG(m_csMesh.m_materials[i].m_materialProperties[j].m_textureAbsoluteFilePath); Color color; color.r = propertyData[j]->m_dataColorValues.x; color.g = propertyData[j]->m_dataColorValues.y; color.b = propertyData[j]->m_dataColorValues.z; color.a = propertyData[j]->m_dataColorValues.w; switch (propertyData[j]->m_propertyType) { case PropertyType.PROPERTYTYPE_EMISSIVE: { m_meshRenderer.materials[i].EnableKeyword("_EMISSION"); m_meshRenderer.materials[i].SetTexture("_EmissionMap", m_csMesh.m_materials[i].m_textures[currentTextureIndex]); m_meshRenderer.materials[i].SetColor("_EmissionColor", color); } break; case PropertyType.PROPERTYTYPE_AMBIENT: break; case PropertyType.PROPERTYTYPE_DIFFUSE: { m_meshRenderer.materials[i].EnableKeyword("_MainTex"); m_meshRenderer.materials[i].SetTexture("_MainTex", m_csMesh.m_materials[i].m_textures[currentTextureIndex]); m_meshRenderer.materials[i].SetColor("_MainTex", color); } break; case PropertyType.PROPERTYTYPE_NORMAL: { m_meshRenderer.materials[i].EnableKeyword("_BumpMap"); m_meshRenderer.materials[i].SetTexture("_BumpMap", m_csMesh.m_materials[i].m_textures[currentTextureIndex]); m_meshRenderer.materials[i].SetFloat("_BumpScale", color.a); } break; case PropertyType.PROPERTYTYPE_BUMP: { m_meshRenderer.materials[i].EnableKeyword("_BumpMap"); m_meshRenderer.materials[i].SetTexture("_BumpMap", m_csMesh.m_materials[i].m_textures[currentTextureIndex]); m_meshRenderer.materials[i].SetFloat("_BumpScale", color.a); } break; case PropertyType.PROPERTYTYPE_TRANSPARENCY: break; case PropertyType.PROPERTYTYPE_DISPLACEMENT: break; case PropertyType.PROPERTYTYPE_VECTOR_DISPLACEMENT: break; case PropertyType.PROPERTYTYPE_SPECULAR: { m_meshRenderer.materials[i].EnableKeyword("_METALLICGLOSSMAP"); m_meshRenderer.materials[i].SetTexture("_MetallicGlossMap", m_csMesh.m_materials[i].m_textures[currentTextureIndex]); m_meshRenderer.materials[i].SetFloat("Metallic", color.a); } break; case PropertyType.PROPERTYTYPE_SHININESS: break; case PropertyType.PROPERTYTYPE_REFLECTION: { m_meshRenderer.materials[i].EnableKeyword("_Glossiness"); m_meshRenderer.materials[i].SetFloat("Smoothness", color.a); } break; case PropertyType.PROPERTYTYPE_COUNT: break; default: break; } ++currentTextureIndex; } } } } if (materialCount == 1) { print("This mesh had 1 material."); } else { print("This mesh had " + materialCount + " materials."); } } else { print("This mesh did not have UVS"); } } return(1); } // Return false if the file loaded but some of the mesh data was incorrect return(-1); } else { return(result); } }
/***************** Class Definitions *****************/ /***************** Class Functions *****************/ void Start() { m_meshFilter = gameObject.AddComponent <MeshFilter>(); m_unityMesh = m_meshFilter.mesh; m_meshRenderer = gameObject.AddComponent <MeshRenderer>(); m_objectTransform = gameObject.GetComponent <Transform>(); m_csMesh = new CSMesh(); m_csImportedFBXScene = new CSImportedFBXScene(); // C++ handler which is unmanaged memory (we need to delete) m_cppImportedFBXScene = CPPDLLCreateFBXHandler(); //int result = CSLoadFBXFile("C:\\Users\\Brandon\\Desktop\\GameEngineBF\\EngineBJF\\FBXLibraryHandler\\SciFiCharacter\\NewSciFiCharacter.fbx"); DateTime m_timeBefore = DateTime.Now; int result = CSLoadFBXFile("C:\\Users\\Brandon\\Desktop\\GameEngineBF\\EngineBJF\\FBXLibraryHandler\\CyberPunksWeapons\\Glossy\\SM_Pistol.fbx"); DateTime m_timeAfter = DateTime.Now; TimeSpan m_duration = m_timeAfter - m_timeBefore; if (m_duration.Seconds > 0) { print("The mesh was loaded in: " + m_duration.Seconds + " s"); } else { print("The mesh was loaded in: " + m_duration.Milliseconds + " ms"); } if (1 == result) { // If the file loaded a mesh successfully, let's fill out the mesh component of this game object. FillOutGameObjectMesh(); if (m_csMesh.m_allVerticesUVs != null) { DateTime m_timeBefore2 = DateTime.Now; //int result2 = CSLoadMaterialFromFBXFile("C:\\Users\\Brandon\\Desktop\\GameEngineBF\\EngineBJF\\FBXLibraryHandler\\SciFiCharacter\\NewSciFiCharacter.fbx"); int result2 = CSLoadMaterialFromFBXFile("C:\\Users\\Brandon\\Desktop\\GameEngineBF\\EngineBJF\\FBXLibraryHandler\\CyberPunksWeapons\\Glossy\\SM_Pistol.fbx"); DateTime m_timeAfter2 = DateTime.Now; TimeSpan m_duration2 = m_timeAfter2 - m_timeBefore2; if (m_duration.Seconds > 0) { print("The material was loaded in: " + m_duration2.Seconds + " s"); } else { print("The material was loaded in: " + m_duration2.Milliseconds + " ms"); } } } // If the file did not load, lets check if there is a specific error message we can display to the user. switch (result) { case 0: print("File path did not load"); break; case -1: print("File did not contain mesh data"); break; default: break; } //m_objectTransform.Translate(new Vector3(0.0f, -10.0f)); // For testing //m_objectTransform.localScale = new Vector3(0.1f, 0.1f, 0.1f); // For testing float scaleAmount = 0.5f; m_objectTransform.Translate(new Vector3(0.0f, 0.0f)); // For testing m_objectTransform.localScale = new Vector3(scaleAmount, scaleAmount, scaleAmount); // For testing m_objectTransform.Rotate(new Vector3(0.0f, 1.0f, 0.0f), 90.0f); }