int EditFaceDataMod::HitTest (TimeValue t, INode* inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt, ModContext* mc) { Interval valid; int savedLimits, res = 0; GraphicsWindow *gw = vpt->getGW(); HitRegion hr; // Setup GW MakeHitRegion(hr,type, crossing,4,p); gw->setHitRegion(&hr); Matrix3 mat = inode->GetObjectTM(t); gw->setTransform(mat); gw->setRndLimits(((savedLimits = gw->getRndLimits()) | GW_PICK) & ~GW_ILLUM); gw->clearHitCode(); if (!mc->localData) return 0; EditFaceDataModData *md = (EditFaceDataModData*)mc->localData; Mesh *mesh = md->GetCacheMesh (); MNMesh *mnmesh = md->GetCacheMNMesh (); SubObjHitList hitList; if (mesh) { res = mesh->SubObjectHitTest(gw, gw->getMaterial(), &hr, flags|hitLevel[selLevel], hitList); } else if (mnmesh) { res = mnmesh->SubObjectHitTest (gw, gw->getMaterial(), &hr, flags|mnhitLevel[selLevel], hitList); } MeshSubHitRec *rec = hitList.First(); while (rec) { vpt->LogHit(inode,mc,rec->dist,rec->index,NULL); rec = rec->Next(); } gw->setRndLimits(savedLimits); return res; }
// From BaseObject int SimpleWSMObject::HitTest(TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } Point2 pt( (float)p[0].x, (float)p[0].y ); HitRegion hitRegion; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); UpdateMesh(t); gw->setTransform(inode->GetObjectTM(t)); MakeHitRegion(hitRegion, type, crossing, 4, p); DWORD rlim = gw->getRndLimits(); int res; gw->setRndLimits((rlim|GW_PICK|GW_WIREFRAME) & ~(GW_ILLUM|GW_BACKCULL|GW_FLAT|GW_SPECULAR)); res = mesh.select(gw, mtl, &hitRegion, flags & HIT_ABORTONHIT); gw->setRndLimits(rlim); return res; }
// From BaseObject int TargetObject::HitTest(TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } HitRegion hitRegion; DWORD savedLimits; Matrix3 m; GraphicsWindow *gw = vpt->getGW(); MakeHitRegion(hitRegion,type,crossing,4,p); gw->setRndLimits(((savedLimits = gw->getRndLimits()) | GW_PICK) & ~GW_ILLUM); GetMat(t,inode,*vpt,m); gw->setTransform(m); if(mesh.select( gw, gw->getMaterial(), &hitRegion, flags & HIT_ABORTONHIT )) return TRUE; gw->setRndLimits( savedLimits ); return FALSE; #if 0 gw->setHitRegion(&hitRegion); gw->clearHitCode(); gw->fWinMarker(&pt, HOLLOW_BOX_MRKR); return gw->checkHitCode(); #endif }
int bhkCapsuleObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) { Matrix3 m; Color color = Color(inode->GetWireColor()); GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); m = inode->GetObjectTM(t); gw->setTransform(m); DWORD rlim = gw->getRndLimits(); DWORD newrlim = GW_WIREFRAME/*|GW_Z_BUFFER*/; #if VERSION_3DSMAX >= ((5000<<16)+(15<<8)+0) // Version 5+ newrlim |= GW_EDGES_ONLY; #endif gw->setRndLimits(newrlim); if (inode->Selected()) gw->setColor( LINE_COLOR, GetSelColor()); else if(!inode->IsFrozen() && !inode->Dependent()) gw->setColor( LINE_COLOR, color); UpdateMesh(t); mesh.render( gw, mtl, NULL, COMP_ALL); gw->setRndLimits(rlim); return 0; }
int FogObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here? DbgAssert(!"Doing Display() on invalid view port!"); return FALSE; } float radius; pblock->GetValue(PB_FOG_SIZE, t, radius, FOREVER); if (radius <= 0.0) return 0; BuildMesh(t); Matrix3 m; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); DWORD rlim = gw->getRndLimits(); gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY|GW_BACKCULL| (rlim&GW_Z_BUFFER) ); GetMat(t,inode,*vpt,m); gw->setTransform(m); if (inode->Selected()) gw->setColor( LINE_COLOR, 1.0f, 1.0f, 1.0f); else if(!inode->IsFrozen()) gw->setColor( LINE_COLOR, 1.0f, 0.0f, 0.0f); mesh.render( gw, mtl, NULL, COMP_ALL); gw->setRndLimits(rlim); return(0); }
int LuminaireObject::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; if (dumFlags&DISABLE_DISPLAY) return 0; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); m = inode->GetObjectTM(t); 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, color.x, color.y, color.z); UpdateMesh(); mesh.render( gw, mtl, NULL, COMP_ALL); gw->setRndLimits(rlim); return 0; }
int RainParticle::Display( TimeValue t, INode* inode, ViewExp *vpt, int flags ) { if (!OKtoDisplay(t)) return 0; GraphicsWindow *gw = vpt->getGW(); DWORD rlim = gw->getRndLimits(); // Draw emitter gw->setRndLimits(GW_WIREFRAME | GW_EDGES_ONLY | (rlim & GW_Z_BUFFER) ); if (inode->Selected()) { gw->setColor( LINE_COLOR, GetSelColor()); } else if(!inode->IsFrozen()) { gw->setColor(LINE_COLOR,GetUIColor(COLOR_PARTICLE_EM)); } Material *mtl = gw->getMaterial(); if (mtl && !inode->Selected() && !inode->IsFrozen()) { gw->setColor(LINE_COLOR, mtl->Kd[0], mtl->Kd[1], mtl->Kd[2]); } gw->setTransform(inode->GetObjTMBeforeWSM(t)); mesh.render(gw, mtl, (flags & USE_DAMAGE_RECT) ? &vpt->GetDammageRect() : NULL, COMP_ALL); return 0; }
int FogObject::HitTest(TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here? DbgAssert(!"Doing HitTest() on invalid view port!"); return FALSE; } HitRegion hitRegion; DWORD savedLimits; int res = FALSE; Matrix3 m; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); MakeHitRegion(hitRegion,type,crossing,4,p); gw->setRndLimits(((savedLimits = gw->getRndLimits()) | GW_PICK) & ~GW_ILLUM); GetMat(t,inode,*vpt,m); gw->setTransform(m); gw->clearHitCode(); if (mesh.select( gw, mtl, &hitRegion, flags & HIT_ABORTONHIT )) return TRUE; gw->setRndLimits(savedLimits); return res; }
int ProtHelpObject::HitTest(TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } HitRegion hitRegion; DWORD savedLimits; int res; Matrix3 m; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); MakeHitRegion(hitRegion,type,crossing,4,p); gw->setRndLimits(((savedLimits = gw->getRndLimits()) | GW_PICK) & ~GW_ILLUM); GetMat(t,inode,*vpt,m); gw->setTransform(m); // if we get a hit on the mesh, we're done gw->clearHitCode(); if (mesh.select( gw, mtl, &hitRegion, flags & HIT_ABORTONHIT )) return TRUE; // if not, check the target line, and set the pair flag if it's hit gw->clearHitCode(); res = DrawLines(t, inode, gw, 1); gw->setRndLimits(savedLimits); return res; }
int BackgroundObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) { float radius; pblock->GetValue(PB_BG_SIZE, t, radius, FOREVER); if (radius <= 0.0) return 0; BuildMesh(t); Matrix3 m; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); DWORD rlim = gw->getRndLimits(); gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY|GW_BACKCULL); GetMat(t,inode,vpt,m); gw->setTransform(m); if (inode->Selected()) gw->setColor( LINE_COLOR, 1.0f, 1.0f, 1.0f); else if(!inode->IsFrozen()) gw->setColor( LINE_COLOR, 1.0f, 1.0f, 0.0f); mesh.render( gw, mtl, NULL, COMP_ALL); gw->setRndLimits(rlim); return(0); }
int SimpleParticle::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) { if (!OKtoDisplay(t)) return 0; Update(t,inode); GraphicsWindow *gw = vpt->getGW(); DWORD rlim = gw->getRndLimits(); // Draw emitter 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()) //gw->setColor( LINE_COLOR, particleMtl.Kd[0], particleMtl.Kd[1], particleMtl.Kd[2]); gw->setColor(LINE_COLOR,GetUIColor(COLOR_PARTICLE_EM)); if (EmitterVisible()) { gw->setTransform(inode->GetObjTMBeforeWSM(t)); mesh.render(gw, &particleMtl, (flags&USE_DAMAGE_RECT) ? &vpt->GetDammageRect() : NULL, COMP_ALL); } // Draw particles gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY|GW_BACKCULL| (rlim&(GW_Z_BUFFER|GW_BOX_MODE)) ); Material *mtl = gw->getMaterial(); if (!inode->Selected() && !inode->IsFrozen()) gw->setColor( LINE_COLOR, mtl->Kd[0], mtl->Kd[1], mtl->Kd[2]); gw->setTransform(ident); parts.Render(gw,GetMarkerType()); gw->setRndLimits(rlim); return(0); }
int bhkProxyObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) { if (forceRedraw) { Interface *gi = GetCOREInterface(); gi->ForceCompleteRedraw(); } Matrix3 m; Color color = Color(inode->GetWireColor()); GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); m = inode->GetObjectTM(t); gw->setTransform(m); DWORD rlim = gw->getRndLimits(); DWORD newrlim = GW_WIREFRAME|GW_Z_BUFFER; #if VERSION_3DSMAX >= ((5000<<16)+(15<<8)+0) // Version 5+ newrlim |= GW_EDGES_ONLY; #endif gw->setRndLimits(newrlim); if (inode->Selected()) gw->setColor( LINE_COLOR, GetSelColor()); else if(!inode->IsFrozen() && !inode->Dependent()) gw->setColor( LINE_COLOR, color); Matrix3 m3(true); float size = 20.0f; Point3 pts[5]; // X pts[0] = Point3(-size, 0.0f, 0.0f); pts[1] = Point3(size, 0.0f, 0.0f); vpt->getGW()->polyline(2, pts, NULL, NULL, FALSE, NULL); // Y pts[0] = Point3(0.0f, -size, 0.0f); pts[1] = Point3(0.0f, size, 0.0f); vpt->getGW()->polyline(2, pts, NULL, NULL, FALSE, NULL); // Z pts[0] = Point3(0.0f, 0.0f, -size); pts[1] = Point3(0.0f, 0.0f, size); vpt->getGW()->polyline(2, pts, NULL, NULL, FALSE, NULL); //UpdateMesh(t); int bvType = 0; pblock2->GetValue(PB_BOUND_TYPE, 0, bvType, FOREVER, 0); if (bvType != 0) { Matrix3 tm = gw->getTransform(); Matrix3 proxyTM(true); proxyTM.SetTranslate(proxyPos); gw->setTransform(proxyTM); proxyMesh.render( gw, mtl, NULL, COMP_ALL); gw->setTransform(tm); } gw->setRndLimits(rlim); return 0; }
// From BaseObject int TriPatchObject::HitTest(TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt) { HitRegion hitRegion; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); UpdatePatchMesh(t); gw->setTransform(inode->GetObjectTM(t)); MakeHitRegion(hitRegion, type, crossing, 4, p); return patch.select( gw, mtl, &hitRegion, flags & HIT_ABORTONHIT ); }
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); }
int TargetObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } if (MaxSDK::Graphics::IsRetainedModeEnabled()) { // 11/15/2010 // In Nitrous view port, do not draw the target when seeing from the target's camera if (NULL != vpt && NULL != vpt->GetViewCamera() && vpt->GetViewCamera()->GetTarget() == inode) { return 0; } } Matrix3 m; GraphicsWindow *gw = vpt->getGW(); 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() && inode->GetLookatNode()) { const ObjectState& os = inode->GetLookatNode()->EvalWorldState(t); Object* ob = os.obj; // 6/25/01 3:32pm --MQM-- // set color to wire-frame color, // instead of COLOR_LIGHT_OBJ or COLOR_CAMERA_OBJ if ( (ob!=NULL) && ( (ob->SuperClassID()==LIGHT_CLASS_ID) || (ob->SuperClassID()==CAMERA_CLASS_ID) ) ) { Color color(inode->GetWireColor()); gw->setColor( LINE_COLOR, color ); } else gw->setColor( LINE_COLOR, GetUIColor(COLOR_CAMERA_OBJ)); // default target color, just use camera targ color } mesh.render( gw, gw->getMaterial(), NULL, COMP_ALL); gw->setRndLimits(rlim); // gw->fWinMarker(&pt,HOLLOW_BOX_MRKR); return(0); }
int PointHelpObject::HitTest( TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } Matrix3 tm(1); HitRegion hitRegion; DWORD savedLimits; Point3 pt(0,0,0); GraphicsWindow *gw = vpt->getGW(); gw->setTransform(tm); Material *mtl = gw->getMaterial(); tm = inode->GetObjectTM(t); MakeHitRegion(hitRegion, type, crossing, 4, p); gw->setRndLimits(((savedLimits = gw->getRndLimits())|GW_PICK)&~GW_ILLUM); gw->setHitRegion(&hitRegion); gw->clearHitCode(); DrawAndHit(t, inode, vpt); /* if (showAxis) { DrawAxis(vpt,tm,axisLength,screenSize); } gw->setTransform(tm); gw->marker(&pt,X_MRKR); */ gw->setRndLimits(savedLimits); // CAL-08/27/03: This doesn't make sense. It shouldn't do this. (Defect #468271) // This will always select this helper when there's an intersection on the bounding box and the selection window. // TODO: There's still a problem with window selection. We need to check if it hits all components in DrawAndHit. /* if((hitRegion.type != POINT_RGN) && !hitRegion.crossing) return TRUE; */ return gw->checkHitCode(); }
int LuminaireObject::HitTest(TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt) { HitRegion hitRegion; Matrix3 m; if (dumFlags&DISABLE_DISPLAY) return 0; GraphicsWindow *gw = vpt->getGW(); DWORD rlim = gw->getRndLimits(); gw->setRndLimits(GW_WIREFRAME|GW_EDGES_ONLY|GW_BACKCULL); Material *mtl = gw->getMaterial(); MakeHitRegion(hitRegion,type,crossing,4,p); m = inode->GetObjectTM(t); gw->setTransform(m); UpdateMesh(); int res =mesh.select( gw,mtl, &hitRegion, flags & HIT_ABORTONHIT ); gw->setRndLimits(rlim); return res; }
// From BaseObject int TriPatchObject::HitTest(TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } HitRegion hitRegion; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); UpdatePatchMesh(t); gw->setTransform(inode->GetObjectTM(t)); MakeHitRegion(hitRegion, type, crossing, 4, p); return patch.select( gw, mtl, &hitRegion, flags & HIT_ABORTONHIT ); }
int TapeHelpObject::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(); 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); DrawLine(t,inode,gw,1); gw->setRndLimits(rlim); if(editting && !specLenState) { Point3 pt(0,0,0); Matrix3 tm = inode->GetObjectTM(t); GetTargetPoint(t,inode,pt); float den = Length(tm.GetRow(2)); float dist = (den!=0)?Length(tm.GetTrans()-pt)/den : 0.0f; lengthSpin->SetValue( lastDist = dist, FALSE ); } if(editting) { m.NoTrans(); dirPt = m * Point3(0,0,1); float len = Length(dirPt); if(len != 0) dirPt *= 1.0f/len; UpdateUI(iObjParams->GetTime()); } return(0); }
int bhkListObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) { Matrix3 m; Color color = Color(inode->GetWireColor()); GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); m = inode->GetObjectTM(t); gw->setTransform(m); DWORD rlim = gw->getRndLimits(); DWORD newrlim = GW_WIREFRAME|GW_Z_BUFFER; #if VERSION_3DSMAX >= ((5000<<16)+(15<<8)+0) // Version 5+ newrlim |= GW_EDGES_ONLY; #endif gw->setRndLimits(newrlim); if (inode->Selected()) gw->setColor( LINE_COLOR, GetSelColor()); else if(!inode->IsFrozen() && !inode->Dependent()) gw->setColor( LINE_COLOR, color); Matrix3 m3(true); float size = 5.0f; Point3 pts[5]; // X pts[0] = Point3(-size, 0.0f, 0.0f); pts[1] = Point3(size, 0.0f, 0.0f); vpt->getGW()->polyline(2, pts, NULL, NULL, FALSE, NULL); // Y pts[0] = Point3(0.0f, -size, 0.0f); pts[1] = Point3(0.0f, size, 0.0f); vpt->getGW()->polyline(2, pts, NULL, NULL, FALSE, NULL); // Z pts[0] = Point3(0.0f, 0.0f, -size); pts[1] = Point3(0.0f, 0.0f, size); vpt->getGW()->polyline(2, pts, NULL, NULL, FALSE, NULL); //UpdateMesh(t); //mesh.render( gw, mtl, NULL, COMP_ALL); gw->setRndLimits(rlim); return 0; }
int BackgroundObject::HitTest(TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt) { HitRegion hitRegion; DWORD savedLimits; int res = FALSE; Matrix3 m; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); MakeHitRegion(hitRegion,type,crossing,4,p); gw->setRndLimits(((savedLimits = gw->getRndLimits()) | GW_PICK) & ~GW_ILLUM); GetMat(t,inode,vpt,m); gw->setTransform(m); gw->clearHitCode(); if (mesh.select( gw, mtl, &hitRegion, flags & HIT_ABORTONHIT )) return TRUE; gw->setRndLimits(savedLimits); return res; }
int TapeHelpObject::HitTest(TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt) { if ( ! vpt || ! vpt->IsAlive() ) { // why are we here DbgAssert(!_T("Invalid viewport!")); return FALSE; } HitRegion hitRegion; DWORD savedLimits; int res = 0; Matrix3 m; if (!enable) return 0; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); MakeHitRegion(hitRegion,type,crossing,4,p); gw->setRndLimits(((savedLimits = gw->getRndLimits()) | GW_PICK) & ~GW_ILLUM); GetMat(t,inode,*vpt,m); gw->setTransform(m); // if we get a hit on the mesh, we're done gw->clearHitCode(); if (mesh.select( gw, mtl, &hitRegion, flags & HIT_ABORTONHIT )) return TRUE; // if not, check the target line, and set the pair flag if it's hit // this special case only works with point selection if(type != HITTYPE_POINT) return 0; // don't let line be active if only looking at selected stuff and target isn't selected if((flags & HIT_SELONLY) && (inode->GetTarget()) && !inode->GetTarget()->Selected() ) return 0; gw->clearHitCode(); res = DrawLine(t,inode,gw,-1); if(res != 0) inode->SetTargetNodePair(1); gw->setRndLimits(savedLimits); return res; }
int Cal3DObject::Display(TimeValue t, INode *inode, ViewExp *vpt, int flags) { pblock->GetValue(PB_CAL_SIZE, t, scale, FOREVER); if (scale <= 0.0) return 0; BuildMesh(t); Matrix3 m; GraphicsWindow *gw = vpt->getGW(); Material *mtl = gw->getMaterial(); DWORD rlim = gw->getRndLimits(); gw->setRndLimits(/*GW_WIREFRAME*/ GW_ILLUM | GW_FLAT | GW_Z_BUFFER | GW_BACKCULL); GetMat(t, inode, vpt, m); gw->setTransform(m); if (inode->Selected()) gw->setColor(LINE_COLOR, 1.0f, 1.0f, 1.0f); else if (!inode->IsFrozen()) gw->setColor(LINE_COLOR, 0.0f, 1.0f, 0.0f); mesh.render(gw, mtl, NULL, COMP_ALL); gw->setRndLimits(rlim); return (0); }