This repository has been archived by the owner on Jan 3, 2023. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 73
/
AABBoxRasterizerScalarST.cpp
84 lines (70 loc) · 2.73 KB
/
AABBoxRasterizerScalarST.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
////////////////////////////////////////////////////////////////////////////////
// Copyright 2017 Intel Corporation
//
// Licensed under the Apache License, Version 2.0 (the "License"); you may not
// use this file except in compliance with the License. You may obtain a copy
// of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations
// under the License.
////////////////////////////////////////////////////////////////////////////////
#include "AABBoxRasterizerScalarST.h"
AABBoxRasterizerScalarST::AABBoxRasterizerScalarST()
: AABBoxRasterizerScalar()
{
}
AABBoxRasterizerScalarST::~AABBoxRasterizerScalarST()
{
}
//------------------------------------------------------------------------------
// For each occludee model
// * Determine if the occludee model AABox is within the viewing frustum
// * Transform the AABBox to screen space
// * Rasterize the triangles that make up the AABBox
// * Depth test the raterized triangles against the CPU rasterized depth buffer
//-----------------------------------------------------------------------------
void AABBoxRasterizerScalarST::TransformAABBoxAndDepthTest(CPUTCamera *pCamera, UINT idx)
{
QueryPerformanceCounter(&mStartTime[idx][0]);
mpCamera[idx] = pCamera;
if(mEnableFCulling)
{
for(UINT i = 0; i < mNumModels; i++)
{
mpInsideFrustum[idx][i] = mpTransformedAABBox[i].IsInsideViewFrustum(mpCamera[idx]);
}
}
BoxTestSetupScalar setup;
setup.Init(mViewMatrix[idx], mProjMatrix[idx], viewportMatrix, mpCamera[idx], mOccludeeSizeThreshold);
float4 xformedPos[AABB_VERTICES];
float4x4 cumulativeMatrix;
for(UINT i = 0; i < mNumModels; i++)
{
mpVisible[idx][i] = false;
if(mpInsideFrustum[idx][i] && !mpTransformedAABBox[i].IsTooSmall(setup, cumulativeMatrix))
{
if(mpTransformedAABBox[i].TransformAABBox(xformedPos, cumulativeMatrix))
{
mpVisible[idx][i] = mpTransformedAABBox[i].RasterizeAndDepthTestAABBox(mpRenderTargetPixels[idx], xformedPos, idx);
}
else
{
mpVisible[idx][i] = true;
}
}
}
QueryPerformanceCounter(&mStopTime[idx][0]);
mDepthTestTime[mTimeCounter++] = ((double)(mStopTime[idx][0].QuadPart - mStartTime[idx][0].QuadPart)) / ((double)glFrequency.QuadPart);
mTimeCounter = mTimeCounter >= AVG_COUNTER ? 0 : mTimeCounter;
}
void AABBoxRasterizerScalarST::WaitForTaskToFinish(UINT idx)
{
}
void AABBoxRasterizerScalarST::ReleaseTaskHandles(UINT idx)
{
}