| 1 | //************************************ bs::framework - Copyright 2018 Marko Pintera **************************************// | 
|---|
| 2 | //*********** Licensed under the MIT license. See LICENSE.md for full terms. This notice is not to be removed. ***********// | 
|---|
| 3 | #include "BsRendererRenderable.h" | 
|---|
| 4 | #include "Renderer/BsRendererUtility.h" | 
|---|
| 5 | #include "Mesh/BsMesh.h" | 
|---|
| 6 | #include "Utility/BsBitwise.h" | 
|---|
| 7 |  | 
|---|
| 8 | namespace bs { namespace ct | 
|---|
| 9 | { | 
|---|
| 10 | PerObjectParamDef gPerObjectParamDef; | 
|---|
| 11 | PerCallParamDef gPerCallParamDef; | 
|---|
| 12 |  | 
|---|
| 13 | void PerObjectBuffer::update(SPtr<GpuParamBlockBuffer>& buffer, const Matrix4& tfrm, const Matrix4& tfrmNoScale, | 
|---|
| 14 | UINT32 layer) | 
|---|
| 15 | { | 
|---|
| 16 | gPerObjectParamDef.gMatWorld.set(buffer, tfrm); | 
|---|
| 17 | gPerObjectParamDef.gMatInvWorld.set(buffer, tfrm.inverseAffine()); | 
|---|
| 18 | gPerObjectParamDef.gMatWorldNoScale.set(buffer, tfrmNoScale); | 
|---|
| 19 | gPerObjectParamDef.gMatInvWorldNoScale.set(buffer, tfrmNoScale.inverseAffine()); | 
|---|
| 20 | gPerObjectParamDef.gWorldDeterminantSign.set(buffer, tfrm.determinant3x3() >= 0.0f ? 1.0f : -1.0f); | 
|---|
| 21 | gPerObjectParamDef.gLayer.set(buffer, (INT32)layer); | 
|---|
| 22 | } | 
|---|
| 23 |  | 
|---|
| 24 | void RenderableElement::draw() const | 
|---|
| 25 | { | 
|---|
| 26 | if (morphVertexDeclaration == nullptr) | 
|---|
| 27 | gRendererUtility().draw(mesh, subMesh); | 
|---|
| 28 | else | 
|---|
| 29 | gRendererUtility().drawMorph(mesh, subMesh, morphShapeBuffer, morphVertexDeclaration); | 
|---|
| 30 | } | 
|---|
| 31 |  | 
|---|
| 32 | RendererRenderable::RendererRenderable() | 
|---|
| 33 | { | 
|---|
| 34 | perObjectParamBuffer = gPerObjectParamDef.createBuffer(); | 
|---|
| 35 | perCallParamBuffer = gPerCallParamDef.createBuffer(); | 
|---|
| 36 | } | 
|---|
| 37 |  | 
|---|
| 38 | void RendererRenderable::updatePerObjectBuffer() | 
|---|
| 39 | { | 
|---|
| 40 | const Matrix4 worldTransform = renderable->getMatrix(); | 
|---|
| 41 | const Matrix4 worldNoScaleTransform = renderable->getMatrixNoScale(); | 
|---|
| 42 | const UINT32 layer = Bitwise::mostSignificantBit(renderable->getLayer()); | 
|---|
| 43 |  | 
|---|
| 44 | PerObjectBuffer::update(perObjectParamBuffer, worldTransform, worldNoScaleTransform, layer); | 
|---|
| 45 | } | 
|---|
| 46 |  | 
|---|
| 47 | void RendererRenderable::updatePerCallBuffer(const Matrix4& viewProj, bool flush) | 
|---|
| 48 | { | 
|---|
| 49 | const Matrix4 worldViewProjMatrix = viewProj * renderable->getMatrix(); | 
|---|
| 50 |  | 
|---|
| 51 | gPerCallParamDef.gMatWorldViewProj.set(perCallParamBuffer, worldViewProjMatrix); | 
|---|
| 52 |  | 
|---|
| 53 | if(flush) | 
|---|
| 54 | perCallParamBuffer->flushToGPU(); | 
|---|
| 55 | } | 
|---|
| 56 | }} | 
|---|
| 57 |  | 
|---|