idTech4.Renderer.idRenderSystem.EntityDefinitionDynamicModel C# (CSharp) Method

EntityDefinitionDynamicModel() private method

Issues a deferred entity callback if necessary. If the model isn't dynamic, it returns the original. Returns the cached dynamic model if present, otherwise creates it and any necessary overlays
private EntityDefinitionDynamicModel ( idRenderEntity def ) : idRenderModel
def idRenderEntity
return idRenderModel
		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;
		}