void ClustMod::GetWorldBoundBox( TimeValue t,INode* inode, ViewExp *vpt, Box3& box, ModContext *mc) { // Need the correct bound box for proper damage rect calcs. #ifdef DESIGN_VER TimeValue rt = GetCOREInterface()->GetTime(); Matrix3 obtm = inode->GetObjectTM(rt); #else Matrix3 obtm = inode->GetObjectTM(t); #endif GraphicsWindow *gw = vpt->getGW(); Matrix3 ptm(1), ctm(1); if (posControl) posControl->GetValue(t,&ptm,FOREVER,CTRL_RELATIVE); if (tmControl) tmControl->GetValue(t,&ctm,FOREVER,CTRL_RELATIVE); //Matrix3 tm = DEFORMER_TM; Matrix3 tm = CompTM(ptm,ctm,mc->tm,1); ClustDeformer deformer(tm); BoxLineProc bp1(&obtm); DoModifiedBox(MakeBoxNotEmpty(*mc->box), deformer, bp1); box = bp1.Box(); //obtm = ctm * obtm; if (mc->tm) obtm = ctm * Inverse(*mc->tm) * obtm; else obtm = ctm * obtm; BoxLineProc bp2(&obtm); DrawCenterMark(bp2,MakeBoxNotEmpty(*mc->box)); box += bp2.Box(); }
int main() { boost::asio::io_service io_service; acqua::asio::pseudo_terminal_master ptm(io_service, acqua::asio::pseudo_terminal_master::with_open); std::cout << ptm.slave_name() << std::endl; ptm.async_read_some(boost::asio::buffer(buffer, sizeof(buffer)), std::bind(&on_read, std::placeholders::_1, std::placeholders::_2, std::ref(ptm))); io_service.run(); }
void ClustMod::GetSubObjectTMs( SubObjAxisCallback *cb,TimeValue t,INode *node,ModContext *mc) { Matrix3 obtm = node->GetObjectTM(t); Matrix3 ptm(1), ctm(1); if (posControl) posControl->GetValue(t,&ptm,FOREVER,CTRL_RELATIVE); if (tmControl) tmControl->GetValue(t,&ctm,FOREVER,CTRL_RELATIVE); //Matrix3 tm = DEFORMER_TM * obtm; Matrix3 tm = CompTM(ptm,ctm,mc->tm,1) * obtm; cb->TM(tm,0); }
int ClustMod::Display( TimeValue t, INode* inode, ViewExp *vpt, int flags, ModContext *mc) { // Transform the gizmo with the node. #ifdef DESIGN_VER TimeValue rt = GetCOREInterface()->GetTime(); Matrix3 obtm = inode->GetObjectTM(rt); #else Matrix3 obtm = inode->GetObjectTM(t); #endif GraphicsWindow *gw = vpt->getGW(); gw->setTransform(obtm); Matrix3 ptm(1), ctm(1); if (posControl) posControl->GetValue(t,&ptm,FOREVER,CTRL_RELATIVE); if (tmControl) tmControl->GetValue(t,&ctm,FOREVER,CTRL_RELATIVE); //Matrix3 tm = DEFORMER_TM; Matrix3 tm = CompTM(ptm,ctm,mc->tm,1); ClustDeformer deformer(tm); if (ip && ip->GetSubObjectLevel() == 1) { //gw->setColor( LINE_COLOR, (float)1.0, (float)1.0, (float)0.0); gw->setColor(LINE_COLOR,GetUIColor(COLOR_SEL_GIZMOS)); } else { //gw->setColor( LINE_COLOR, (float).85, (float).5, (float)0.0); gw->setColor(LINE_COLOR,GetUIColor(COLOR_GIZMOS)); } if (mc->box->pmin==mc->box->pmax) { Point3 pt = mc->box->pmin * tm; gw->marker(&pt,ASTERISK_MRKR); } else { DoModifiedBox(MakeBoxNotEmpty(*mc->box),deformer,DrawLineProc(gw)); } //obtm = ctm * obtm; if (mc->tm) obtm = ctm * Inverse(*mc->tm) * obtm; else obtm = ctm * obtm; gw->setTransform(obtm); if ( ip && (ip->GetSubObjectLevel() == 1 || ip->GetSubObjectLevel() == 2) ) { //gw->setColor( LINE_COLOR, (float)1.0, (float)1.0, (float)0.0); gw->setColor(LINE_COLOR,GetUIColor(COLOR_SEL_GIZMOS)); } else { //gw->setColor( LINE_COLOR, (float).85, (float).5, (float)0.0); gw->setColor(LINE_COLOR,GetUIColor(COLOR_GIZMOS)); } DrawCenterMark(DrawLineProc(gw),MakeBoxNotEmpty(*mc->box)); return 0; }
void ClustMod::ModifyObject( TimeValue t, ModContext &mc, ObjectState * os, INode *node) { Interval valid = FOREVER; Matrix3 ptm(1), ctm(1); if (posControl) posControl->GetValue(t,&ptm,valid,CTRL_RELATIVE); if (tmControl) tmControl->GetValue(t,&ctm,valid,CTRL_RELATIVE); //Matrix3 tm = DEFORMER_TM; Matrix3 tm = CompTM(ptm,ctm,mc.tm,0); ClustDeformer deformer(tm); os->obj->Deform(&deformer, TRUE); os->obj->UpdateValidity(GEOM_CHAN_NUM,valid); }
int ClustMod::HitTest( TimeValue t, INode* inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt, ModContext* mc) { int savedLimits; Matrix3 obtm = inode->GetObjectTM(t); GraphicsWindow *gw = vpt->getGW(); HitRegion hr; MakeHitRegion(hr,type, crossing,4,p); gw->setHitRegion(&hr); gw->setRndLimits(((savedLimits = gw->getRndLimits()) | GW_PICK) & ~GW_ILLUM); gw->clearHitCode(); gw->setTransform(obtm); Matrix3 ptm(1), ctm(1); if (posControl) posControl->GetValue(t,&ptm,FOREVER,CTRL_RELATIVE); if (tmControl) tmControl->GetValue(t,&ctm,FOREVER,CTRL_RELATIVE); if (ip && ip->GetSubObjectLevel() == 1) { //Matrix3 tm = DEFORMER_TM; Matrix3 tm = CompTM(ptm,ctm,mc->tm,1); ClustDeformer deformer(tm); if (mc->box->pmin==mc->box->pmax) { Point3 pt = mc->box->pmin * tm; gw->marker(&pt,ASTERISK_MRKR); } else { DoModifiedBox(MakeBoxNotEmpty(*mc->box),deformer,DrawLineProc(gw)); } } if (ip && (ip->GetSubObjectLevel() == 1 || ip->GetSubObjectLevel() == 2)) { //obtm = ctm * obtm; if (mc->tm) obtm = ctm * Inverse(*mc->tm) * obtm; else obtm = ctm * obtm; gw->setTransform(obtm); DrawCenterMark(DrawLineProc(gw),MakeBoxNotEmpty(*mc->box)); } gw->setRndLimits(savedLimits); if (gw->checkHitCode()) { vpt->LogHit(inode, mc, gw->getHitDistance(), 0, NULL); return 1; } return 0; }
void ClustMod::GetSubObjectCenters( SubObjAxisCallback *cb,TimeValue t,INode *node,ModContext *mc) { Matrix3 obtm = node->GetObjectTM(t); Matrix3 ptm(1), ctm(1); if (posControl) posControl->GetValue(t,&ptm,FOREVER,CTRL_RELATIVE); if (tmControl) tmControl->GetValue(t,&ctm,FOREVER,CTRL_RELATIVE); if (cb->Type()==SO_CENTER_PIVOT) { //Matrix3 mat = ctm * obtm; Matrix3 mat; if (mc->tm) mat = ctm * Inverse(*mc->tm) * obtm; else mat = ctm * obtm; cb->Center(mat.GetTrans(),0); } else { //Matrix3 tm = DEFORMER_TM; Matrix3 tm = CompTM(ptm,ctm,mc->tm,1); ClustDeformer deformer(tm); BoxLineProc bp1(&obtm); DoModifiedBox(MakeBoxNotEmpty(*mc->box), deformer, bp1); cb->Center(bp1.Box().Center(),0); } }
/* Render Modes are * -Vertex Color Interpolation * -Texture Mapping * Renders the triangle mess, shades using the sence lights. * Shadow Mapping implimented */ void TMesh::RenderFilled(PPC *ppc, FrameBuffer *fb, unsigned int color, int lightsN, Light **L, float ka, FrameBuffer *texture, enviromap *cube, int renderMode) { //Project vertices on to the camera vector *pverts = new vector[vertsN]; for (int vi = 0; vi < vertsN; vi++) { ppc->Project(verts[vi], pverts[vi]); } for (int tri = 0; tri < trisN; tri++) { int vinds[3]; vinds[0] = tris[tri*3+0]; vinds[1] = tris[tri*3+1]; vinds[2] = tris[tri*3+2]; if( pverts[vinds[0]][2] == FLT_MAX || pverts[vinds[1]][2] == FLT_MAX || pverts[vinds[2]][2] == FLT_MAX ) continue; //Compute bounding box aabb of projected vertices AABB aabb(pverts[vinds[0]]); aabb.AddPoint(pverts[vinds[1]]); aabb.AddPoint(pverts[vinds[2]]); //Clip aabb with frame if(!aabb.Clip(0.0f, (float) fb->w, 0.0f, (float) fb->h)) continue; int left = (int)(aabb.corners[0][0] + 0.5f); int right = (int)(aabb.corners[1][0] - 0.5f); int top = (int)(aabb.corners[0][1] + 0.5f); int bottom = (int)(aabb.corners[1][1] - 0.5f); vector red( cols[vinds[0]][0], cols[vinds[1]][0], cols[vinds[2]][0]); vector green( cols[vinds[0]][1], cols[vinds[1]][1], cols[vinds[2]][1]); vector blue( cols[vinds[0]][2], cols[vinds[1]][2], cols[vinds[2]][2]); vector depth( pverts[vinds[0]][2], pverts[vinds[1]][2], pverts[vinds[2]][2] ); vector rABC, gABC, bABC, zABC, nxABC, nyABC, nzABC, sABC, tABC; vector DEF; vector eeqs[3]; SetEEQS( pverts[vinds[0]], pverts[vinds[1]], pverts[vinds[2]], eeqs); matrix ptm(pverts[vinds[0]], pverts[vinds[1]], pverts[vinds[2]]); ptm.setCol(2, vector(1.0f, 1.0f, 1.0f)); ptm = invert(ptm); // Set up for normals vector nx( normals[vinds[0]][0], normals[vinds[1]][0], normals[vinds[2]][0] ); vector ny( normals[vinds[0]][1], normals[vinds[1]][1], normals[vinds[2]][1] ); vector nz( normals[vinds[0]][2], normals[vinds[1]][2], normals[vinds[2]][2] ); // Set depth interpolation through screen space interpolation zABC = ptm * depth; //Matrix for Model Space interpolation matrix Q; Q = ComputeRastMatrix(ppc, verts[vinds[0]], verts[vinds[1]], verts[vinds[2]]); DEF = Q[0] + Q[1] + Q[2]; //Compute Model Space interpolation constants SetModelRast(Q, nx, &nxABC); SetModelRast(Q, ny, &nyABC); SetModelRast(Q, nz, &nzABC); //SetModelRast(Q, depth, &zABC); if( renderMode == VCI ) { // Setup screen space linear variation of color rABC = ptm * red; gABC = ptm * green; bABC = ptm * blue; }else if( renderMode == MCI ) { // Set Color Model Space Constants SetModelRast(Q, red, &rABC); SetModelRast(Q, green, &gABC); SetModelRast(Q, blue, &bABC); }else if( renderMode == TM) { //Get texture model space parameters vector s( tcs[2*vinds[0]+0], tcs[2*vinds[1]+0], tcs[2*vinds[2]+0]); vector t( tcs[2*vinds[0]+1], tcs[2*vinds[1]+1], tcs[2*vinds[2]+1]); SetModelRast(Q, s, &sABC); SetModelRast(Q, t, &tABC); } for( int v = top; v <= bottom; v++ ){ for ( int u = left; u <= right; u++ ) { if(fb->IsOutsideFrame(u,v)) continue; vector pv((float)u+0.5f, (float)v+0.5f, 1.0f); //Check whether pixel is inside triangle if (eeqs[0]*pv < 0.0f || eeqs[1]*pv < 0.0f || eeqs[2]*pv < 0.0f) continue; // Check whether triangle is closer than what was previously // seen at this pixel float currz = zABC * pv; //currz /= (DEF * pv); if (fb->IsFarther(u, v, currz)) continue; fb->SetZ(u, v, currz); // pixel is inside triangle and triangle is visible at pixel // compute color of pixel based on current triangle vector currColor; if ( renderMode == SM) continue; if ( renderMode == VCI ){ currColor = vector( rABC * pv, gABC * pv, bABC * pv ); }else if ( renderMode == MCI ) { float r = ModelInterpolation(u, v, rABC, DEF); float g = ModelInterpolation(u, v, gABC, DEF); float b = ModelInterpolation(u, v, bABC, DEF); currColor = vector(r,g,b); } if ( renderMode == TM) { int w = texture->w; int h = texture->h; float miS = ModelInterpolation(u, v, sABC, DEF); float miT = ModelInterpolation(u, v, tABC, DEF); miS = (miS * (float)w); miT = (miT * (float)h); int st = (h-1-(int)(miT)%h) * w+(int)(miS)%w; if(st < 0 || st > h*w) continue; currColor.SetFromColor(texture->pix[st]); } vector currNormal = vector(nxABC*pv/(DEF*pv), nyABC*pv/(DEF*pv), nzABC*pv/(DEF*pv)).norm(); if ( renderMode == RFL ) { vector eye = ppc->C; vector P = ppc->UnProject(pv); vector ev = (eye - P); vector rv = currNormal*(currNormal*ev)*2.0f - ev; rv = rv.norm(); //currColor = (rv + vector(1.0f, 1.0f, 1.0f))/2.0f; currColor.SetFromColor(cube->getColor(rv)); } //Calculated Color at pixel using phong equation for( int li = 0; li < lightsN; li++ ){ if(!L[li]->on) continue; vector fullColor; fullColor.SetFromColor(color); vector lv; vector pp(pv); pp[2] = currz; lv = (L[li]->L->C - ppc->UnProject(pp)).norm(); float kd = lv * currNormal; kd = (kd < 0.0f) ? 0.0f : kd; //currColor = currColor * ka ; //currColor = currColor * (ka + (1.0f-ka)*kd); vector point = ppc->UnProject(pp); vector SMp; L[li]->L->Project(point, SMp); float ul = SMp[0]; float vl = SMp[1]; if(L[li]->sm->IsOutsideFrame(ul, vl)) { currColor = currColor * ka ; //fb->Set(u,v, currColor.GetColor()); continue; } //Check depth from light to calculate shadows float e = SMp[2]*.01; if(L[li]->sm->IsFarther((int)ul, (int)vl, SMp[2]+e)) { currColor = currColor * ka ; //fb->Set(u,v, currColor.GetColor()); }else { currColor *= ka +(1.0f-ka)*kd; //fb->Set(u,v, currColor.GetColor()); } } fb->Set(u,v, currColor.GetColor()); } } } delete []pverts; }
void UnwrapMod::fnGizmoCenter() { //get our tm //set the tm scale TimeValue t = GetCOREInterface()->GetTime(); //get our selection Box3 bounds; bounds.Init(); //get the bounding box Point3 pnorm(0.0f,0.0f,0.0f); int ct = 0; for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; Matrix3 tm = mMeshTopoData.GetNodeTM(t,ldID); for (int k = 0; k < ld->GetNumberFaces(); k++) { if (ld->GetFaceSelected(k)) { // Grap the three points, xformed int pcount = 3; // if (gfaces[k].flags & FLAG_QUAD) pcount = 4; pcount = ld->GetFaceDegree(k);//gfaces[k]->count; Point3 temp_point[4]; for (int j=0; j<pcount; j++) { int index = ld->GetFaceGeomVert(k,j);//gfaces[k]->t[j]; bounds += ld->GetGeomVert(index) * tm; //gverts.d[index].p * tm; if (j < 4) temp_point[j] = ld->GetGeomVert(index) * tm; //gverts.d[index].p; } pnorm += Normalize(temp_point[1]-temp_point[0]^temp_point[2]-temp_point[1]); ct++; } } } if (ct == 0) return; theHold.Begin(); SuspendAnimate(); AnimateOff(); pnorm = pnorm / (float) ct;//gfaces.Count(); //if just a primary axis set the tm; Point3 center = bounds.Center(); // build the scale //get our tm Matrix3 tm(1); tm = *fnGetGizmoTM(); Matrix3 initialTM = tm; Point3 vec2; vec2 = Normalize(tm.GetRow(0)); tm.SetRow(0,vec2); vec2 = Normalize(tm.GetRow(1)) ; tm.SetRow(1,vec2); vec2 = Normalize(tm.GetRow(2)); tm.SetRow(2,vec2); tm.SetRow(3,center); Matrix3 itm = Inverse(tm); //find our x and y scale Box3 localBounds; localBounds.Init(); for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; Matrix3 tm = mMeshTopoData.GetNodeTM(t,ldID); for (int k = 0; k < ld->GetNumberFaces(); k++) { if (ld->GetFaceSelected(k)) { // Grap the three points, xformed int pcount = 3; // if (gfaces[k].flags & FLAG_QUAD) pcount = 4; pcount = ld->GetFaceDegree(k);//gfaces[k]->count; Point3 temp_point[4]; for (int j=0; j<pcount; j++) { int index = ld->GetFaceGeomVert(k,j);//gfaces[k]->t[j]; Point3 p = ld->GetGeomVert(index) * tm * itm;//gverts.d[index].p * tm * itm; localBounds += p; // if (fabs(p.x) > xmax) xmax = fabs(p.x); // if (fabs(p.y) > ymax) ymax = fabs(p.y); // if (fabs(p.z) > zmax) zmax = fabs(p.z); } } } } if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == PELTMAP)) center = localBounds.Center() * tm; else if (fnGetMapMode() == CYLINDRICALMAP) { Point3 zvec = initialTM.GetRow(2); // center = center * tm; center = localBounds.Center() * tm - (zvec * 0.5f); } initialTM.SetRow(3,center); Matrix3 ptm(1), id(1); initialTM = initialTM ; SetXFormPacket tmpck(initialTM,ptm); tmControl->SetValue(t,&tmpck,TRUE,CTRL_RELATIVE); ResumeAnimate(); if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == CYLINDRICALMAP) || (fnGetMapMode() == SPHERICALMAP) || (fnGetMapMode() == BOXMAP)) ApplyGizmo(); theHold.Accept(GetString(IDS_MAPPING_FIT)); fnGetGizmoTM(); if (ip) ip->RedrawViews(ip->GetTime()); }
void UnwrapMod::fnAlignAndFit(int axis) { //get our selection Box3 bounds; bounds.Init(); //get the bounding box Point3 pnorm(0.0f,0.0f,0.0f); int ct = 0; TimeValue t = GetCOREInterface()->GetTime(); for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; Matrix3 tm = mMeshTopoData.GetNodeTM(t,ldID); for (int k = 0; k < ld->GetNumberFaces(); k++) { if (ld->GetFaceSelected(k)) { // Grap the three points, xformed int pcount = 3; // if (gfaces[k].flags & FLAG_QUAD) pcount = 4; pcount = ld->GetFaceDegree(k);//gfaces[k]->count; Point3 temp_point[4]; for (int j=0; j<pcount; j++) { int index = ld->GetFaceGeomVert(k,j);//gfaces[k]->t[j]; bounds += ld->GetGeomVert(index) *tm;//gverts.d[index].p; if (j < 4) temp_point[j] = ld->GetGeomVert(index);//gverts.d[index].p; } pnorm += VectorTransform(Normalize(temp_point[1]-temp_point[0]^temp_point[2]-temp_point[1]),tm); ct++; } } } if (ct == 0) return; theHold.Begin(); SuspendAnimate(); AnimateOff(); pnorm = pnorm / (float) ct; Matrix3 tm(1); //if just a primary axis set the tm; Point3 center = bounds.Center(); // build the scale Point3 scale(bounds.Width().x ,bounds.Width().y , bounds.Width().z); if (scale.x == 0.0f) scale.x = 1.0f; if (scale.y == 0.0f) scale.y = 1.0f; if (scale.z == 0.0f) scale.z = 1.0f; if (axis == 0) // x axi { tm.SetRow(0,Point3(0.0f,-scale.y,0.0f)); tm.SetRow(1,Point3(0.0f,0.0f,scale.z)); tm.SetRow(2,Point3(scale.x,0.0f,0.0f)); if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == PELTMAP) || (fnGetMapMode() == SPHERICALMAP) || (fnGetMapMode() == BOXMAP)) tm.SetRow(3,center); else if (fnGetMapMode() == CYLINDRICALMAP) { center.x = bounds.pmin.x; tm.SetRow(3,center); } Matrix3 ptm(1), id(1); tm = tm ; SetXFormPacket tmpck(tm,ptm); tmControl->SetValue(t,&tmpck,TRUE,CTRL_RELATIVE); } else if (axis == 1) // y axi { tm.SetRow(0,Point3(scale.x,0.0f,0.0f)); tm.SetRow(1,Point3(0.0f,0.0f,scale.z)); tm.SetRow(2,Point3(0.0f,scale.y,0.0f)); if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == PELTMAP)|| (fnGetMapMode() == SPHERICALMAP) || (fnGetMapMode() == BOXMAP)) tm.SetRow(3,center); else if (fnGetMapMode() == CYLINDRICALMAP) { center.y = bounds.pmin.y; tm.SetRow(3,center); } Matrix3 ptm(1), id(1); tm = tm; SetXFormPacket tmpck(tm,ptm); tmControl->SetValue(t,&tmpck,TRUE,CTRL_RELATIVE); } else if (axis == 2) //z axi { tm.SetRow(0,Point3(scale.x,0.0f,0.0f)); tm.SetRow(1,Point3(0.0f,scale.y,0.0f)); tm.SetRow(2,Point3(0.0f,0.0f,scale.z)); if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == PELTMAP)|| (fnGetMapMode() == SPHERICALMAP) || (fnGetMapMode() == BOXMAP)) tm.SetRow(3,center); else if (fnGetMapMode() == CYLINDRICALMAP) { center.z = bounds.pmin.z; tm.SetRow(3,center); } Matrix3 ptm(1), id(1); tm = tm; SetXFormPacket tmpck(tm,ptm); tmControl->SetValue(t,&tmpck,TRUE,CTRL_RELATIVE); } else if (axis == 3) // normal { int numberOfSelectionGroups = 0; for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; if (ld->GetFaceSelection().NumberSet()) numberOfSelectionGroups++; } if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == PELTMAP) || (numberOfSelectionGroups > 1)) { //get our tm Matrix3 tm; UnwrapMatrixFromNormal(pnorm,tm); Matrix3 itm = Inverse(tm); //find our x and y scale float xmax = 0.0f; float ymax = 0.0f; float zmax = 0.0f; Box3 localBounds; localBounds.Init(); for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; Matrix3 tm = mMeshTopoData.GetNodeTM(t,ldID); for (int k = 0; k < ld->GetNumberFaces(); k++) { if (ld->GetFaceSelected(k)) { // Grap the three points, xformed int pcount = 3; // if (gfaces[k].flags & FLAG_QUAD) pcount = 4; pcount = ld->GetFaceDegree(k);//gfaces[k]->count; Point3 temp_point[4]; for (int j=0; j<pcount; j++) { int index = ld->GetFaceGeomVert(k,j);//gfaces[k]->t[j]; Point3 p = ld->GetGeomVert(index) * tm * itm;//gverts.d[index].p * itm; localBounds += p; } } } } // center = localBounds.Center(); xmax = localBounds.pmax.x - localBounds.pmin.x; ymax = localBounds.pmax.y - localBounds.pmin.y; zmax = localBounds.pmax.z - localBounds.pmin.z; if (xmax < 0.001f) xmax = 1.0f; if (ymax < 0.001f) ymax = 1.0f; if (zmax < 0.001f) zmax = 1.0f; Point3 vec; vec = Normalize(tm.GetRow(0)) * xmax; tm.SetRow(0,vec); vec = Normalize(tm.GetRow(1)) * ymax; tm.SetRow(1,vec); vec = Normalize(tm.GetRow(2)) * zmax; tm.SetRow(2,vec); tm.SetRow(3,center); Matrix3 ptm(1), id(1); tm = tm ; SetXFormPacket tmpck(tm,ptm); tmControl->SetValue(t,&tmpck,TRUE,CTRL_RELATIVE); } else if ((fnGetMapMode() == CYLINDRICALMAP) || (fnGetMapMode() == SPHERICALMAP)|| (fnGetMapMode() == BOXMAP)) { for (int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { //get our first 2 rings Tab<int> openEdges; Tab<int> startRing; Tab<int> endRing; MeshTopoData *ld = mMeshTopoData[ldID]; //skip any local data that has no selections if (ld->GetFaceSelection().NumberSet() == 0) continue; Matrix3 nodeTM = mMeshTopoData.GetNodeTM(t,ldID); for (int i = 0; i < ld->GetNumberGeomEdges(); i++)//TVMaps.gePtrList.Count(); i++) { int numberSelectedFaces = 0; int ct = ld->GetGeomEdgeNumberOfConnectedFaces(i);//TVMaps.gePtrList[i]->faceList.Count(); for (int j = 0; j < ct; j++) { int faceIndex = ld->GetGeomEdgeConnectedFace(i,j);//TVMaps.gePtrList[i]->faceList[j]; if (ld->GetFaceSelected(faceIndex))//fsel[faceIndex]) numberSelectedFaces++; } if (numberSelectedFaces == 1) { openEdges.Append(1,&i,1000); } } GetOpenEdges(ld,openEdges, startRing); GetOpenEdges(ld,openEdges, endRing); Point3 zVec = pnorm; Point3 centerS(0.0f,0.0f,0.0f), centerE; if ((startRing.Count() != 0) && (endRing.Count() != 0)) { //get the center start Box3 BoundsS, BoundsE; BoundsS.Init(); BoundsE.Init(); //get the center end for (int i = 0; i < startRing.Count(); i++) { int eIndex = startRing[i]; int a = ld->GetGeomEdgeVert(eIndex,0);//TVMaps.gePtrList[eIndex]->a; int b = ld->GetGeomEdgeVert(eIndex,1);//TVMaps.gePtrList[eIndex]->b; BoundsS += ld->GetGeomVert(a) * nodeTM;//TVMaps.geomPoints[a]; BoundsS += ld->GetGeomVert(b) * nodeTM;//TVMaps.geomPoints[b]; } for (int i = 0; i < endRing.Count(); i++) { int eIndex = endRing[i]; int a = ld->GetGeomEdgeVert(eIndex,0);//TVMaps.gePtrList[eIndex]->a; int b = ld->GetGeomEdgeVert(eIndex,1);//TVMaps.gePtrList[eIndex]->b; BoundsE += ld->GetGeomVert(a) * nodeTM;//TVMaps.geomPoints[a]; BoundsE += ld->GetGeomVert(b) * nodeTM;//TVMaps.geomPoints[b]; } centerS = BoundsS.Center(); centerE = BoundsE.Center(); //create the vec zVec = centerE - centerS; } else if ((startRing.Count() != 0) && (endRing.Count() == 0)) { //get the center start Box3 BoundsS; BoundsS.Init(); //get the center end for (int i = 0; i < startRing.Count(); i++) { int eIndex = startRing[i]; int a = ld->GetGeomEdgeVert(eIndex,0);//TVMaps.gePtrList[eIndex]->a; int b = ld->GetGeomEdgeVert(eIndex,1);//TVMaps.gePtrList[eIndex]->b; BoundsS += ld->GetGeomVert(a) * nodeTM;//TVMaps.geomPoints[a]; BoundsS += ld->GetGeomVert(b) * nodeTM;//TVMaps.geomPoints[b]; } centerS = BoundsS.Center(); int farthestPoint= -1; Point3 fp; float farthestDist= 0.0f; for (int k=0; k < ld->GetNumberFaces(); k++) { if (ld->GetFaceSelected(k)) { // Grap the three points, xformed int pcount = 3; // if (gfaces[k].flags & FLAG_QUAD) pcount = 4; pcount = ld->GetFaceDegree(k);//gfaces[k]->count; for (int j=0; j<pcount; j++) { int index = ld->GetFaceGeomVert(k,j);//gfaces[k]->t[j]; Point3 p = ld->GetGeomVert(index)* nodeTM;//gverts.d[index].p; float d = LengthSquared(p-centerS); if ((d > farthestDist) || (farthestPoint == -1)) { farthestDist = d; farthestPoint = index; fp = p; } } } } centerE = fp; //create the vec zVec = centerE - centerS; } else { zVec = Point3(0.0f,0.0f,1.0f); } //get our tm Matrix3 tm; UnwrapMatrixFromNormal(zVec,tm); tm.SetRow(3,centerS); Matrix3 itm = Inverse(tm); //find our x and y scale float xmax = 0.0f; float ymax = 0.0f; float zmax = 0.0f; Box3 localBounds; localBounds.Init(); for (int k = 0; k < ld->GetNumberFaces(); k++)//gfaces.Count(); k++) { if (ld->GetFaceSelected(k)) { // Grap the three points, xformed int pcount = 3; // if (gfaces[k].flags & FLAG_QUAD) pcount = 4; pcount = ld->GetFaceDegree(k);//gfaces[k]->count; Point3 temp_point[4]; for (int j=0; j<pcount; j++) { int index = ld->GetFaceGeomVert(k,j);//gfaces[k]->t[j]; Point3 p = ld->GetGeomVert(index) * nodeTM * itm;//gverts.d[index].p * itm; localBounds += p; } } } center = localBounds.Center() * tm; if (fnGetMapMode() == CYLINDRICALMAP) { if ((startRing.Count() == 0) && (endRing.Count() == 0)) { centerS = center; centerS.z = localBounds.pmin.z; } else { centerS = centerS * itm; centerS.z = localBounds.pmin.z; centerS = centerS * tm; } } else if ((fnGetMapMode() == SPHERICALMAP) || (fnGetMapMode() == BOXMAP)) { centerS = center; } Point3 bc = localBounds.Center(); bc.z = localBounds.pmin.z; bc = bc * tm; xmax = localBounds.pmax.x - localBounds.pmin.x; ymax = localBounds.pmax.y - localBounds.pmin.y; zmax = localBounds.pmax.z - localBounds.pmin.z; Point3 vec; vec = Normalize(tm.GetRow(0)) * xmax; tm.SetRow(0,vec); vec = Normalize(tm.GetRow(1)) * ymax; tm.SetRow(1,vec); vec = Normalize(tm.GetRow(2)) * zmax; tm.SetRow(2,vec); tm.SetRow(3,centerS); Matrix3 ptm(1), id(1); tm = tm; SetXFormPacket tmpck(tm,ptm); tmControl->SetValue(t,&tmpck,TRUE,CTRL_RELATIVE); } } } ResumeAnimate(); if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == CYLINDRICALMAP) || (fnGetMapMode() == SPHERICALMAP) || (fnGetMapMode() == BOXMAP)) ApplyGizmo(); theHold.Accept(GetString(IDS_MAPPING_ALIGN)); fnGetGizmoTM(); if (ip) ip->RedrawViews(ip->GetTime()); }
void UnwrapMod::fnGizmoReset() { theHold.Begin(); SuspendAnimate(); AnimateOff(); TimeValue t = GetCOREInterface()->GetTime(); //get our selection Box3 bounds; bounds.Init(); //get the bounding box for(int ldID = 0; ldID < mMeshTopoData.Count(); ldID++) { MeshTopoData *ld = mMeshTopoData[ldID]; Matrix3 tm = mMeshTopoData.GetNodeTM(t,ldID); for (int k = 0; k < ld->GetNumberFaces(); k++)//gfaces.Count(); k++) { if (ld->GetFaceSelected(k)) { // Grap the three points, xformed int pcount = 3; // if (gfaces[k].flags & FLAG_QUAD) pcount = 4; pcount = ld->GetFaceDegree(k);//gfaces[k]->count; Point3 temp_point[4]; for (int j=0; j<pcount; j++) { int index = ld->GetFaceGeomVert(k,j);//gfaces[k]->t[j]; bounds += ld->GetGeomVert(index) * tm;//gverts.d[index].p; } } } } Matrix3 tm(1); //if just a primary axis set the tm; Point3 center = bounds.Center(); // build the scale Point3 scale(bounds.Width().x ,bounds.Width().y , bounds.Width().z); if (scale.x == 0.0f) scale.x = 1.0f; if (scale.y == 0.0f) scale.y = 1.0f; if (scale.z == 0.0f) scale.z = 1.0f; float scl = scale.x; if (scale.y > scl) scl = scale.y; if (scale.z > scl) scl = scale.z; scale.x = scl; scale.y = scl; scale.z = scl; tm.SetRow(0,Point3(scale.x,0.0f,0.0f)); tm.SetRow(1,Point3(0.0f,scale.y,0.0f)); tm.SetRow(2,Point3(0.0f,0.0f,scale.z)); if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == PELTMAP)|| (fnGetMapMode() == SPHERICALMAP)) tm.SetRow(3,center); else if (fnGetMapMode() == CYLINDRICALMAP) { center.z = bounds.pmin.z; tm.SetRow(3,center); } Matrix3 ptm(1), id(1); tm = tm ; SetXFormPacket tmpck(tm,ptm); tmControl->SetValue(t,&tmpck,TRUE,CTRL_RELATIVE); ResumeAnimate(); if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == CYLINDRICALMAP) || (fnGetMapMode() == SPHERICALMAP) || (fnGetMapMode() == BOXMAP)) ApplyGizmo(); theHold.Accept(GetString(IDS_MAPPING_RESET)); fnGetGizmoTM(); if (ip) ip->RedrawViews(ip->GetTime()); }
void UnwrapMod::fnGizmoAlignToView() { if (ip == NULL) return; ViewExp& vpt = ip->GetActiveViewExp(); if (!vpt.IsAlive()) return; //get our tm //set the tm scale theHold.Begin(); SuspendAnimate(); AnimateOff(); TimeValue t = GetCOREInterface()->GetTime(); // Viewport tm Matrix3 vtm; vpt.GetAffineTM(vtm); vtm = Inverse(vtm); // Node tm Matrix3 ntm(1);// = nodeList[0]->GetObjectTM(ip->GetTime()); Matrix3 destTM = vtm * Inverse(ntm); //get our tm Matrix3 initialTM = *fnGetGizmoTM(); Point3 center = Normalize(initialTM.GetRow(3)); initialTM.SetRow(3,center); for (int i = 0; i < 3; i++) { Point3 vec = destTM.GetRow(i); float l = Length(initialTM.GetRow(i)); vec = Normalize(vec) * l; initialTM.SetRow(i,vec); } initialTM.SetRow(3,center); Matrix3 ptm(1), id(1); initialTM = initialTM ; SetXFormPacket tmpck(initialTM,ptm); tmControl->SetValue(t,&tmpck,TRUE,CTRL_RELATIVE); ResumeAnimate(); fnGizmoFit(); if ((fnGetMapMode() == PLANARMAP) || (fnGetMapMode() == CYLINDRICALMAP) || (fnGetMapMode() == SPHERICALMAP) || (fnGetMapMode() == BOXMAP)) ApplyGizmo(); theHold.Accept(GetString(IDS_MAPPING_ALIGNTOVIEW)); fnGetGizmoTM(); if (ip) ip->RedrawViews(ip->GetTime()); }