| 3970 | } |
| 3971 | |
| 3972 | void Renderer::DrawHairSorted(RendererSortableObject* objectInfo, RendererObjectType lastObjectType, RenderView& view, int index) |
| 3973 | { |
| 3974 | if (index >= HairEffect.Units.size()) |
| 3975 | { |
| 3976 | TENLog("Attempt to draw nonexistent hair unit", LogLevel::Warning); |
| 3977 | return; |
| 3978 | } |
| 3979 | |
| 3980 | if (lastObjectType != objectInfo->ObjectType) |
| 3981 | { |
| 3982 | unsigned int stride = sizeof(Vertex); |
| 3983 | unsigned int offset = 0; |
| 3984 | _context->IASetVertexBuffers(0, 1, _moveablesVertexBuffer.Buffer.GetAddressOf(), &stride, &offset); |
| 3985 | _context->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); |
| 3986 | _context->IASetInputLayout(_inputLayout.Get()); |
| 3987 | |
| 3988 | SetDepthState(DepthState::Read); |
| 3989 | SetCullMode(CullMode::CounterClockwise); |
| 3990 | |
| 3991 | _shaders.Bind(Shader::Items); |
| 3992 | } |
| 3993 | |
| 3994 | _sortedPolygonsIndexBuffer.Update(_context.Get(), _sortedPolygonsIndices, 0, (int)_sortedPolygonsIndices.size()); |
| 3995 | _context->IASetIndexBuffer(_sortedPolygonsIndexBuffer.Buffer.Get(), DXGI_FORMAT_R32_UINT, 0); |
| 3996 | |
| 3997 | // Bind main item properties. |
| 3998 | Matrix world = objectInfo->Item->InterpolatedWorld; |
| 3999 | _stItem.World = world; |
| 4000 | _stItem.Color = objectInfo->Item->Color; |
| 4001 | _stItem.AmbientLight = objectInfo->Item->AmbientLight; |
| 4002 | _stItem.Skinned = (int)(objectInfo->Skinned ? SkinningMode::Full : SkinningMode::None); |
| 4003 | |
| 4004 | const auto& moveableObj = *_moveableObjects[(int)GAME_OBJECT_ID::ID_HAIR_PRIMARY + index]; |
| 4005 | |
| 4006 | _stItem.World = Matrix::Identity; |
| 4007 | _stItem.BonesMatrices[0] = objectInfo->Item->InterpolatedAnimTransforms[HairUnit::GetRootMeshID(index)] * objectInfo->Item->InterpolatedWorld; |
| 4008 | ReflectMatrixOptionally(_stItem.BonesMatrices[0]); |
| 4009 | |
| 4010 | bool forceValue = g_GameFlow->CurrentFreezeMode == FreezeMode::Player; |
| 4011 | |
| 4012 | for (int i = 0; i < HairEffect.Units[index].Segments.size(); i++) |
| 4013 | { |
| 4014 | const auto& segment = HairEffect.Units[index].Segments[i]; |
| 4015 | auto worldMatrix = segment.GlobalTransform; |
| 4016 | |
| 4017 | ReflectMatrixOptionally(worldMatrix); |
| 4018 | |
| 4019 | _stItem.BonesMatrices[i + 1] = worldMatrix; |
| 4020 | _stItem.BoneLightModes[i] = (int)LightMode::Dynamic; |
| 4021 | } |
| 4022 | |
| 4023 | UpdateConstantBuffer(_stItem, _cbItem); |
| 4024 | |
| 4025 | for (int k = 0; k < moveableObj.ObjectMeshes.size(); k++) |
| 4026 | _stItem.BoneLightModes[k] = (int)moveableObj.ObjectMeshes[k]->LightMode; |
| 4027 | |
| 4028 | bool acceptsShadows = moveableObj.ShadowType == ShadowMode::None; |
| 4029 | BindMoveableLights(objectInfo->Item->LightsToDraw, objectInfo->Item->RoomNumber, objectInfo->Item->PrevRoomNumber, objectInfo->Item->LightFade, acceptsShadows); |