impostor system part1
This commit is contained in:
@@ -106,6 +106,7 @@ namespace wiGraphicsTypes
|
||||
virtual void BindCS(const ComputeShader* shader, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0;
|
||||
virtual void Draw(int vertexCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0;
|
||||
virtual void DrawIndexed(int indexCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0;
|
||||
virtual void DrawInstanced(int vertexCount, int instanceCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0;
|
||||
virtual void DrawIndexedInstanced(int indexCount, int instanceCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0;
|
||||
virtual void Dispatch(UINT threadGroupCountX, UINT threadGroupCountY, UINT threadGroupCountZ, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0;
|
||||
virtual void GenerateMips(Texture* texture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE) = 0;
|
||||
|
||||
@@ -2169,7 +2169,11 @@ void GraphicsDevice_DX11::DrawIndexed(int indexCount, GRAPHICSTHREAD threadID)
|
||||
{
|
||||
deviceContexts[threadID]->DrawIndexed(indexCount, 0, 0);
|
||||
}
|
||||
void GraphicsDevice_DX11::DrawIndexedInstanced(int indexCount, int instanceCount, GRAPHICSTHREAD threadID)
|
||||
void GraphicsDevice_DX11::DrawInstanced(int vertexCount, int instanceCount, GRAPHICSTHREAD threadID)
|
||||
{
|
||||
deviceContexts[threadID]->DrawInstanced(vertexCount, instanceCount, 0, 0);
|
||||
}
|
||||
void GraphicsDevice_DX11::DrawIndexedInstanced(int indexCount, int instanceCount, GRAPHICSTHREAD threadID)
|
||||
{
|
||||
deviceContexts[threadID]->DrawIndexedInstanced(indexCount, instanceCount, 0, 0, 0);
|
||||
}
|
||||
|
||||
@@ -121,6 +121,7 @@ namespace wiGraphicsTypes
|
||||
virtual void BindCS(const ComputeShader* shader, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void Draw(int vertexCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void DrawIndexed(int indexCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void DrawInstanced(int vertexCount, int instanceCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void DrawIndexedInstanced(int indexCount, int instanceCount, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void Dispatch(UINT threadGroupCountX, UINT threadGroupCountY, UINT threadGroupCountZ, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
virtual void GenerateMips(Texture* texture, GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE);
|
||||
|
||||
@@ -1629,6 +1629,7 @@ void VertexGroup::Serialize(wiArchive& archive)
|
||||
#pragma region MESH
|
||||
|
||||
GPUBuffer Mesh::instanceBuffer;
|
||||
GPUBuffer Mesh::impostorVB;
|
||||
|
||||
void Mesh::LoadFromFile(const string& newName, const string& fname
|
||||
, const MaterialCollection& materialColl, list<Armature*> armatures, const string& identifier) {
|
||||
@@ -1940,7 +1941,50 @@ void Mesh::CreateBuffers(Object* object) {
|
||||
bd.ByteWidth = sizeof(Instance) * 2;
|
||||
bd.BindFlags = BIND_VERTEX_BUFFER;
|
||||
bd.CPUAccessFlags = CPU_ACCESS_WRITE;
|
||||
wiRenderer::GetDevice()->CreateBuffer(&bd, 0, &instanceBuffer);
|
||||
wiRenderer::GetDevice()->CreateBuffer(&bd, nullptr, &instanceBuffer);
|
||||
}
|
||||
if (!impostorVB.IsValid())
|
||||
{
|
||||
Vertex impostorVertices[6];
|
||||
impostorVertices[0].pos = XMFLOAT4(-1, 1, 0, 1);
|
||||
impostorVertices[0].nor = XMFLOAT4(0, 0, -1, 1);
|
||||
impostorVertices[0].tex = XMFLOAT4(0, 0, 0, 0);
|
||||
impostorVertices[0].pre = XMFLOAT4(-1, 1, 0, 1);
|
||||
|
||||
impostorVertices[1].pos = XMFLOAT4(1, 1, 0, 1);
|
||||
impostorVertices[1].nor = XMFLOAT4(0, 0, -1, 1);
|
||||
impostorVertices[1].tex = XMFLOAT4(1, 0, 0, 0);
|
||||
impostorVertices[1].pre = XMFLOAT4(1, 1, 0, 1);
|
||||
|
||||
impostorVertices[2].pos = XMFLOAT4(-1, -1, 0, 1);
|
||||
impostorVertices[2].nor = XMFLOAT4(0, 0, -1, 1);
|
||||
impostorVertices[2].tex = XMFLOAT4(0, 1, 0, 0);
|
||||
impostorVertices[2].pre = XMFLOAT4(-1, -1, 0, 1);
|
||||
|
||||
impostorVertices[3].pos = XMFLOAT4(-1, -1, 0, 1);
|
||||
impostorVertices[3].nor = XMFLOAT4(0, 0, -1, 1);
|
||||
impostorVertices[3].tex = XMFLOAT4(0, 1, 0, 0);
|
||||
impostorVertices[3].pre = XMFLOAT4(-1, -1, 0, 1);
|
||||
|
||||
impostorVertices[4].pos = XMFLOAT4(1, -1, 0, 1);
|
||||
impostorVertices[4].nor = XMFLOAT4(0, 0, -1, 1);
|
||||
impostorVertices[4].tex = XMFLOAT4(1, 1, 0, 0);
|
||||
impostorVertices[4].pre = XMFLOAT4(1, -1, 0, 1);
|
||||
|
||||
impostorVertices[5].pos = XMFLOAT4(1, 1, 0, 1);
|
||||
impostorVertices[5].nor = XMFLOAT4(0, 0, -1, 1);
|
||||
impostorVertices[5].tex = XMFLOAT4(1, 0, 0, 0);
|
||||
impostorVertices[5].pre = XMFLOAT4(1, 1, 0, 1);
|
||||
|
||||
ZeroMemory(&bd, sizeof(bd));
|
||||
bd.Usage = USAGE_IMMUTABLE;
|
||||
bd.ByteWidth = sizeof(impostorVertices);
|
||||
bd.BindFlags = BIND_VERTEX_BUFFER;
|
||||
bd.CPUAccessFlags = 0;
|
||||
SubresourceData InitData;
|
||||
ZeroMemory(&InitData, sizeof(InitData));
|
||||
InitData.pSysMem = impostorVertices;
|
||||
wiRenderer::GetDevice()->CreateBuffer(&bd, &InitData, &impostorVB);
|
||||
}
|
||||
|
||||
|
||||
@@ -1980,7 +2024,7 @@ void Mesh::CreateBuffers(Object* object) {
|
||||
bd.BindFlags = BIND_STREAM_OUTPUT | BIND_VERTEX_BUFFER;
|
||||
bd.CPUAccessFlags = 0;
|
||||
bd.StructureByteStride = 0;
|
||||
wiRenderer::GetDevice()->CreateBuffer(&bd, NULL, &streamoutBuffer);
|
||||
wiRenderer::GetDevice()->CreateBuffer(&bd, nullptr, &streamoutBuffer);
|
||||
}
|
||||
|
||||
//PHYSICALMAPPING
|
||||
|
||||
+11
-5
@@ -369,6 +369,10 @@ struct Mesh{
|
||||
int massVG,goalVG,softVG; //vertexGroupID
|
||||
vector<XMFLOAT3> goalPositions,goalNormals;
|
||||
|
||||
vector<wiRenderTarget> impostorTargets;
|
||||
float impostorDistance;
|
||||
static wiGraphicsTypes::GPUBuffer impostorVB;
|
||||
|
||||
Mesh(){
|
||||
init();
|
||||
}
|
||||
@@ -411,9 +415,11 @@ struct Mesh{
|
||||
arraysComplete = false;
|
||||
calculatedAO = false;
|
||||
armatureName = "";
|
||||
impostorDistance = 0.0f;
|
||||
}
|
||||
|
||||
bool hasArmature()const{return armature!=nullptr;}
|
||||
bool hasArmature()const { return armature != nullptr; }
|
||||
bool hasImpostor()const { return !impostorTargets.empty(); }
|
||||
void Serialize(wiArchive& archive);
|
||||
};
|
||||
struct Cullable
|
||||
@@ -846,7 +852,7 @@ struct Camera:public Transform{
|
||||
rotation_rest=newRot;
|
||||
name=newName;
|
||||
}
|
||||
void SetUp(int newWidth, int newHeight, float newNear, float newFar, float fov = XM_PI / 3.0f)
|
||||
void SetUp(float newWidth, float newHeight, float newNear, float newFar, float fov = XM_PI / 3.0f)
|
||||
{
|
||||
XMMATRIX View = XMMATRIX();
|
||||
XMVECTOR At = XMVectorSet(0,0,1,0), Up = XMVectorSet(0,1,0,0), Eye = this->GetEye();
|
||||
@@ -854,8 +860,8 @@ struct Camera:public Transform{
|
||||
zNearP = newNear;
|
||||
zFarP = newFar;
|
||||
|
||||
width = (float)newWidth;
|
||||
height = (float)newHeight;
|
||||
width = newWidth;
|
||||
height = newHeight;
|
||||
|
||||
this->fov = fov;
|
||||
|
||||
@@ -931,7 +937,7 @@ struct Camera:public Transform{
|
||||
}
|
||||
void UpdateProjection()
|
||||
{
|
||||
XMMATRIX P = XMMatrixPerspectiveFovLH(fov, (float)width / (float)height, zNearP, zFarP);
|
||||
XMMATRIX P = XMMatrixPerspectiveFovLH(fov, width / height, zNearP, zFarP);
|
||||
XMMATRIX InvP = XMMatrixInverse(nullptr, P);
|
||||
XMStoreFloat4x4(&this->Projection, P);
|
||||
XMStoreFloat4x4(&this->InvProjection, InvP);
|
||||
|
||||
+176
-51
@@ -193,9 +193,9 @@ void wiRenderer::SetUpStaticComponents()
|
||||
|
||||
//cam = new Camera(GetDevice()->GetScreenWidth(), GetDevice()->GetScreenHeight(), 0.1f, 800, XMVectorSet(0, 4, -4, 1));
|
||||
cam = new Camera();
|
||||
cam->SetUp(GetDevice()->GetScreenWidth(), GetDevice()->GetScreenHeight(), 0.1f, 800);
|
||||
cam->SetUp((float)GetDevice()->GetScreenWidth(), (float)GetDevice()->GetScreenHeight(), 0.1f, 800);
|
||||
refCam = new Camera();
|
||||
refCam->SetUp(GetDevice()->GetScreenWidth(), GetDevice()->GetScreenHeight(), 0.1f, 800);
|
||||
refCam->SetUp((float)GetDevice()->GetScreenWidth(), (float)GetDevice()->GetScreenHeight(), 0.1f, 800);
|
||||
prevFrameCam = new Camera;
|
||||
|
||||
|
||||
@@ -1818,18 +1818,18 @@ void wiRenderer::DrawDebugGridHelper(Camera* camera, GRAPHICSTHREAD threadID)
|
||||
for (int i = 0; i <= a; ++i)
|
||||
{
|
||||
verts[count++] = XMFLOAT4(i - a*0.5f, 0, -a*0.5f, 1);
|
||||
verts[count++] = (i == a / 2 ? XMFLOAT4(1, 0, 0, 1) : XMFLOAT4(col, col, col, 1));
|
||||
verts[count++] = (i == a / 2 ? XMFLOAT4(0, 0, 1, 1) : XMFLOAT4(col, col, col, 1));
|
||||
|
||||
verts[count++] = XMFLOAT4(i - a*0.5f, 0, +a*0.5f, 1);
|
||||
verts[count++] = (i == a / 2 ? XMFLOAT4(1, 0, 0, 1) : XMFLOAT4(col, col, col, 1));
|
||||
verts[count++] = (i == a / 2 ? XMFLOAT4(0, 0, 1, 1) : XMFLOAT4(col, col, col, 1));
|
||||
}
|
||||
for (int j = 0; j <= a; ++j)
|
||||
{
|
||||
verts[count++] = XMFLOAT4(-a*0.5f, 0, j - a*0.5f, 1);
|
||||
verts[count++] = (j == a / 2 ? XMFLOAT4(0, 0, 1, 1) : XMFLOAT4(col, col, col, 1));
|
||||
verts[count++] = (j == a / 2 ? XMFLOAT4(1, 0, 0, 1) : XMFLOAT4(col, col, col, 1));
|
||||
|
||||
verts[count++] = XMFLOAT4(+a*0.5f, 0, j - a*0.5f, 1);
|
||||
verts[count++] = (j == a / 2 ? XMFLOAT4(0, 0, 1, 1) : XMFLOAT4(col, col, col, 1));
|
||||
verts[count++] = (j == a / 2 ? XMFLOAT4(1, 0, 0, 1) : XMFLOAT4(col, col, col, 1));
|
||||
}
|
||||
|
||||
gridVertexCount = ARRAYSIZE(verts) / 2;
|
||||
@@ -2712,39 +2712,6 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, GRAPHICSTHRE
|
||||
break;
|
||||
}
|
||||
|
||||
//if (!GetScene().environmentProbes.empty())
|
||||
//{
|
||||
// // Get the closest probes to the camera and bind to shader
|
||||
// vector<EnvironmentProbe*> sortedEnvProbes;
|
||||
// vector<float> sortedDistances;
|
||||
// sortedEnvProbes.reserve(GetScene().environmentProbes.size());
|
||||
// sortedDistances.reserve(GetScene().environmentProbes.size());
|
||||
// for (unsigned int i = 0; i < GetScene().environmentProbes.size(); ++i)
|
||||
// {
|
||||
// sortedEnvProbes.push_back(GetScene().environmentProbes[i]);
|
||||
// sortedDistances.push_back(wiMath::DistanceSquared(camera->translation, GetScene().environmentProbes[i]->translation));
|
||||
// }
|
||||
// for (unsigned int i = 0; i < sortedEnvProbes.size() - 1; ++i)
|
||||
// {
|
||||
// for (unsigned int j = i + 1; j < sortedEnvProbes.size(); ++j)
|
||||
// {
|
||||
// if (sortedDistances[i] > sortedDistances[j])
|
||||
// {
|
||||
// float swapDist = sortedDistances[i];
|
||||
// sortedDistances[i] = sortedDistances[j];
|
||||
// sortedDistances[j] = swapDist;
|
||||
// EnvironmentProbe* swapProbe = sortedEnvProbes[i];
|
||||
// sortedEnvProbes[i] = sortedEnvProbes[j];
|
||||
// sortedEnvProbes[j] = swapProbe;
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// for (unsigned int i = 0; i < min(sortedEnvProbes.size(), 2); ++i)
|
||||
// {
|
||||
// envMaps[i] = sortedEnvProbes[i]->cubeMap.GetTexture();
|
||||
// envMapPositions[i] = sortedEnvProbes[i]->translation;
|
||||
// }
|
||||
//}
|
||||
MiscCB envProbeCB;
|
||||
envProbeCB.mTransform.r[0] = XMLoadFloat3(&envMapPositions[0]);
|
||||
envProbeCB.mTransform.r[1] = XMLoadFloat3(&envMapPositions[1]);
|
||||
@@ -2796,20 +2763,9 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, GRAPHICSTHRE
|
||||
|
||||
if (wireRender)
|
||||
GetDevice()->BindPS(pixelShaders[PSTYPE_SIMPLEST], threadID);
|
||||
//else
|
||||
// if (BlackOut)
|
||||
// GetDevice()->BindPS(pixelShaders[PSTYPE_BLACKOUT], threadID);
|
||||
// else if (shaderType == SHADERTYPE_NONE)
|
||||
// GetDevice()->BindPS(pixelShaders[PSTYPE_TEXTUREONLY], threadID);
|
||||
// else if (shaderType == SHADERTYPE_DEFERRED)
|
||||
// GetDevice()->BindPS(pixelShaders[PSTYPE_OBJECT_DEFERRED], threadID);
|
||||
// else if (shaderType == SHADERTYPE_FORWARD_SIMPLE)
|
||||
// GetDevice()->BindPS(pixelShaders[PSTYPE_OBJECT_FORWARDSIMPLE], threadID);
|
||||
// else
|
||||
// return;
|
||||
|
||||
|
||||
GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE],threadID);
|
||||
GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE],threadID);
|
||||
|
||||
if(!wireRender) {
|
||||
if (enviroMap != nullptr)
|
||||
@@ -2830,6 +2786,39 @@ void wiRenderer::DrawWorld(Camera* camera, bool DX11Eff, int tessF, GRAPHICSTHRE
|
||||
CulledObjectList& visibleInstances = iter->second;
|
||||
|
||||
|
||||
if (mesh->hasImpostor())
|
||||
{
|
||||
int k = 0;
|
||||
for (CulledObjectList::iterator viter = visibleInstances.begin(); viter != visibleInstances.end(); ++viter) {
|
||||
if ((*viter)->emitterType != Object::EmitterType::EMITTER_INVISIBLE) {
|
||||
Mesh::AddRenderableInstance(Instance(XMMatrixTranspose(mesh->aabb.getAsBoxMatrix()*XMLoadFloat4x4(&(*viter)->world)), (*viter)->transparency, (*viter)->color), k, threadID);
|
||||
++k;
|
||||
}
|
||||
}
|
||||
if (k<1)
|
||||
continue;
|
||||
Mesh::UpdateRenderableInstances(visibleInstances.size(), threadID);
|
||||
|
||||
MaterialCB mcb;
|
||||
ZeroMemory(&mcb, sizeof(mcb));
|
||||
mcb.baseColor = XMFLOAT4(1, 1, 1, 1);
|
||||
mcb.texMulAdd = XMFLOAT4(1, 1, 0, 0);
|
||||
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MATERIAL], &mcb, threadID);
|
||||
|
||||
GetDevice()->BindRasterizerState(wireRender ? rasterizers[RSTYPE_WIRE] : rasterizers[RSTYPE_DOUBLESIDED], threadID);
|
||||
GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT], mesh->stencilRef, threadID);
|
||||
|
||||
GetDevice()->BindIndexBuffer(nullptr, threadID);
|
||||
GetDevice()->BindVertexBuffer(&Mesh::impostorVB, 0, sizeof(Vertex), threadID);
|
||||
GetDevice()->BindVertexBuffer(&Mesh::instanceBuffer, 1, sizeof(Instance), threadID);
|
||||
GetDevice()->BindResourcePS(mesh->impostorTargets[0].GetTexture(), TEXSLOT_ONDEMAND0, threadID);
|
||||
//GetDevice()->BindResourcePS(wiTextureHelper::getInstance()->getColor(wiColor::Red), TEXSLOT_ONDEMAND0, threadID);
|
||||
GetDevice()->BindVS(vertexShaders[(isReflection?VSTYPE_OBJECT_REFLECTION:VSTYPE_OBJECT10)], threadID);
|
||||
GetDevice()->BindPS(pixelShaders[(shaderType==SHADERTYPE_DEFERRED?PSTYPE_OBJECT_DEFERRED:PSTYPE_OBJECT_FORWARD_DIRLIGHT)], threadID);
|
||||
GetDevice()->DrawInstanced(6, visibleInstances.size(), threadID);
|
||||
continue;
|
||||
}
|
||||
|
||||
if(!mesh->doubleSided)
|
||||
GetDevice()->BindRasterizerState(wireRender?rasterizers[RSTYPE_WIRE]:rasterizers[RSTYPE_FRONT],threadID);
|
||||
else
|
||||
@@ -3995,6 +3984,142 @@ void wiRenderer::PutEnvProbe(const XMFLOAT3& position, int resolution)
|
||||
GetDevice()->UNLOCK();
|
||||
}
|
||||
|
||||
void wiRenderer::CreateImpostor(Mesh* mesh)
|
||||
{
|
||||
const GRAPHICSTHREAD threadID = GRAPHICSTHREAD_IMMEDIATE;
|
||||
|
||||
const AABB& bbox = mesh->aabb;
|
||||
const XMFLOAT3 extents = bbox.getHalfWidth();
|
||||
if (mesh->impostorTargets.empty())
|
||||
{
|
||||
mesh->impostorTargets.resize(6);
|
||||
for (auto& x : mesh->impostorTargets)
|
||||
{
|
||||
x.Initialize(512, 512, true, FORMAT_R8G8B8A8_UNORM, 0);
|
||||
}
|
||||
}
|
||||
|
||||
Camera savedCam = *cam;
|
||||
|
||||
GetDevice()->LOCK();
|
||||
|
||||
|
||||
Mesh::AddRenderableInstance(Instance(XMMatrixIdentity()), 0, threadID);
|
||||
Mesh::UpdateRenderableInstances(1, threadID);
|
||||
GetDevice()->BindVertexBuffer((mesh->streamoutBuffer.IsValid() ? &mesh->streamoutBuffer : &mesh->vertexBuffer), 0, sizeof(Vertex), threadID);
|
||||
GetDevice()->BindVertexBuffer(&Mesh::instanceBuffer, 1, sizeof(Instance), threadID);
|
||||
|
||||
|
||||
GetDevice()->BindBlendState(blendStates[BSTYPE_OPAQUE], threadID);
|
||||
GetDevice()->BindRasterizerState(rasterizers[RSTYPE_DOUBLESIDED], threadID);
|
||||
GetDevice()->BindDepthStencilState(depthStencils[DSSTYPE_DEFAULT], mesh->stencilRef, threadID);
|
||||
GetDevice()->BindPrimitiveTopology(TRIANGLELIST, threadID);
|
||||
GetDevice()->BindVertexLayout(vertexLayouts[VLTYPE_EFFECT], threadID);
|
||||
GetDevice()->BindVS(vertexShaders[VSTYPE_OBJECT10], threadID);
|
||||
GetDevice()->BindPS(pixelShaders[PSTYPE_TEXTUREONLY], threadID);
|
||||
|
||||
for (size_t i = 0; i < mesh->impostorTargets.size(); ++i)
|
||||
{
|
||||
mesh->impostorTargets[i].Activate(threadID, 0, 0, 0, 0);
|
||||
|
||||
cam->Clear();
|
||||
cam->Translate(bbox.getCenter());
|
||||
switch (i)
|
||||
{
|
||||
case 0:
|
||||
{
|
||||
// front capture
|
||||
XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.y, extents.y, -extents.z, extents.z);
|
||||
XMStoreFloat4x4(&cam->Projection, ortho);
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
{
|
||||
// right capture
|
||||
XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.z, extents.z, -extents.y, extents.y, -extents.x, extents.x);
|
||||
XMStoreFloat4x4(&cam->Projection, ortho);
|
||||
cam->RotateRollPitchYaw(XMFLOAT3(0, -XM_PIDIV2, 0));
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
{
|
||||
// back capture
|
||||
XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.y, extents.y, -extents.z, extents.z);
|
||||
XMStoreFloat4x4(&cam->Projection, ortho);
|
||||
cam->RotateRollPitchYaw(XMFLOAT3(0, XM_PI, 0));
|
||||
}
|
||||
break;
|
||||
case 3:
|
||||
{
|
||||
// left capture
|
||||
XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.z, extents.z, -extents.y, extents.y, -extents.x, extents.x);
|
||||
XMStoreFloat4x4(&cam->Projection, ortho);
|
||||
cam->RotateRollPitchYaw(XMFLOAT3(0, XM_PIDIV2, 0));
|
||||
}
|
||||
break;
|
||||
case 4:
|
||||
{
|
||||
// bottom capture
|
||||
XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.z, extents.z, -extents.y, extents.y);
|
||||
XMStoreFloat4x4(&cam->Projection, ortho);
|
||||
cam->RotateRollPitchYaw(XMFLOAT3(-XM_PIDIV2, 0, 0));
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
{
|
||||
// top capture
|
||||
XMMATRIX ortho = XMMatrixOrthographicOffCenterLH(-extents.x, extents.x, -extents.z, extents.z, -extents.y, extents.y);
|
||||
XMStoreFloat4x4(&cam->Projection, ortho);
|
||||
cam->RotateRollPitchYaw(XMFLOAT3(XM_PIDIV2, 0, 0));
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
cam->UpdateProps();
|
||||
UpdateCameraCB(threadID);
|
||||
|
||||
for (MeshSubset& subset : mesh->subsets)
|
||||
{
|
||||
if (subset.subsetIndices.empty())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!subset.material->IsTransparent() && !subset.material->isSky && !subset.material->water)
|
||||
{
|
||||
GetDevice()->BindIndexBuffer(&subset.indexBuffer, threadID);
|
||||
|
||||
MaterialCB mcb;
|
||||
mcb.Create(*subset.material);
|
||||
GetDevice()->UpdateBuffer(constantBuffers[CBTYPE_MATERIAL], &mcb, threadID);
|
||||
|
||||
GetDevice()->BindResourcePS(subset.material->GetBaseColorMap(), TEXSLOT_ONDEMAND0, threadID);
|
||||
GetDevice()->BindResourcePS(subset.material->GetNormalMap(), TEXSLOT_ONDEMAND1, threadID);
|
||||
GetDevice()->BindResourcePS(subset.material->GetRoughnessMap(), TEXSLOT_ONDEMAND2, threadID);
|
||||
GetDevice()->BindResourcePS(subset.material->GetReflectanceMap(), TEXSLOT_ONDEMAND3, threadID);
|
||||
GetDevice()->BindResourcePS(subset.material->GetMetalnessMap(), TEXSLOT_ONDEMAND4, threadID);
|
||||
GetDevice()->BindResourcePS(subset.material->GetDisplacementMap(), TEXSLOT_ONDEMAND5, threadID);
|
||||
|
||||
|
||||
GetDevice()->DrawIndexedInstanced(subset.subsetIndices.size(), 1, threadID);
|
||||
}
|
||||
}
|
||||
|
||||
GetDevice()->GenerateMips(mesh->impostorTargets[i].GetTexture(), threadID);
|
||||
}
|
||||
//GetDevice()->SaveTexturePNG("d:\\asd0.png", mesh->impostorTargets[0].GetTexture(), threadID);
|
||||
//GetDevice()->SaveTexturePNG("d:\\asd1.png", mesh->impostorTargets[1].GetTexture(), threadID);
|
||||
//GetDevice()->SaveTexturePNG("d:\\asd2.png", mesh->impostorTargets[2].GetTexture(), threadID);
|
||||
//GetDevice()->SaveTexturePNG("d:\\asd3.png", mesh->impostorTargets[3].GetTexture(), threadID);
|
||||
//GetDevice()->SaveTexturePNG("d:\\asd4.png", mesh->impostorTargets[4].GetTexture(), threadID);
|
||||
//GetDevice()->SaveTexturePNG("d:\\asd5.png", mesh->impostorTargets[5].GetTexture(), threadID);
|
||||
|
||||
*cam = savedCam;
|
||||
UpdateCameraCB(threadID);
|
||||
|
||||
GetDevice()->UNLOCK();
|
||||
}
|
||||
|
||||
void wiRenderer::MaterialCB::Create(const Material& mat)
|
||||
{
|
||||
baseColor = XMFLOAT4(mat.baseColor.x, mat.baseColor.y, mat.baseColor.z, mat.alpha);
|
||||
|
||||
@@ -472,6 +472,8 @@ public:
|
||||
|
||||
static void PutEnvProbe(const XMFLOAT3& position, int resolution = 256);
|
||||
|
||||
static void CreateImpostor(Mesh* mesh);
|
||||
|
||||
static vector<wiTranslator*> renderableTranslators;
|
||||
// Add translator to render in next frame
|
||||
static void AddRenderableTranslator(wiTranslator* translator);
|
||||
|
||||
Reference in New Issue
Block a user