From 64dbf0f3ef59c63e44124699bec7ffa236e0845b Mon Sep 17 00:00:00 2001 From: Federico De Felici Date: Fri, 11 May 2018 16:16:38 +0200 Subject: [PATCH] Added uvs mapping --- maya/dracodec_maya.dll | Bin 3876864 -> 3876864 bytes maya/dracodec_maya.py | 8 +++++++- maya/test/dracodec_maya_test.py | 4 ++++ src/draco/maya/draco_maya_plugin.cc | 28 ++++++++++++++++++++++++++-- src/draco/maya/draco_maya_plugin.h | 6 +++++- 5 files changed, 42 insertions(+), 4 deletions(-) diff --git a/maya/dracodec_maya.dll b/maya/dracodec_maya.dll index b7cb65acff9b92d20a7f84f88107a24764db6d23..a8136f56907598dc5a2d04e3b4ce7a81e1a24af9 100644 GIT binary patch delta 364 zcmX}ixlRI67{zhFtKtTTJBYZB%iuQXIE+T)6c!ib1CUr)nppS*6eJcCGPPo9;{#aT z2e2S^HjFLS+V}?kiHRrq<>Vx%{{Ag>Jc-IY-zf=|h*6@B?n@4q7%C`ci zhv?|c%IH?$|BtIz(|J>FvY?|2D;rguhIam5-L0dFuN&HLzT75q>5LBnYdqLNEHz zj|2uVh#?GP1WBZj#waov!#E}|i78BD23h1Vi#+B~z&sYPh$Spz1r}DZhIMSfMiHCX v!ZvoWYpStR`;>IpHYMy~A1)3|+j!SC>6jC@{3YUtwpT{C4~^{|ef<0a0*H~y delta 328 zcmWN_IZne+6hKkE=Y+xdGXyXY=8(x@av(T>K=iC25(_|L4Jjf~Sfa;2B_%ufI{?wq z#I#V8h8=K=qbuFP=U4`K5pCE~1n`DSa5~UEBJvVVD)9XupjYxbcTJ z1N&wwWnL+J@_c)ntC2YE;#P-raSl`zsQr PQPRaZE?ksce*OIeKskqD 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);