private idRenderModel EntityDefinitionDynamicModel(idRenderEntity def)
{
bool callbackUpdate;
// allow deferred entities to construct themselves
if(def.Parameters.Callback != null)
{
callbackUpdate = false;
idConsole.Warning("TODO: R_IssueEntityDefCallback( def );");
}
else
{
callbackUpdate = false;
}
idRenderModel model = def.Parameters.Model;
if(model == null)
{
idConsole.Error("EntityDefinitionDynamicModel: null model");
}
if(model.IsDynamic == DynamicModel.Static)
{
def.DynamicModel = null;
def.DynamicModelFrameCount = 0;
return model;
}
idConsole.Warning("TODO: dynamic model rendering!");
// continously animating models (particle systems, etc) will have their snapshot updated every single view
/*if ( callbackUpdate || ( model->IsDynamicModel() == DM_CONTINUOUS && def->dynamicModelFrameCount != tr.frameCount ) ) {
R_ClearEntityDefDynamicModel( def );
}
// if we don't have a snapshot of the dynamic model, generate it now
if ( !def->dynamicModel ) {
// instantiate the snapshot of the dynamic model, possibly reusing memory from the cached snapshot
def->cachedDynamicModel = model->InstantiateDynamicModel( &def->parms, tr.viewDef, def->cachedDynamicModel );
if ( def->cachedDynamicModel ) {
// add any overlays to the snapshot of the dynamic model
if ( def->overlay && !r_skipOverlays.GetBool() ) {
def->overlay->AddOverlaySurfacesToModel( def->cachedDynamicModel );
} else {
idRenderModelOverlay::RemoveOverlaySurfacesFromModel( def->cachedDynamicModel );
}
if ( r_checkBounds.GetBool() ) {
idBounds b = def->cachedDynamicModel->Bounds();
if ( b[0][0] < def->referenceBounds[0][0] - CHECK_BOUNDS_EPSILON ||
b[0][1] < def->referenceBounds[0][1] - CHECK_BOUNDS_EPSILON ||
b[0][2] < def->referenceBounds[0][2] - CHECK_BOUNDS_EPSILON ||
b[1][0] > def->referenceBounds[1][0] + CHECK_BOUNDS_EPSILON ||
b[1][1] > def->referenceBounds[1][1] + CHECK_BOUNDS_EPSILON ||
b[1][2] > def->referenceBounds[1][2] + CHECK_BOUNDS_EPSILON ) {
common->Printf( "entity %i dynamic model exceeded reference bounds\n", def->index );
}
}
}
def->dynamicModel = def->cachedDynamicModel;
def->dynamicModelFrameCount = tr.frameCount;
}
// set model depth hack value
if ( def->dynamicModel && model->DepthHack() != 0.0f && tr.viewDef ) {
idPlane eye, clip;
idVec3 ndc;
R_TransformModelToClip( def->parms.origin, tr.viewDef->worldSpace.modelViewMatrix, tr.viewDef->projectionMatrix, eye, clip );
R_TransformClipToDevice( clip, tr.viewDef, ndc );
def->parms.modelDepthHack = model->DepthHack() * ( 1.0f - ndc.z );
}
*/
// FIXME: if any of the surfaces have deforms, create a frame-temporary model with references to the
// undeformed surfaces. This would allow deforms to be light interacting.
return def.DynamicModel;
}