if (transforms.size() > 0){ det = ((transforms.back().values[0] * (transforms.back().values[5] * transforms.back().values[10] - transforms.back().values[6] * transforms.back().values[9])) - (transforms.back().values[1] * (transforms.back().values[4] * transforms.back().values[10] - transforms.back().values[6] * transforms.back().values[8])) + (transforms.back().values[2] * (transforms.back().values[4] * transforms.back().values[9] - transforms.back().values[5] * transforms.back().values[8]))); } if (num_loops == 1) { size_t num_vertices = 0; SUFaceGetNumVertices(face, &num_vertices); //Calculate transformed points vID = new LWPntID[num_vertices]; if (num_vertices > 0) { std::vector fverts(num_vertices); SUFaceGetVertices(face, num_vertices, &fverts[0], &num_vertices); pntID = new LWPntID[num_vertices]; for (size_t i = 0; i < num_vertices; i++){ SUVertexRef vertexref = fverts[i]; SUPoint3D su_point; SUVertexGetPosition(vertexref, &su_point); x = su_point.x; y = su_point.y; z = su_point.z; // Apply transformations if (transforms.size() > 0){ rIter = transforms.rbegin(); for (rIter; rIter != transforms.rend(); ++rIter){ skptran->tran[0] = rIter->values[0]; skptran->tran[1] = rIter->values[1]; skptran->tran[2] = rIter->values[2]; skptran->tran[3] = rIter->values[3]; skptran->tran[4] = rIter->values[4]; skptran->tran[5] = rIter->values[5]; skptran->tran[6] = rIter->values[6]; skptran->tran[7] = rIter->values[7]; skptran->tran[8] = rIter->values[8]; skptran->tran[9] = rIter->values[9]; skptran->tran[10] = rIter->values[10]; skptran->tran[11] = rIter->values[11]; skptran->tran[12] = rIter->values[12]; skptran->tran[13] = rIter->values[13]; skptran->tran[14] = rIter->values[14]; skptran->tran[15] = rIter->values[15]; lwpos[0] = (x*skptran->tran[0]) + (y*skptran->tran[4]) + (z*skptran->tran[8]) + (w*skptran->tran[12]); lwpos[1] = (x*skptran->tran[1]) + (y*skptran->tran[5]) + (z*skptran->tran[9]) + (w*skptran->tran[13]); lwpos[2] = (x*skptran->tran[2]) + (y*skptran->tran[6]) + (z*skptran->tran[10]) + (w*skptran->tran[14]); w = (x*skptran->tran[3]) + (y*skptran->tran[7]) + (z*skptran->tran[11]) + (w*skptran->tran[15]); lwpos[0] /= w; lwpos[1] /= w; lwpos[2] /= w; x = 0; y = 0; z = 0; w = 1; x = lwpos[0]; y = lwpos[1]; z = lwpos[2]; w = 1; } } lwpos[0] = (x*lwtran->m10) + (y*lwtran->m11) + (z*lwtran->m12) + (w*lwtran->m13); lwpos[1] = (x*lwtran->m20) + (y*lwtran->m21) + (z*lwtran->m22) + (w*lwtran->m23); lwpos[2] = (x*lwtran->m30) + (y*lwtran->m31) + (z*lwtran->m32) + (w*lwtran->m33); w = (x*lwtran->m40) + (y*lwtran->m41) + (z*lwtran->m42) + (w*lwtran->m43); lwpos[0] /= w; lwpos[1] /= w; lwpos[2] /= w; lwpos[0] /= LWSCALE; lwpos[1] /= LWSCALE; lwpos[2] /= LWSCALE; if (!(pntID[i] = local->point(local->data, lwpos))) return 1; if (has_back_text && !has_front_text){ SUUVQ uvq; if (SUUVHelperGetBackUVQ(uv_helper, &su_point, &uvq) == SU_ERROR_NONE){ valarray[0] = uvq.u/uvq.q; valarray[1] = uvq.v/uvq.q; local->vmap(local->data, LWVMAP_TXUV, 2, vmapname.c_str()); local->vmapVal(local->data, pntID[i], valarray); } }else{ if (has_front_text){ SUUVQ uvq; if (SUUVHelperGetFrontUVQ(uv_helper, &su_point, &uvq) == SU_ERROR_NONE){ valarray[0] = uvq.u/uvq.q; valarray[1] = uvq.v/uvq.q; local->vmap(local->data, LWVMAP_TXUV, 2, vmapname.c_str()); local->vmapVal(local->data, pntID[i], valarray); } } } } } if ( det < 0){ size_t p = num_vertices; for (size_t i = 0; i < num_vertices; i++){ p--; vID[i] = pntID[p]; } } else{ for (size_t i = 0; i < num_vertices; i++){ vID[i] = pntID[i]; } } polID = local->polygon(local->data, LWPOLTYPE_FACE, 0, num_vertices, vID); local->polTag(local->data, polID, LWPTAG_SURF, matname_utf8); delete[] pntID; delete[] vID; return 0; }