public void AddDrawSurface(Surface surface, ViewEntity space, RenderEntityComponent renderEntity, idMaterial material, idScreenRect scissor)
{
float[] materialParameters;
float[] referenceRegisters = new float[idE.MaxExpressionRegisters];
float[] generatedMaterialParameters = new float[idE.MaxEntityMaterialParameters];
DrawSurface drawSurface = new DrawSurface();
drawSurface.Geometry = surface;
drawSurface.Space = space;
drawSurface.Material = material;
drawSurface.ScissorRectangle = scissor;
drawSurface.Sort = (float) material.Sort + _sortOffset;
// bumping this offset each time causes surfaces with equal sort orders to still
// deterministically draw in the order they are added
_sortOffset += 0.000001f;
// process the shader expressions for conditionals / color / texcoords
float[] constantRegisters = material.ConstantRegisters;
if(constantRegisters != null)
{
// shader only uses constant values
drawSurface.MaterialRegisters = constantRegisters;
}
else
{
drawSurface.MaterialRegisters = new float[material.RegisterCount];
// a reference shader will take the calculated stage color value from another shader
// and use that for the parm0-parm3 of the current shader, which allows a stage of
// a light model and light flares to pick up different flashing tables from
// different light shaders
if(renderEntity.ReferenceMaterial != null)
{
// evaluate the reference shader to find our shader parms
//renderEntity.ReferenceMaterial.EvaluateRegisters(ref referenceRegisters, renderEntity.MaterialParameters, this.ViewDefinition, renderEntity.ReferenceSound);
idConsole.Warning("TODO: ref material");
/*MaterialStage stage = renderEntity.ReferenceMaterial.GetStage(0);
memcpy( generatedShaderParms, renderEntity->shaderParms, sizeof( generatedShaderParms ) );
generatedShaderParms[0] = refRegs[ pStage->color.registers[0] ];
generatedShaderParms[1] = refRegs[ pStage->color.registers[1] ];
generatedShaderParms[2] = refRegs[ pStage->color.registers[2] ];*/
materialParameters = generatedMaterialParameters;
}
else
{
// evaluate with the entityDef's shader parms
materialParameters = renderEntity.MaterialParameters;
}
float oldFloatTime = 0;
int oldTime = 0;
if((space.EntityDef != null) && (space.EntityDef.Parameters.TimeGroup != 0))
{
oldFloatTime = this.ViewDefinition.FloatTime;
oldTime = this.ViewDefinition.RenderView.Time;
this.ViewDefinition.FloatTime = idE.Game.GetTimeGroupTime(space.EntityDef.Parameters.TimeGroup) * 0.001f;
this.ViewDefinition.RenderView.Time = idE.Game.GetTimeGroupTime(space.EntityDef.Parameters.TimeGroup);
}
material.EvaluateRegisters(ref drawSurface.MaterialRegisters, materialParameters, idE.RenderSystem.ViewDefinition /* TODO: ,renderEntity->referenceSound*/);
if((space.EntityDef != null) && (space.EntityDef.Parameters.TimeGroup != 0))
{
this.ViewDefinition.FloatTime = oldFloatTime;
this.ViewDefinition.RenderView.Time = oldTime;
}
}
// check for deformations
// TODO: R_DeformDrawSurf( drawSurf );
// skybox surfaces need a dynamic texgen
// TODO: skybox
/*switch( shader->Texgen() ) {
case TG_SKYBOX_CUBE:
R_SkyboxTexGen( drawSurf, tr.viewDef->renderView.vieworg );
break;
case TG_WOBBLESKY_CUBE:
R_WobbleskyTexGen( drawSurf, tr.viewDef->renderView.vieworg );
break;
}*/
// check for gui surfaces
// TODO: gui surface
idUserInterface gui = null;
if(space.EntityDef == null)
{
gui = material.GlobalInterface;
}
else
{
idConsole.Warning("TODO: global gui");
/*int guiNum = shader->GetEntityGui() - 1;
if ( guiNum >= 0 && guiNum < MAX_RENDERENTITY_GUI ) {
gui = renderEntity->gui[ guiNum ];
}
if ( gui == NULL ) {
gui = shader->GlobalGui();
}*/
}
if(gui != null)
{
// force guis on the fast time
float oldFloatTime = this.ViewDefinition.FloatTime;
int oldTime = this.ViewDefinition.RenderView.Time;
this.ViewDefinition.FloatTime = idE.Game.GetTimeGroupTime(1) * 0.001f;
this.ViewDefinition.RenderView.Time = idE.Game.GetTimeGroupTime(1);
idBounds ndcBounds;
idConsole.Warning("TODO: precise cull + render gui surface");
/*if ( !R_PreciseCullSurface( drawSurf, ndcBounds ) ) {
// did we ever use this to forward an entity color to a gui that didn't set color?
// memcpy( tr.guiShaderParms, shaderParms, sizeof( tr.guiShaderParms ) );
R_RenderGuiSurf( gui, drawSurf );
}*/
this.ViewDefinition.FloatTime = oldFloatTime;
this.ViewDefinition.RenderView.Time = oldTime;
}
_viewDefinition.DrawSurfaces.Add(drawSurface);
// we can't add subviews at this point, because that would
// increment tr.viewCount, messing up the rest of the surface
// adds for this view
}