diff --git a/maya/dracodec_maya.dll b/maya/dracodec_maya.dll index b7cb65a..a8136f5 100644 Binary files a/maya/dracodec_maya.dll and b/maya/dracodec_maya.dll differ diff --git a/maya/dracodec_maya.py b/maya/dracodec_maya.py index bc09659..73a3ebb 100644 --- a/maya/dracodec_maya.py +++ b/maya/dracodec_maya.py @@ -15,7 +15,9 @@ class Drc2PyMesh(ctypes.Structure): ("vertices_num", ctypes.c_uint), ("vertices", ctypes.POINTER(ctypes.c_float)), ("normals_num", ctypes.c_uint), - ("normals", ctypes.POINTER(ctypes.c_float)) + ("normals", ctypes.POINTER(ctypes.c_float)), + ("uvs_num", ctypes.c_uint), + ("uvs", ctypes.POINTER(ctypes.c_float)) ] # TODO: Add integration for UNIX @@ -67,6 +69,10 @@ class Draco: result.normals_len = mesh.normals_num * 3 result.normals_num = mesh.normals_num + result.uvs = mesh.uvs[0:mesh.uvs_num * 3] + result.uvs_len = mesh.uvs_num * 3 + result.uvs_num = mesh.uvs_num + # Free memory allocated by the lib self.drc_free(ctypes.byref(mesh_ptr)) mesh_ptr = None diff --git a/maya/test/dracodec_maya_test.py b/maya/test/dracodec_maya_test.py index dd112e2..f54474e 100644 --- a/maya/test/dracodec_maya_test.py +++ b/maya/test/dracodec_maya_test.py @@ -27,6 +27,10 @@ class DracoTest(unittest.TestCase): self.assertEqual(0, mesh.normals_num, 'Number of normals') self.assertEqual(0, mesh.normals_len,'Length of normals array precalculated') self.assertEqual(0, len(mesh.normals),'Length of normals array by len') + # Uvs check + self.assertEqual(0, mesh.normals_num, 'Number of uvs') + self.assertEqual(0, mesh.normals_len,'Length of uvs array precalculated') + self.assertEqual(0, len(mesh.normals),'Length of uvs array by len') def test_unexistent_drc(self): self.assertRaises(Exception, self.drc.decode, 'unexistent.drc') diff --git a/src/draco/maya/draco_maya_plugin.cc b/src/draco/maya/draco_maya_plugin.cc index ced4b00..530e828 100644 --- a/src/draco/maya/draco_maya_plugin.cc +++ b/src/draco/maya/draco_maya_plugin.cc @@ -60,8 +60,7 @@ namespace draco { int num_normals = drc_mesh->num_points(); out_mesh->normals = new float[num_normals]; out_mesh->normals_num = num_normals; - //out_mesh->has_normals = true; - + for (int i = 0; i < num_normals; i++) { draco::PointIndex pi(i); const draco::AttributeValueIndex val_index = normal_att->mapped_index(pi); @@ -74,7 +73,32 @@ namespace draco { out_mesh->normals[i * 3 + 1] = out_normal[1]; out_mesh->normals[i * 3 + 2] = out_normal[2]; } + } + static void decode_uvs(std::unique_ptr &drc_mesh, Drc2PyMesh* out_mesh) { + const auto uv_att = drc_mesh->GetNamedAttribute(draco::GeometryAttribute::TEX_COORD); + if (uv_att == nullptr) { + out_mesh->uvs = new float[0]; + out_mesh->uvs_num = 0; + return; + } + + int num_uvs = drc_mesh->num_points(); + out_mesh->normals = new float[num_uvs * 2]; + out_mesh->normals_num = num_uvs; + + for (int i = 0; i < num_uvs; i++) { + draco::PointIndex pi(i); + const draco::AttributeValueIndex val_index = uv_att->mapped_index(pi); + + float out_uv[3]; + bool is_ok = uv_att->ConvertValue(val_index, out_uv); + if (!is_ok) return; + + out_mesh->uvs[i * 3 + 0] = out_uv[0]; + out_mesh->uvs[i * 3 + 1] = out_uv[1]; + out_mesh->uvs[i * 3 + 2] = out_uv[2]; + } } void drc2py_free(Drc2PyMesh **mesh_ptr) { diff --git a/src/draco/maya/draco_maya_plugin.h b/src/draco/maya/draco_maya_plugin.h index cb372ef..63192f2 100644 --- a/src/draco/maya/draco_maya_plugin.h +++ b/src/draco/maya/draco_maya_plugin.h @@ -36,13 +36,17 @@ namespace draco { vertices_num(0), vertices(nullptr), normals_num(0), - normals(nullptr) {} + normals(nullptr), + uvs_num(0), + uvs(nullptr) {} int faces_num; int* faces; int vertices_num; float* vertices; int normals_num; float* normals; + int uvs_num; + float* uvs; }; EXPORT_API int drc2py_decode(char *data, unsigned int length, Drc2PyMesh **res_mesh);