From 5b7bf31d590cb66d5b45bea99012ed7183c56b7d Mon Sep 17 00:00:00 2001 From: "Asad M. Zaman" Date: Tue, 25 Nov 2003 03:13:49 +0000 Subject: [PATCH] bug fix for non textured polygons --- pandatool/src/softegg/softNodeDesc.cxx | 8 ++- pandatool/src/softegg/softNodeDesc.h | 1 + pandatool/src/softegg/softToEggConverter.cxx | 65 ++++++++++++-------- 3 files changed, 46 insertions(+), 28 deletions(-) diff --git a/pandatool/src/softegg/softNodeDesc.cxx b/pandatool/src/softegg/softNodeDesc.cxx index a6397a0b66..48ad8cb1ce 100755 --- a/pandatool/src/softegg/softNodeDesc.cxx +++ b/pandatool/src/softegg/softNodeDesc.cxx @@ -58,6 +58,7 @@ SoftNodeDesc(SoftNodeDesc *parent, const string &name) : valid; uv_swap; // SAA_Boolean visible; + numTexTri = NULL; textures = NULL; materials = NULL; triangles = NULL; @@ -634,7 +635,7 @@ load_poly_model(SAA_Scene *scene, SAA_ModelType type) { /***********************************************************************************/ // allocate array of textures per triangle - int *numTexTri = new int[numTri]; + numTexTri = new int[numTri]; const void *relinfo; // find out how many local textures per triangle @@ -667,9 +668,14 @@ load_poly_model(SAA_Scene *scene, SAA_ModelType type) { // and read all referenced local textures into array SAA_materialRelationGetT2DLocElements( scene, &materials[i], TEX_PER_MAT , &textures[i] ); + // initialize the array value texNameArray[i] = NULL; + // see if this triangle has texture info + if (numTexTri[i] == 0) + continue; + // check to see if texture is present result = SAA_elementIsValid( scene, &textures[i], &valid ); diff --git a/pandatool/src/softegg/softNodeDesc.h b/pandatool/src/softegg/softNodeDesc.h index 5237031500..20eaea90ba 100755 --- a/pandatool/src/softegg/softNodeDesc.h +++ b/pandatool/src/softegg/softNodeDesc.h @@ -107,6 +107,7 @@ public: // int numShapes; int numTexLoc; int numTexGlb; + int *numTexTri; // if the node is a MNSRF int numNurbTexLoc; diff --git a/pandatool/src/softegg/softToEggConverter.cxx b/pandatool/src/softegg/softToEggConverter.cxx index 3bbb9331fe..034c20bd40 100755 --- a/pandatool/src/softegg/softToEggConverter.cxx +++ b/pandatool/src/softegg/softToEggConverter.cxx @@ -1034,6 +1034,8 @@ make_polyset(SoftNodeDesc *node_desc, EggGroup *egg_group, SAA_ModelType type) { for (idx=0; idxnumTri; ++idx) { EggPolygon *egg_poly = new EggPolygon; egg_group->add_child(egg_poly); + + softegg_cat.spam() << "processing polygon " << idx << endl; // Is this a double sided polygon? meaning check for back face flag char *modelNoteStr = _tree.GetModelNoteInfo( &scene, node_desc->get_model() ); @@ -1064,7 +1066,7 @@ make_polyset(SoftNodeDesc *node_desc, EggGroup *egg_group, SAA_ModelType type) { // allocate arrays for u & v coords if (node_desc->textures) { - if (node_desc->numTexLoc) { + if (node_desc->numTexLoc && node_desc->numTexTri[idx]) { // allocate arrays for u & v coords // I think there are one texture per triangle hence we need only 3 corrdinates uCoords = new float[3]; @@ -1154,7 +1156,7 @@ make_polyset(SoftNodeDesc *node_desc, EggGroup *egg_group, SAA_ModelType type) { } // if texture present set the texture coordinates - if (node_desc->textures) { + if (node_desc->textures && node_desc->numTexTri[idx]) { float u, v; u = uCoords[i]; @@ -1183,7 +1185,7 @@ make_polyset(SoftNodeDesc *node_desc, EggGroup *egg_group, SAA_ModelType type) { // Now apply the shader. if (node_desc->textures != NULL) { - if (node_desc->numTexLoc) { + if (node_desc->numTexLoc && node_desc->numTexTri[idx]) { if (!strstr(node_desc->texNameArray[idx], "noIcon")) set_shader_attributes(node_desc, *egg_poly, node_desc->texNameArray[idx]); else @@ -1888,14 +1890,11 @@ cleanup_soft_skin() { int num_nodes = _tree.get_num_nodes(); SoftNodeDesc *node_desc; - SAA_Boolean isSkeleton; softegg_cat.spam() << endl << "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl; for (int i = 0; i < num_nodes; i++) { node_desc = _tree.get_node(i); - SAA_modelIsSkeleton( &scene, node_desc->get_model(), &isSkeleton ); - if (node_desc->is_partial(search_prefix)) continue; @@ -1915,11 +1914,6 @@ cleanup_soft_skin() // /ful/rnd/pub/vrml/chip/chips_adventure/char/zone1/rooms/warehouse_final // need to do the "if (skel)" bit. - /* - if (type != SAA_MSMSH || type != SAA_MNSRF) - continue; - */ - //find the vpool for this model string vpool_name = node_desc->get_name() + ".verts"; EggNode *t = _tree.get_egg_root()->find_child(vpool_name); @@ -1931,27 +1925,44 @@ cleanup_soft_skin() continue; } - int i; - double membership = 1.0f; int numVerts = (int)vpool->size(); softegg_cat.spam() << "found vpool " << vpool_name << " w/ " << numVerts << " verts\n"; + + // find the closest _parentJoint + SoftNodeDesc *parentJ = node_desc; + while( parentJ && !parentJ->_parentJoint) { + if ( parentJ->_parent) { + SAA_Boolean isSkeleton; + //softegg_cat.spam() << " checking parent " << parentJ->_parent->get_name() << endl; + if (parentJ->_parent->has_model()) + SAA_modelIsSkeleton( &scene, parentJ->_parent->get_model(), &isSkeleton ); + + if (isSkeleton) { + joint = parentJ->_parent->get_egg_group(); + softegg_cat.spam() << "parent to " << parentJ->_parent->get_name() << endl; + break; + } + + parentJ = parentJ->_parent; + } + else + break; + } + if (!joint && (!parentJ || !parentJ->_parentJoint)) { + softegg_cat.spam() << node_desc->get_name() << " has no _parentJoint?!" << endl; + continue; + } + + if (!joint) { + softegg_cat.spam() << "parent joint to " << parentJ->_parentJoint->get_name() << endl; + joint = parentJ->_parentJoint->get_egg_group(); + } + + int i; + double membership = 1.0f; for ( i = 1; i <= numVerts; i++ ) { EggVertex *vert = vpool->get_vertex(i); - // find the closest _parentJoint - SoftNodeDesc *parentJ = node_desc; - while( parentJ && !parentJ->_parentJoint) { - if ( parentJ->_parent) - parentJ = parentJ->_parent; - else - break; - } - if (!parentJ || !parentJ->_parentJoint) { - softegg_cat.spam() << node_desc->get_name() << " has no _parentJoint?!" << endl; - continue; - } - - joint = parentJ->_parentJoint->get_egg_group(); // if this vertex has not been soft assigned, then hard assign it to the parentJoint if ( vert->gref_size() == 0 ) {