static float CalcScale(INode *bone, NiNodeRef node, vector<NiNodeRef>& children) { int n = bone->NumberOfChildren(); if (n > 0) { float len1 = 0.0f; float len2 = 0.0f; Matrix3 m = bone->GetNodeTM(0); Matrix3 m2 = TOMATRIX3(node->GetWorldTransform()); for (int i = 0; i<n; i++) { INode *child = bone->GetChildNode(i); LPCTSTR name = child->GetName(); if (HasBipedPosDOF(name)) continue; Matrix3 cm = child->GetObjectTM(0); len1 += Length(m.GetTrans()-cm.GetTrans()); if (NiNodeRef child2 = FindNodeByName(children, string(child->GetName()))){ Matrix3 cm2 = TOMATRIX3(child2->GetWorldTransform()); len2 += Length(m2.GetTrans()-cm2.GetTrans()); } } return (len2 != 0.0f && len1 != 0.0f) ? (len2/len1) : 1.0f; } return 1.0f; }
void PointHelpObject::GetWorldBoundBox( TimeValue t, INode* inode, ViewExp* vpt, Box3& box ) { if ( ! vpt || ! vpt->IsAlive() ) { box.Init(); return; } Matrix3 tm; tm = inode->GetObjectTM(t); Box3 lbox; GetLocalBoundBox(t, inode, vpt, lbox); box = Box3(tm.GetTrans(), tm.GetTrans()); for (int i=0; i<8; i++) { box += lbox * tm; } /* if(!(extDispFlags & EXT_DISP_ZOOM_EXT) && showAxis) box = GetAxisBox(vpt,tm,showAxis?axisLength:0.0f, FALSE); else box = Box3(tm.GetTrans(), tm.GetTrans()); */ }
static float CalcLength(INode *bone) { int n = bone->NumberOfChildren(); float len = 0.0f; if (n > 0) { Matrix3 m = bone->GetNodeTM(0); Point3 p = m.GetTrans(); for (int i = 0; i<n; i++) { INode *child = bone->GetChildNode(i); Matrix3 cm = child->GetObjectTM(0); Point3 cp = cm.GetTrans(); float clen = Length(p-cp); len += clen; } len /= float(n); } else { len = Length(GetLocalTM(bone).GetTrans()); } return len; }
void TapeHelpObject::GetLocalBoundBox(TimeValue t, INode* inode, ViewExp* vpt, Box3& box ) { if ( ! vpt || ! vpt->IsAlive() ) { box.Init(); return; } Matrix3 m = inode->GetObjectTM(t); Point3 pt; Point3 q[4]; float scaleFactor = vpt->NonScalingObjectSize()*vpt->GetVPWorldWidth(m.GetTrans())/(float)360.0; box = mesh.getBoundingBox(); box.Scale(scaleFactor); float d; if (GetTargetPoint(t,inode,pt)) { d = Length(m.GetTrans()-pt)/Length(inode->GetObjectTM(t).GetRow(2)); box += Point3(float(0),float(0),-d); } if(GetSpecLen()) { GetLinePoints(t, q, GetLength(t) ); box += q[0]; box += q[1]; } }
void SpotLightAttenuationManipulator::UpdateShapes(TimeValue t, TSTR& toolTip) { GenLight* pLight = (GenLight*) mhTarget; Matrix3 tm; tm = mpINode->GetObjectTM(t); Point3 pt; b = GetTargetPoint(t, pt); if (!b) return; float dist = pLight->GetAtten(t, mAttenuationType); TSTR nodeName; nodeName = mpINode->GetName(); float den = FLength(tm.GetRow(2)); float targetDist = (den!=0) ? FLength(tm.GetTrans()-pt) / den : 0.0f; toolTip.printf("%s: %5.2f", mAttenName.data(), (double) dist); SetGizmoScale(targetDist / 40.0); ConeDistanceManipulator::UpdateShapes(Point3(0,0,0), Point3(0,0,-1), dist, pLight->GetFallsize(t), false); }
//Get a bounding box. This is used for when we display the formation continously. void FormationBhvr::GetWorldBoundBox(TimeValue t, ViewExp *vpt, Box3& box) { if ( ! vpt || ! vpt->IsAlive() ) { box.Init(); return; } //make sure we have everything we need... if(DisplayFormation(t)==FALSE) return; if(GetFollowerCount(t)<=0) return; if(GetFollowerMatrixCount(t)<=0) return; //possible to not have this set when the follower is set.. INode *leaderNode; leaderNode = GetLeader(t); if(leaderNode==NULL) return; //for each follower we need to increase the bounding box by it's //world position location... for(int i =0;i<GetFollowerCount(t);i++) { if(GetFollower(t,i)) //if we have a a node... { Matrix3 worldSpace = GetFollowerMatrix(t,i)*GetCurrentMatrix(leaderNode,t); Point3 trans(worldSpace.GetTrans()); //expand the box by the worldposition... box += trans; } } }
int SymmetryMod::Display (TimeValue t, INode* inode, ViewExp *vpt, int flagst, ModContext *mc) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } GraphicsWindow *gw = vpt->getGW(); Point3 pt[4]; Matrix3 tm = CompMatrix(t,inode,mc); int savedLimits; gw->setRndLimits((savedLimits = gw->getRndLimits()) & ~GW_ILLUM); gw->setTransform(tm); if (mp_ip && mp_ip->GetSubObjectLevel() == 1) { gw->setColor(LINE_COLOR,GetUIColor(COLOR_SEL_GIZMOS)); } else { gw->setColor(LINE_COLOR,GetUIColor(COLOR_GIZMOS)); } DrawLineProc lp(gw); DrawGizmo (vpt->GetScreenScaleFactor(tm.GetTrans())*SCREEN_SCALE,lp); gw->setRndLimits(savedLimits); return 0; }
// From BaseObject int TapeHelpObject::DrawLine(TimeValue t, INode* inode, GraphicsWindow *gw, int drawing ) { Matrix3 tm = inode->GetObjectTM(t); gw->setTransform(tm); gw->clearHitCode(); Point3 pt,v[3]; if (GetTargetPoint(t,inode,pt)) { float den = Length(tm.GetRow(2)); float dist = (den!=0)?Length(tm.GetTrans()-pt)/den : 0.0f; if(!inode->IsFrozen() && !inode->Dependent() && drawing) gw->setColor( LINE_COLOR, GetUIColor(COLOR_TAPE_OBJ)); if (drawing) { if(specLenState) { GetLinePoints(t, v, GetLength(t) ); if(drawing == -1) v[1] = 0.9f * v[1]; } else { v[0] = Point3(0,0,0); if(drawing == -1) // hit-testing! Shorten the line so target can be picked v[1] = Point3(0.0f, 0.0f, -0.9f * dist); else v[1] = Point3(0.0f, 0.0f, -dist); } gw->polyline( 2, v, NULL, NULL, FALSE, NULL ); } } return gw->checkHitCode(); }
void SpotLightFalloffManipulator::UpdateShapes(TimeValue t, TSTR& toolTip) { GenLight* pLight = (GenLight*) mhTarget; Matrix3 tm; tm = mpINode->GetObjectTM(t); Point3 pt; float dist; BOOL b = GetTargetPoint(t, pt); if (!b) { dist = pLight->GetTDist(t); } else { float den = FLength(tm.GetRow(2)); dist = (den!=0) ? FLength(tm.GetTrans()-pt) / den : 0.0f; } TSTR nodeName; nodeName = mpINode->GetName(); toolTip.printf("%s [Falloff: %5.2f]", nodeName.data(), (double) pLight->GetFallsize(t)); SetGizmoScale(dist / kRingScaleFactor); ConeAngleManipulator::SetValues(Point3(0,0,0), Point3(0,0,-1), dist, DegToRad(pLight->GetFallsize(t)), pLight->GetSpotShape() == RECT_LIGHT, pLight->GetAspect(t)); }
Point3 PBombField::Force(TimeValue t,const Point3 &pos, const Point3 &vel,int index) { float d,chaos,dv; Point3 dlta,xb,yb,zb,center,expv; int decaytype,symm; Point3 zero=Zero; fValid = FOREVER; if (!tmValid.InInterval(t)) { tmValid = FOREVER; tm = node->GetObjectTM(t,&tmValid); invtm = Inverse(tm); } xb=tm.GetRow(0); yb=tm.GetRow(1); zb=tm.GetRow(2); center=tm.GetTrans(); fValid &= tmValid; TimeValue t0,t2,lastsfor; obj->pblock->GetValue(PB_STARTTIME,t,t0,fValid); obj->pblock->GetValue(PB_LASTSFOR,t,lastsfor,fValid); t2=t0+lastsfor; dlta=Zero; if ((t>=t0)&&(t<=t2)) { float L=Length(dlta=pos-center); obj->pblock->GetValue(PB_DECAY,t,d,fValid); obj->pblock->GetValue(PB_DECAYTYPE,t,decaytype,fValid); if ((decaytype==0)||(L<=d)) { obj->pblock->GetValue(PB_DELTA_V,t,dv,fValid); obj->pblock->GetValue(PB_CHAOS,t,chaos,fValid); obj->pblock->GetValue(PB_SYMMETRY,t,symm,fValid); Point3 r; if (symm==SPHERE) expv=(r=dlta/L); else if (symm==PLANAR) { L=DotProd(dlta,zb); expv=(L<0.0f?L=-L,-zb:zb); } else { Point3 E; E=DotProd(dlta,xb)*xb+DotProd(dlta,yb)*yb; L=Length(E); expv=E/L; } dlta=(dv*expv)/(float)dtsq; if (decaytype==1) dlta*=(d-L)/d; else if (decaytype==2) dlta*=(1/(float)exp(L/d)); if ((!FloatEQ0(chaos))&&(lastsfor==0.0f)) { float theta; theta=HalfPI*chaos*RND01(); // Martell 4/14/01: Fix for order of ops bug. float ztmp=RND11(); float ytmp=RND11(); float xtmp=RND11(); Point3 d=Point3(xtmp,ytmp,ztmp); Point3 c=Normalize(dlta^d); RotateOnePoint(&dlta.x,&zero.x,&c.x,theta); } } else dlta=Zero; } return dlta; }
void MirrorMod::GetSubObjectCenters( SubObjAxisCallback *cb,TimeValue t, INode *node,ModContext *mc) { Matrix3 tm = CompMatrix(t,node,mc); cb->Center(tm.GetTrans(),0); }
void SpotLightMultiplierManipulator::UpdateShapes(TimeValue t, TSTR& toolTip) { GenLight* pLight = (GenLight*) mhTarget; Matrix3 tm; tm = mpINode->GetObjectTM(t); Point3 pt; b = GetTargetPoint(t, pt); if (!b) return; TSTR nodeName; nodeName = mpINode->GetName(); float den = FLength(tm.GetRow(2)); float targetDist = (den!=0) ? FLength(tm.GetTrans()-pt) / den : 0.0f; toolTip.printf("%s: %5.2f", "Multiplier", (double) pLight->GetIntensity(t)); SetGizmoScale(targetDist / 40.0); float dist = (targetDist / 2.0) * pLight->GetIntensity(t); ConeDistanceManipulator::UpdateShapes(Point3(0,0,0), Point3(0,0,-1), dist, pLight->GetFallsize(t), true); }
int MirrorMod::Display( TimeValue t, INode* inode, ViewExp *vpt, int flagst, ModContext *mc) { GraphicsWindow *gw = vpt->getGW(); Point3 pt[4]; Matrix3 tm = CompMatrix(t,inode,mc); int savedLimits; gw->setRndLimits((savedLimits = gw->getRndLimits()) & ~GW_ILLUM); gw->setTransform(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)); } DrawLineProc lp(gw); DrawGizmo( vpt->GetScreenScaleFactor(tm.GetTrans())*SCREEN_SCALE,lp); gw->setRndLimits(savedLimits); return 0; }
bool CollisionImport::ImportBase(bhkRigidBodyRef body, bhkShapeRef shape, INode* parent, INode *shapeNode, Matrix3& tm) { // Now do common post processing for the node if (shapeNode != NULL) { shapeNode->SetName( TSTR(shape->GetType().GetTypeName().c_str()) ); if (!tm.IsIdentity()) { Point3 pos = tm.GetTrans(); Quat rot(tm); PosRotScaleNode(shapeNode, pos, rot, 1.0, prsDefault); } // Wireframe Red color StdMat2 *collMat = NewDefaultStdMat(); collMat->SetDiffuse(Color(1.0f, 0.0f, 0.0f), 0); collMat->SetWire(TRUE); collMat->SetFaceted(TRUE); ni.gi->GetMaterialLibrary().Add(collMat); shapeNode->SetMtl(collMat); shapeNode->SetPrimaryVisibility(FALSE); shapeNode->SetSecondaryVisibility(FALSE); shapeNode->BoneAsLine(TRUE); shapeNode->SetRenderable(FALSE); //shapeNode->XRayMtl(TRUE); shapeNode->SetWireColor( RGB(255,0,0) ); if (parent) parent->AttachChild(shapeNode); return true; } return false; }
void AxisViewportRect(ViewExp *vpt, const Matrix3 &tm, float length, Rect *rect) { Matrix3 tmn = tm; float zoom; IPoint3 wpt; Point3 pt; GraphicsWindow *gw = vpt->getGW(); // Get width of viewport in world units: --DS zoom = vpt->GetScreenScaleFactor(tmn.GetTrans())*ZFACT; tmn.Scale( Point3(zoom,zoom,zoom) ); gw->setTransform( tmn ); pt = Point3(0.0f, 0.0f, 0.0f); gw->wTransPoint( &pt, &wpt ); rect->left = rect->right = wpt.x; rect->top = rect->bottom = wpt.y; AxisRect( gw, Point3(length,0.0f,0.0f),rect ); AxisRect( gw, Point3(0.0f,length,0.0f),rect ); AxisRect( gw, Point3(0.0f,0.0f,length),rect ); rect->right += 2; rect->bottom += 2; rect->left -= 2; rect->top -= 2; }
void SpotLightFalloffManipulator::UpdateShapes(TimeValue t, TSTR& toolTip) { GenLight* pLight = (GenLight*) mhTarget; Matrix3 tm; tm = mpINode->GetObjectTM(t); Point3 pt; b = GetTargetPoint(t, pt); if (!b) return; float den = FLength(tm.GetRow(2)); float dist = (den!=0) ? FLength(tm.GetTrans()-pt) / den : 0.0f; TSTR nodeName; nodeName = mpINode->GetName(); tm = Inverse(tm); toolTip.printf("Falloff: %5.2f", (double) pLight->GetFallsize(t)); SetGizmoScale(dist / kRingScaleFactor); ConeAngleManipulator::UpdateShapes(Point3(0,0,0), Point3(0,0,-1), dist, pLight->GetFallsize(t)); }
void makBoneTrans2(INode* pNode , sBoneTrans_t& boneTrans , Matrix3& mat) { Point3 Trans = mat.GetTrans(); Matrix3 RotMat = mat; Matrix3 ScaleMat = mat; RotMat.NoScale(); ScaleMat = mat * Inverse(RotMat); //算出Scale Matrix; RotMat.NoTrans(); Quat RotQuat(RotMat); //ScaleMat.NoRot(); //ScaleMat.NoTrans(); boneTrans.m_Rotate = conv_type<sQuat_t , Quat>(RotQuat); boneTrans.m_Trans = conv_type<sVector_t ,Point3 >(Trans); boneTrans.m_Scale.x = ScaleMat.GetRow(0).x; boneTrans.m_Scale.y = ScaleMat.GetRow(1).y; boneTrans.m_Scale.z = ScaleMat.GetRow(2).z; if( abs(boneTrans.m_Scale.x - boneTrans.m_Scale.y) > 0.000001 || abs(boneTrans.m_Scale.y - boneTrans.m_Scale.z) > 0.000001 || abs(boneTrans.m_Scale.z - boneTrans.m_Scale.x) > 0.000001 ) { std::wstring _NodeName = INodeName(pNode); XEVOL_LOG(eXL_DEBUG_HIGH , L" {警告} : 骨头[ %s ] 的上有NonUniformScale\r\n", _NodeName.c_str() ); } }
int SymmetryMod::HitTest (TimeValue t, INode* inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt, ModContext* mc) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } GraphicsWindow *gw = vpt->getGW(); Point3 pt; HitRegion hr; int savedLimits, res = 0; Matrix3 tm = CompMatrix(t,inode,mc); MakeHitRegion(hr,type, crossing,4,p); gw->setHitRegion(&hr); gw->setRndLimits(((savedLimits = gw->getRndLimits()) | GW_PICK) & ~GW_ILLUM); gw->setTransform(tm); gw->clearHitCode(); DrawLineProc lp(gw); DrawGizmo( vpt->GetScreenScaleFactor(tm.GetTrans())*SCREEN_SCALE,lp); gw->setRndLimits(savedLimits); if (gw->checkHitCode()) { vpt->LogHit(inode, mc, gw->getHitDistance(), 0, NULL); return 1; } return 0; }
void TapeHelpObject::GetWorldBoundBox(TimeValue t, INode* inode, ViewExp* vpt, Box3& box ) { if ( ! vpt || ! vpt->IsAlive() ) { box.Init(); return; } int i, nv; Matrix3 tm; float dtarg; Point3 pt; Point3 q[2]; GetMat(t,inode,*vpt,tm); nv = mesh.getNumVerts(); box.Init(); for (i=0; i<nv; i++) box += tm*mesh.getVert(i); if (GetTargetPoint(t,inode,pt)) { tm = inode->GetObjectTM(t); dtarg = Length(tm.GetTrans()-pt)/Length(tm.GetRow(2)); box += tm*Point3(float(0),float(0),-dtarg); } if(GetSpecLen()) { GetLinePoints(t, q, GetLength(t) ); box += tm * q[0]; box += tm * q[1]; } }
void MembraneVertexShader::GetCameraPosition(Point3 &Pos) { Interface *ip = GetCOREInterface(); INode *pObj; Matrix3 objTM; Pos.x = 0.0f; Pos.y = 0.0f; Pos.z = -200.0f; INode *pRoot =ip->GetRootNode(); int numNodes = pRoot->NumberOfChildren(); for( int ctr = 0; ctr < numNodes; ctr++) { pObj = pRoot->GetChildNode(ctr); // The ObjectState is a 'thing' that flows down the pipeline containing // all information about the object. By calling EvalWorldState() we tell // max to eveluate the object at end of the pipeline. ObjectState os = pObj->EvalWorldState(ip->GetTime()); // The obj member of ObjectState is the actual object we will export. if (os.obj) { // We look at the super class ID to determine the type of the object. switch(os.obj->SuperClassID()) { case CAMERA_CLASS_ID: objTM = pObj->GetNodeTM(ip->GetTime()); Pos = objTM.GetTrans(); break; } } } }
std::string LuxMaxUtils::getMaxNodeTransform(INode* node) { LuxMaxUtils *lmutil; std::string tmpTrans = ""; Matrix3 nodeTransformPos = node->GetObjTMAfterWSM(GetCOREInterface()->GetTime()); Matrix3 nodeTransformRot = nodeTransformPos; Matrix3 nodeTransformScale = nodeTransformPos; nodeTransformRot.NoTrans(); nodeTransformScale.NoTrans(); nodeTransformScale.NoRot(); nodeTransformRot = nodeTransformRot * nodeTransformScale; tmpTrans.append(floatToString(nodeTransformRot.GetColumn(0).x)); tmpTrans.append(" "); tmpTrans.append(floatToString(nodeTransformRot.GetColumn(1).x)); tmpTrans.append(" "); tmpTrans.append(floatToString(nodeTransformRot.GetColumn(2).x)); tmpTrans.append(" "); tmpTrans.append("0 "); tmpTrans.append(floatToString(nodeTransformRot.GetColumn(0).y)); tmpTrans.append(" "); tmpTrans.append(floatToString(nodeTransformRot.GetColumn(1).y)); tmpTrans.append(" "); tmpTrans.append(floatToString(nodeTransformRot.GetColumn(2).y)); tmpTrans.append(" "); tmpTrans.append("0 "); tmpTrans.append(floatToString(nodeTransformRot.GetColumn(0).z)); tmpTrans.append(" "); tmpTrans.append(floatToString(nodeTransformRot.GetColumn(1).z)); tmpTrans.append(" "); tmpTrans.append(floatToString(nodeTransformRot.GetColumn(2).z)); tmpTrans.append(" "); tmpTrans.append("0 "); tmpTrans.append(floatToString(nodeTransformPos.GetTrans().x)); tmpTrans.append(" "); tmpTrans.append(floatToString(nodeTransformPos.GetTrans().y)); tmpTrans.append(" "); tmpTrans.append(floatToString(nodeTransformPos.GetTrans().z)); tmpTrans.append(" 1.0"); return tmpTrans; }
void FExtrudeMod::GetSubObjectCenters (SubObjAxisCallback *cb, TimeValue t, INode *node,ModContext *mc) { Matrix3 tm = CompMatrix(t,node,mc); Point3 p; mp_base->GetValue(t,&p,FOREVER,CTRL_ABSOLUTE); tm.PreTranslate(p); cb->Center(tm.GetTrans(),0); }
void Exporter::CalcBoundingBox(INode *node, Box3& box, int all) { if (nullptr == node) return; Matrix3 tm = node->GetObjTMAfterWSM(0); if (node->IsBoneShowing()) { box.IncludePoints(const_cast<Point3*>(&tm.GetTrans()), 1, nullptr); } else { if (Object *o = node->GetObjectRef()) { if (o->SuperClassID() == GEOMOBJECT_CLASS_ID) { if (o->ClassID() == BONE_OBJ_CLASSID || o->ClassID() == Class_ID(BONE_CLASS_ID, 0) || o->ClassID() == Class_ID(0x00009125, 0) /* Biped Twist Helpers */ ) { box.IncludePoints(const_cast<Point3*>(&tm.GetTrans()), 1, nullptr); } else { Box3 local; #if VERSION_3DSMAX < (15000<<16) // Version 15 (2013) o->GetLocalBoundBox(0, node, mI->GetActiveViewport(), local); #else o->GetLocalBoundBox(0, node, &mI->GetActiveViewExp(), local); #endif box.IncludePoints(&local.Min(), 1, nullptr); box.IncludePoints(&local.Max(), 1, nullptr); } } else if (mExportCameras && o->SuperClassID() == CAMERA_CLASS_ID) { box.IncludePoints(const_cast<Point3*>(&tm.GetTrans()), 1, nullptr); } } } if (all < 0) return; all = (all>0 ? all : -1); for (int i = 0; i < node->NumberOfChildren(); i++) { CalcBoundingBox(node->GetChildNode(i), box, all); } }
BOOL ProtHelpObject::GetTargetPoint(int which, TimeValue t, Point3 *pt) { if(refNode[which]) { Matrix3 tm = refNode[which]->GetObjectTM(t); *pt = tm.GetTrans(); return TRUE; } return FALSE; }
static int GetTargetPoint(TimeValue t, INode *inode, Point3& p) { Matrix3 tmat; if (inode->GetTargetTM(t,tmat)) { p = tmat.GetTrans(); return 1; } return 0; }
void MirrorMod::GetWorldBoundBox( TimeValue t,INode* inode, ViewExp *vpt, Box3& box, ModContext *mc) { GraphicsWindow *gw = vpt->getGW(); Matrix3 tm = CompMatrix(t,inode,mc); BoxLineProc bproc(&tm); DrawGizmo( vpt->GetScreenScaleFactor(tm.GetTrans())*SCREEN_SCALE,bproc); box = bproc.Box(); }
BOOL ConeAngleManipulator::GetTargetPoint(TimeValue t, Point3& p) { Matrix3 tmat; if (mpINode->GetTargetTM(t,tmat)) { p = tmat.GetTrans(); return TRUE; } else return FALSE; }
int ProtHelpObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } Matrix3 m; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); created = TRUE; GetMat(t,inode,*vpt,m); gw->setTransform(m); DWORD rlim = gw->getRndLimits(); gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY|GW_BACKCULL| (rlim&GW_Z_BUFFER) ); if (inode->Selected()) gw->setColor( LINE_COLOR, GetSelColor()); else if(!inode->IsFrozen() && !inode->Dependent()) gw->setColor( LINE_COLOR, GetUIColor(COLOR_TAPE_OBJ)); mesh.render( gw, mtl, NULL, COMP_ALL); // calc angle lastAngle = 0.0; #define RadToDegDbl (180.0 / 3.141592653589793) if(refNode[0] && refNode[1]) { Point3 origin = m.GetTrans(); Point3 vec1 = refNode[0]->GetObjectTM(t).GetTrans() - origin; Point3 vec2 = refNode[1]->GetObjectTM(t).GetTrans() - origin; float len1 = Length(vec1); float len2 = Length(vec2); if(len1 > 0.00001f && len2 > 0.00001f) { double cosAng = (double)DotProd(vec1, vec2) / (double)(len1 * len2); if(fabs(cosAng) <= 0.999999) // beyond float accuracy! lastAngle = acos(cosAng) * RadToDegDbl; else lastAngle = 180.0; } } #if 0 Point3 pt(0,0,0); TCHAR buf[32]; _stprintf(buf, "%g", lastAngle); gw->setColor(TEXT_COLOR, GetUIColor(COLOR_TAPE_OBJ)); gw->text(&pt, buf); #endif DrawLines(t, inode, gw, 1); UpdateUI(t); gw->setRndLimits(rlim); return(0); }
void ProtHelpObject::GetMat(TimeValue t, INode* inode, ViewExp& vpt, Matrix3& tm) { if ( ! vpt.IsAlive() ) { tm.Zero(); return; } tm = inode->GetObjectTM(t); tm.NoScale(); float scaleFactor = vpt.NonScalingObjectSize() * vpt.GetVPWorldWidth(tm.GetTrans()) / 360.0f; tm.Scale(Point3(scaleFactor,scaleFactor,scaleFactor)); }
void VRayCamera::getTM(TimeValue t, INode *node, ViewExp *vpt, Matrix3 &tm) { tm=node->GetObjectTM(t); AffineParts ap; decomp_affine(tm, &ap); tm.IdentityMatrix(); tm.SetRotate(ap.q); tm.SetTrans(ap.t); float scaleFactor=vpt->NonScalingObjectSize()*vpt->GetVPWorldWidth(tm.GetTrans())/360.0f; tm.Scale(Point3(scaleFactor,scaleFactor,scaleFactor)); }