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]))); } bool edge_reverse = false; if (num_loops == 1) { size_t num_vertices = 0; SUFaceGetNumVertices(face, &num_vertices); size_t edge_count = 0; SUFaceGetNumEdges(face, &edge_count); size_t num_uses = 0; SUFaceGetNumEdgeUses(face, &num_uses); //Calculate transformed points vID = new LWPntID[num_vertices]; if (num_vertices > 0) { std::vector edgeuses(num_uses); SUFaceGetEdgeUses(face, num_uses, &edgeuses[0], &num_uses); pntID = new LWPntID[num_vertices]; size_t lastpnt = edge_count - 1; for (size_t i = 0; i < edge_count; i++){ SUVertexRef vertexref = SU_INVALID; SUEdgeRef edge_ref = SU_INVALID; SUEdgeUseGetEdge(edgeuses[i], &edge_ref); SUEdgeUseIsReversed(edgeuses[i], &edge_reverse); if (edge_reverse){ SUEdgeGetStartVertex(edge_ref, &vertexref); } else{ SUEdgeGetEndVertex(edge_ref, &vertexref); } 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 (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]; } }