mirror of
https://bitbucket.org/CPMADevs/cnq3
synced 2024-11-23 12:32:14 +00:00
fixed mirror portal rendering
This commit is contained in:
parent
a86504ddad
commit
e2f6e05ebe
3 changed files with 23 additions and 3 deletions
|
@ -160,6 +160,17 @@ static bool IsCommutativeBlendState(unsigned int stateBits)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static cullType_t GetMirrorredCullType(cullType_t cullType)
|
||||||
|
{
|
||||||
|
switch(cullType)
|
||||||
|
{
|
||||||
|
case CT_BACK_SIDED: return CT_FRONT_SIDED;
|
||||||
|
case CT_FRONT_SIDED: return CT_BACK_SIDED;
|
||||||
|
default: return CT_TWO_SIDED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void FrameStats::EndFrame()
|
void FrameStats::EndFrame()
|
||||||
{
|
{
|
||||||
frameCount = min(frameCount + 1, (int)MaxFrames);
|
frameCount = min(frameCount + 1, (int)MaxFrames);
|
||||||
|
@ -393,7 +404,6 @@ void GRP::ProcessShader(shader_t& shader)
|
||||||
{
|
{
|
||||||
// @TODO: fix up cache.stageStateBits[0] based on depth state from follow-up states
|
// @TODO: fix up cache.stageStateBits[0] based on depth state from follow-up states
|
||||||
CachedPSO cache = {};
|
CachedPSO cache = {};
|
||||||
cache.desc.cullType = shader.cullType;
|
|
||||||
cache.desc.polygonOffset = !!shader.polygonOffset;
|
cache.desc.polygonOffset = !!shader.polygonOffset;
|
||||||
cache.desc.clampDepth = clampDepth;
|
cache.desc.clampDepth = clampDepth;
|
||||||
cache.stageStateBits[0] = shader.stages[0]->stateBits & (~GLS_POLYMODE_LINE);
|
cache.stageStateBits[0] = shader.stages[0]->stateBits & (~GLS_POLYMODE_LINE);
|
||||||
|
@ -403,7 +413,10 @@ void GRP::ProcessShader(shader_t& shader)
|
||||||
}
|
}
|
||||||
cache.stageCount = shader.numStages;
|
cache.stageCount = shader.numStages;
|
||||||
|
|
||||||
|
cache.desc.cullType = shader.cullType;
|
||||||
shader.pipelines[0].pipeline = CreatePSO(cache, shader.name);
|
shader.pipelines[0].pipeline = CreatePSO(cache, shader.name);
|
||||||
|
cache.desc.cullType = GetMirrorredCullType(shader.cullType);
|
||||||
|
shader.pipelines[0].mirrorPipeline = CreatePSO(cache, va("%s mirror", shader.name));
|
||||||
shader.pipelines[0].firstStage = 0;
|
shader.pipelines[0].firstStage = 0;
|
||||||
shader.pipelines[0].numStages = shader.numStages;
|
shader.pipelines[0].numStages = shader.numStages;
|
||||||
shader.numPipelines = 1;
|
shader.numPipelines = 1;
|
||||||
|
@ -411,7 +424,7 @@ void GRP::ProcessShader(shader_t& shader)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
CachedPSO cache = {};
|
CachedPSO cache = {};
|
||||||
cache.desc.cullType = shader.cullType;
|
|
||||||
cache.desc.polygonOffset = !!shader.polygonOffset;
|
cache.desc.polygonOffset = !!shader.polygonOffset;
|
||||||
cache.desc.clampDepth = clampDepth;
|
cache.desc.clampDepth = clampDepth;
|
||||||
cache.stageCount = 0;
|
cache.stageCount = 0;
|
||||||
|
@ -434,7 +447,10 @@ void GRP::ProcessShader(shader_t& shader)
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pipeline_t& p = shader.pipelines[shader.numPipelines++];
|
pipeline_t& p = shader.pipelines[shader.numPipelines++];
|
||||||
|
cache.desc.cullType = shader.cullType;
|
||||||
p.pipeline = CreatePSO(cache, va("%s #%d", shader.name, shader.numPipelines));
|
p.pipeline = CreatePSO(cache, va("%s #%d", shader.name, shader.numPipelines));
|
||||||
|
cache.desc.cullType = GetMirrorredCullType(shader.cullType);
|
||||||
|
p.mirrorPipeline = CreatePSO(cache, va("%s #%d mirror", shader.name, shader.numPipelines));
|
||||||
p.firstStage = firstStage;
|
p.firstStage = firstStage;
|
||||||
p.numStages = cache.stageCount;
|
p.numStages = cache.stageCount;
|
||||||
cache.stageStateBits[0] = currStateBits;
|
cache.stageStateBits[0] = currStateBits;
|
||||||
|
@ -453,7 +469,10 @@ void GRP::ProcessShader(shader_t& shader)
|
||||||
if(cache.stageCount > 0)
|
if(cache.stageCount > 0)
|
||||||
{
|
{
|
||||||
pipeline_t& p = shader.pipelines[shader.numPipelines++];
|
pipeline_t& p = shader.pipelines[shader.numPipelines++];
|
||||||
|
cache.desc.cullType = shader.cullType;
|
||||||
p.pipeline = CreatePSO(cache, va("%s #%d", shader.name, shader.numPipelines));
|
p.pipeline = CreatePSO(cache, va("%s #%d", shader.name, shader.numPipelines));
|
||||||
|
cache.desc.cullType = GetMirrorredCullType(shader.cullType);
|
||||||
|
p.mirrorPipeline = CreatePSO(cache, va("%s #%d mirror", shader.name, shader.numPipelines));
|
||||||
p.firstStage = firstStage;
|
p.firstStage = firstStage;
|
||||||
p.numStages = cache.stageCount;
|
p.numStages = cache.stageCount;
|
||||||
}
|
}
|
||||||
|
|
|
@ -565,7 +565,7 @@ void World::EndBatch()
|
||||||
for(int p = 0; p < shader->numPipelines; ++p)
|
for(int p = 0; p < shader->numPipelines; ++p)
|
||||||
{
|
{
|
||||||
const pipeline_t& pipeline = shader->pipelines[p];
|
const pipeline_t& pipeline = shader->pipelines[p];
|
||||||
const int psoIndex = pipeline.pipeline;
|
const int psoIndex = backEnd.viewParms.isMirror ? pipeline.mirrorPipeline : pipeline.pipeline;
|
||||||
if(batchPSO != grp.psos[psoIndex].pipeline)
|
if(batchPSO != grp.psos[psoIndex].pipeline)
|
||||||
{
|
{
|
||||||
batchPSO = grp.psos[psoIndex].pipeline;
|
batchPSO = grp.psos[psoIndex].pipeline;
|
||||||
|
|
|
@ -373,6 +373,7 @@ struct pipeline_t {
|
||||||
int firstStage;
|
int firstStage;
|
||||||
int numStages;
|
int numStages;
|
||||||
int pipeline;
|
int pipeline;
|
||||||
|
int mirrorPipeline;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue