| 3831 | } |
| 3832 | |
| 3833 | void Renderer::DrawItemSorted(RendererSortableObject* objectInfo, RendererObjectType lastObjectType, RenderView& view) |
| 3834 | { |
| 3835 | if (lastObjectType != objectInfo->ObjectType) |
| 3836 | { |
| 3837 | unsigned int stride = sizeof(Vertex); |
| 3838 | unsigned int offset = 0; |
| 3839 | _context->IASetVertexBuffers(0, 1, _moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); |
| 3840 | _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); |
| 3841 | _context->IASetInputLayout(_inputLayout.Get()); |
| 3842 | |
| 3843 | SetDepthState(DepthState::Read); |
| 3844 | SetCullMode(CullMode::CounterClockwise); |
| 3845 | |
| 3846 | _shaders.Bind(Shader::Items); |
| 3847 | } |
| 3848 | |
| 3849 | _sortedPolygonsIndexBuffer.Update(_context.Get(), _sortedPolygonsIndices, 0, (int)_sortedPolygonsIndices.size()); |
| 3850 | _context->IASetIndexBuffer(_sortedPolygonsIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); |
| 3851 | |
| 3852 | // Bind main item properties. |
| 3853 | Matrix world = objectInfo->Item->InterpolatedWorld; |
| 3854 | _stItem.World = world; |
| 3855 | _stItem.Color = objectInfo->Item->Color; |
| 3856 | _stItem.AmbientLight = objectInfo->Item->AmbientLight; |
| 3857 | _stItem.Skinned = (int)(objectInfo->Skinned ? SkinningMode::Full : SkinningMode::None); |
| 3858 | |
| 3859 | const auto& moveableObj = *_moveableObjects[objectInfo->Item->ObjectID]; |
| 3860 | |
| 3861 | if (objectInfo->Skinned) |
| 3862 | { |
| 3863 | for (int m = 0; m < moveableObj.BindPoseTransforms.size(); m++) |
| 3864 | _stItem.BonesMatrices[m] = moveableObj.BindPoseTransforms[m] * objectInfo->Item->InterpolatedAnimTransforms[m]; |
| 3865 | } |
| 3866 | else |
| 3867 | { |
| 3868 | memcpy(_stItem.BonesMatrices, objectInfo->Item->InterpolatedAnimTransforms, sizeof(Matrix) * MAX_BONES); |
| 3869 | } |
| 3870 | |
| 3871 | UpdateConstantBuffer(_stItem, _cbItem); |
| 3872 | |
| 3873 | for (int k = 0; k < moveableObj.ObjectMeshes.size(); k++) |
| 3874 | _stItem.BoneLightModes[k] = (int)moveableObj.ObjectMeshes[k]->LightMode; |
| 3875 | |
| 3876 | bool acceptsShadows = moveableObj.ShadowType == ShadowMode::None; |
| 3877 | BindMoveableLights(objectInfo->Item->LightsToDraw, objectInfo->Item->RoomNumber, objectInfo->Item->PrevRoomNumber, objectInfo->Item->LightFade, acceptsShadows); |
| 3878 | UpdateConstantBuffer(_stItem, _cbItem); |
| 3879 | |
| 3880 | SetBlendMode(objectInfo->BlendMode); |
| 3881 | SetAlphaTest(AlphaTestMode::None, ALPHA_TEST_THRESHOLD); |
| 3882 | |
| 3883 | BindBucketTextures(*objectInfo->Bucket, TextureSource::Moveables, objectInfo->Bucket->Animated); |
| 3884 | BindMaterial(objectInfo->Bucket->MaterialIndex, false); |
| 3885 | |
| 3886 | DrawIndexedTriangles((int)_sortedPolygonsIndices.size(), 0, 0); |
| 3887 | |
| 3888 | _numSortedMoveablesDrawCalls++; |
| 3889 | _numSortedTriangles += (int)_sortedPolygonsIndices.size() / 3; |
| 3890 | } |
nothing calls this directly
no test coverage detected