Advertisement
Guest User

tree.cpp - By Abhijeet

a guest
Mar 26th, 2014
48
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.81 KB | None | 0 0
  1. #include "stdafx.h"
  2.  
  3. Tree::Tree()
  4. {
  5.     mModel = nullptr;
  6.     far_mModel = nullptr;
  7. }
  8.  
  9. Tree::~Tree()
  10. {
  11.     SafeDelete(mModel);
  12.     SafeDelete(far_mModel);
  13. }
  14.  
  15. void Tree::Init(InitInfo& info)
  16. {
  17.     mInfo = info;
  18.  
  19.     if (mInfo.NumInstances > MAX_TREES)
  20.         ShowError("Tree::Info::NumInstances cannot be this much greater.");
  21.  
  22.     Model::InitInfo modelinfo;
  23.  
  24.     Material DefaultMat;
  25.  
  26.     DefaultMat.Ambient = XMFLOAT4(0.6f, 0.6f, 0.6f, 0.6f);
  27.     DefaultMat.Diffuse = XMFLOAT4(1.0f, 1.0f, 1.0f, 1.0f);
  28.     DefaultMat.Specular = XMFLOAT4(1.0f, 1.0f, 1.0f, 16.0f);
  29.  
  30.     modelinfo.AlphaClip = true;
  31.     modelinfo.AlphaToCoverage = true;
  32.     modelinfo.BackfaceCulling = true;
  33.     modelinfo.InstanceFrustumCulling = true;
  34.     modelinfo.Material = DefaultMat;
  35.     modelinfo.UseDefaultMaterial = true;
  36.     modelinfo.NumLights = 1;
  37.     modelinfo.Mgr = &d3d->m_TextureMgr;
  38.  
  39.     mModel = new Model(mInfo.ModelPath, modelinfo, mInfo.Use32BitIndices);
  40.  
  41.     modelinfo.AlphaClip = true;
  42.     modelinfo.AlphaToCoverage = true;
  43.     modelinfo.NumLights = 0;
  44.     modelinfo.BackfaceCulling = false;
  45.  
  46.     far_mModel = new Model(mInfo.far_ModelPath, modelinfo, false);
  47.  
  48.     XMFLOAT3 vMinf3(+MathHelper::Infinity, +MathHelper::Infinity, +MathHelper::Infinity);
  49.     XMFLOAT3 vMaxf3(-MathHelper::Infinity, -MathHelper::Infinity, -MathHelper::Infinity);
  50.    
  51.     XMVECTOR vMin = XMLoadFloat3(&vMinf3);
  52.     XMVECTOR vMax = XMLoadFloat3(&vMaxf3);
  53.  
  54.     for (UINT i = 0; i < mModel->vertices.size(); ++i)
  55.     {
  56.         XMVECTOR P = XMLoadFloat3(&mModel->vertices[i].Pos);
  57.    
  58.         vMin = XMVectorMin(vMin, P);
  59.         vMax = XMVectorMax(vMax, P);
  60.     }
  61.  
  62.     XMStoreFloat3(&box.Center, 0.5f * (vMin + vMax));
  63.     XMStoreFloat3(&box.Extents, 0.5f * (vMax - vMin));
  64.  
  65.     treeData.resize(mInfo.NumInstances);
  66.  
  67.     for (USHORT i = 0; i < mInfo.NumInstances; ++i)
  68.     {
  69.         RANDOM:
  70.         float x = MathHelper::RandF(-200.0f, 200.0f);
  71.         float z = MathHelper::RandF(-200.0f, 200.0f);
  72.  
  73.         float y = d3d->m_Land.GetHeight(x, z);
  74.  
  75.         if (y >= 9.0f)
  76.         {
  77.             __asm JMP RANDOM;
  78.         }
  79.  
  80.         float scale = 0.1f;
  81.  
  82.         XMFLOAT3 pos = XMFLOAT3(x, y, z);
  83.  
  84.         treeData[i].pos = pos;
  85.  
  86.         XMMATRIX T = XMMatrixTranslation(pos.x, pos.y, pos.z);
  87.         XMMATRIX S = XMMatrixScaling(scale, scale, scale);
  88.  
  89.         XMMATRIX W = S * T;
  90.        
  91.  
  92.         AddtreeWorld(W);
  93.         AddtreeWorldToFarModel(W);
  94.     }
  95.  
  96.     //Build Instance data simply creates InstanceBuffer
  97.     far_mModel->BuildInstanceData();
  98.     mModel->BuildInstanceData();
  99.  
  100.     //Extract Information for model class which are required for rendering
  101.     mModel_MeshData = mModel->ExtractMeshData();
  102.     far_mModel_MeshData = far_mModel->ExtractMeshData();
  103. }
  104.  
  105. void Tree::AddtreeWorld(CXMMATRIX World)
  106. {
  107.     XMMATRIX W = World;
  108.  
  109.     Model::InstancedData data;
  110.     XMStoreFloat4x4(&data.World, W);
  111.  
  112.     mModel->mInstancedData.push_back(data);
  113. }
  114.  
  115. void Tree::AddtreeWorldToFarModel(CXMMATRIX World)
  116. {
  117.     XMMATRIX W = World;
  118.  
  119.     Model::InstancedData data;
  120.     XMStoreFloat4x4(&data.World, W);
  121.  
  122.     far_mModel->mInstancedData.push_back(data);
  123. }
  124.  
  125. void Tree::Update()
  126. {
  127.     for (USHORT i = 0; i < mInfo.NumInstances; ++i)
  128.     {
  129.         XMVECTOR treePosXM = XMLoadFloat3(&treeData[i].pos);
  130.         XMVECTOR camposXM = d3d->m_Cam.GetPositionXM();
  131.  
  132.         XMVECTOR distVec = treePosXM - camposXM;
  133.         XMVECTOR vecLength = XMVector3Length(distVec);
  134.  
  135.         static float distance = 0.0f;
  136.         XMStoreFloat(&distance, vecLength);
  137.  
  138.         if (distance > 140.0f)
  139.             treeData[i].IsFar = true;
  140.         else
  141.             treeData[i].IsFar = false;
  142.     }
  143.  
  144.     NumVisibleObjects = 0;
  145.  
  146.     D3D11_MAPPED_SUBRESOURCE mappedData;
  147.     pDeviceContext->Map(*mModel_MeshData.InstancedBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedData);
  148.  
  149.     Model::InstancedData* dataView = reinterpret_cast<Model::InstancedData*>(mappedData.pData);
  150.  
  151.     for(UINT i = 0; i < mModel->mInstancedData.size(); ++i)
  152.     {
  153.         XMMATRIX W = XMLoadFloat4x4(&mModel->mInstancedData[i].World);
  154.  
  155.         treeData[i].Visible = d3d->IntersectAABBFrustum(&box, W);
  156.  
  157.         if(!treeData[i].IsFar && treeData[i].Visible)
  158.         {
  159.                 dataView[NumVisibleObjects++] = mModel->mInstancedData[i];
  160.         }
  161.     }
  162.  
  163.     pDeviceContext->Unmap(*far_mModel_MeshData.InstancedBuffer, 0);
  164.  
  165.     farModel_NumVisibleObjects = 0;
  166.  
  167.     D3D11_MAPPED_SUBRESOURCE farModel_mappedData;
  168.     pDeviceContext->Map(*far_mModel_MeshData.InstancedBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &farModel_mappedData);
  169.  
  170.     Model::InstancedData* farModel_DataView = reinterpret_cast<Model::InstancedData*>(farModel_mappedData.pData);
  171.  
  172.     for (UINT i = 0; i < far_mModel->mInstancedData.size(); ++i)
  173.     {
  174.         XMMATRIX W = XMLoadFloat4x4(&far_mModel->mInstancedData[i].World);
  175.  
  176.         if ((treeData[i].IsFar && treeData[i].Visible) != 0)
  177.         {
  178.             farModel_DataView[farModel_NumVisibleObjects++] = far_mModel->mInstancedData[i];
  179.         }
  180.     }
  181.  
  182.     pDeviceContext->Unmap(*far_mModel_MeshData.InstancedBuffer, 0);
  183. }
  184.  
  185. void Tree::DrawFarModel(CXMMATRIX W)
  186. {
  187.     if (farModel_NumVisibleObjects == 0)
  188.         return;
  189.  
  190.     pDeviceContext->IASetInputLayout(InputLayouts::InstancedBasic32);
  191.     pDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  192.  
  193.     UINT stride[2] = {sizeof(Vertex::Basic32), sizeof(Model::InstancedData)};
  194.     UINT offset[2] = {0,0};
  195.  
  196.     ID3D11Buffer* vbs[2] = {*far_mModel_MeshData.VertexBuffer, *mModel_MeshData.InstancedBuffer};
  197.  
  198.     XMMATRIX view     = d3d->m_Cam.View();
  199.     XMMATRIX proj     = d3d->m_Cam.Proj();
  200.     XMMATRIX viewProj = d3d->m_Cam.ViewProj();
  201.  
  202.     Effects::InstancedBasicFX->SetDirLights(*far_mModel_MeshData.Lights);
  203.     Effects::InstancedBasicFX->SetEyePosW(d3d->m_Cam.GetPosition());
  204.  
  205.     ID3DX11EffectTechnique* activeTech = activeTech = Effects::InstancedBasicFX->Light0TexAlphaClipTech;;
  206.  
  207.     float blendFactor[4] = {0.0f, 0.0f, 0.0f, 0.0f};
  208.  
  209.     pDeviceContext->RSSetState(RenderStates::NoCullRS);
  210.  
  211.     D3DX11_TECHNIQUE_DESC techDesc;
  212.     activeTech->GetDesc( &techDesc );
  213.     for(UINT p = 0; p < techDesc.Passes; ++p)
  214.     {
  215.         XMMATRIX world = W;
  216.         XMMATRIX worldInvTranspose = MathHelper::InverseTranspose(world);
  217.        
  218.         Effects::InstancedBasicFX->SetWorld(world);
  219.         Effects::InstancedBasicFX->SetWorldInvTranspose(worldInvTranspose);
  220.         Effects::InstancedBasicFX->SetViewProj(viewProj);
  221.         Effects::InstancedBasicFX->SetTexTransform(XMMatrixIdentity());
  222.  
  223.         for (UINT i = 0; i < far_mModel_MeshData.SubsetCount; i++)
  224.         {  
  225.             pDeviceContext->IASetVertexBuffers(0, 2, vbs, stride, offset);
  226.             pDeviceContext->IASetIndexBuffer(*far_mModel_MeshData.IndexBuffer, DXGI_FORMAT_R16_UINT, 0);
  227.  
  228.             Effects::InstancedBasicFX->SetMaterial(*far_mModel_MeshData.Materials[i]);
  229.             Effects::InstancedBasicFX->SetDiffuseMap(*far_mModel_MeshData.DiffuseMapSRV[i]);
  230.  
  231.             activeTech->GetPassByIndex(p)->Apply(0, pDeviceContext);
  232.  
  233.             pDeviceContext->OMSetBlendState(RenderStates::AlphaToCoverageBS, blendFactor, 0xffffffff);
  234.             pDeviceContext->DrawIndexedInstanced(far_mModel_MeshData.subsetTable[i]->FaceCount * 3, farModel_NumVisibleObjects, far_mModel_MeshData.subsetTable[i]->FaceStart * 3,  0, 0);
  235.             pDeviceContext->OMSetBlendState(0, blendFactor, 0xffffffff);
  236.         }
  237.  
  238.       }
  239.  
  240.     pDeviceContext->RSSetState(0);
  241. }
  242.  
  243. void Tree::DrawNearModel(CXMMATRIX W)
  244. {
  245.     pDeviceContext->IASetInputLayout(InputLayouts::InstancedBasic32);
  246.     pDeviceContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
  247.  
  248.     UINT stride[2] = {sizeof(Vertex::Basic32), sizeof(Model::InstancedData)};
  249.     UINT offset[2] = {0,0};
  250.  
  251.     ID3D11Buffer* vbs[2] = {*mModel_MeshData.VertexBuffer, *mModel_MeshData.InstancedBuffer};
  252.  
  253.     XMMATRIX view     = d3d->m_Cam.View();
  254.     XMMATRIX proj     = d3d->m_Cam.Proj();
  255.     XMMATRIX viewProj = d3d->m_Cam.ViewProj();
  256.  
  257.     Effects::InstancedBasicFX->SetDirLights(*mModel_MeshData.Lights);
  258.     Effects::InstancedBasicFX->SetEyePosW(d3d->m_Cam.GetPosition());
  259.  
  260.     ID3DX11EffectTechnique* activeTech = activeTech = Effects::InstancedBasicFX->Light1TexAlphaClipTech;;
  261.  
  262.     float blendFactor[4] = {0.0f, 0.0f, 0.0f, 0.0f};
  263.  
  264.     D3DX11_TECHNIQUE_DESC techDesc;
  265.     activeTech->GetDesc( &techDesc );
  266.     for(UINT p = 0; p < techDesc.Passes; ++p)
  267.     {
  268.         XMMATRIX world = W;
  269.         XMMATRIX worldInvTranspose = MathHelper::InverseTranspose(world);
  270.        
  271.         Effects::InstancedBasicFX->SetWorld(world);
  272.         Effects::InstancedBasicFX->SetWorldInvTranspose(worldInvTranspose);
  273.         Effects::InstancedBasicFX->SetViewProj(viewProj);
  274.         Effects::InstancedBasicFX->SetTexTransform(XMMatrixIdentity());
  275.  
  276.         for (UINT i = 0; i < mModel_MeshData.SubsetCount; i++)
  277.         {  
  278.             pDeviceContext->IASetVertexBuffers(0, 2, vbs, stride, offset);
  279.             pDeviceContext->IASetIndexBuffer(*mModel_MeshData.IndexBuffer, DXGI_FORMAT_R16_UINT, 0);
  280.  
  281.             Effects::InstancedBasicFX->SetMaterial(*mModel_MeshData.Materials[i]);
  282.             Effects::InstancedBasicFX->SetDiffuseMap(*mModel_MeshData.DiffuseMapSRV[i]);
  283.  
  284.             activeTech->GetPassByIndex(p)->Apply(0, pDeviceContext);
  285.  
  286.             pDeviceContext->DrawIndexedInstanced(mModel_MeshData.subsetTable[i]->FaceCount * 3, NumVisibleObjects, mModel_MeshData.subsetTable[i]->FaceStart * 3,  0, 0);
  287.  
  288.         }
  289.  
  290.       }
  291. }
  292.  
  293. void Tree::Draw(CXMMATRIX W)
  294. {
  295.     DrawNearModel(W);
  296.     DrawFarModel(W);
  297. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement