void JointDrawer::Update( const Subject* updated_subject ) { if (updated_subject != mSubject) { // This is not the subject that we registered to. throw "Invalid subject."; } if (upm_Dots == mUserPaintMode) { DrawJoints(); } }
/* ==================== idRenderModelMD5::InstantiateDynamicModel ==================== */ idRenderModel *idRenderModelMD5::InstantiateDynamicModel( const struct renderEntity_s *ent, const struct viewDef_s *view, idRenderModel *cachedModel ) { int i, surfaceNum; idMD5Mesh *mesh; idRenderModelStatic *staticModel; if ( cachedModel && !r_useCachedDynamicModels.GetBool() ) { delete cachedModel; cachedModel = NULL; } if ( purged ) { common->DWarning( "model %s instantiated while purged", Name() ); LoadModel(); } if ( !ent->joints ) { common->Printf( "idRenderModelMD5::InstantiateDynamicModel: NULL joints on renderEntity for '%s'\n", Name() ); delete cachedModel; return NULL; } else if ( ent->numJoints != joints.Num() ) { common->Printf( "idRenderModelMD5::InstantiateDynamicModel: renderEntity has different number of joints than model for '%s'\n", Name() ); delete cachedModel; return NULL; } tr.pc.c_generateMd5++; if ( cachedModel ) { assert( dynamic_cast<idRenderModelStatic *>(cachedModel) != NULL ); assert( idStr::Icmp( cachedModel->Name(), MD5_SnapshotName ) == 0 ); staticModel = static_cast<idRenderModelStatic *>(cachedModel); } else { staticModel = new idRenderModelStatic; staticModel->InitEmpty( MD5_SnapshotName ); } staticModel->bounds.Clear(); if ( r_showSkel.GetInteger() ) { if ( ( view != NULL ) && ( !r_skipSuppress.GetBool() || !ent->suppressSurfaceInViewID || ( ent->suppressSurfaceInViewID != view->renderView.viewID ) ) ) { // only draw the skeleton DrawJoints( ent, view ); } if ( r_showSkel.GetInteger() > 1 ) { // turn off the model when showing the skeleton staticModel->InitEmpty( MD5_SnapshotName ); return staticModel; } } // create all the surfaces for( mesh = meshes.Ptr(), i = 0; i < meshes.Num(); i++, mesh++ ) { // avoid deforming the surface if it will be a nodraw due to a skin remapping // FIXME: may have to still deform clipping hulls const idMaterial *shader = mesh->shader; shader = R_RemapShaderBySkin( shader, ent->customSkin, ent->customShader ); if ( !shader || ( !shader->IsDrawn() && !shader->SurfaceCastsShadow() ) ) { staticModel->DeleteSurfaceWithId( i ); mesh->surfaceNum = -1; continue; } modelSurface_t *surf; if ( staticModel->FindSurfaceWithId( i, surfaceNum ) ) { mesh->surfaceNum = surfaceNum; surf = &staticModel->surfaces[surfaceNum]; } else { // Remove Overlays before adding new surfaces idRenderModelOverlay::RemoveOverlaySurfacesFromModel( staticModel ); mesh->surfaceNum = staticModel->NumSurfaces(); surf = &staticModel->surfaces.Alloc(); surf->geometry = NULL; surf->shader = NULL; surf->id = i; } mesh->UpdateSurface( ent, ent->joints, surf ); staticModel->bounds.AddPoint( surf->geometry->bounds[0] ); staticModel->bounds.AddPoint( surf->geometry->bounds[1] ); } return staticModel; }