New static InfoScreen
This commit is contained in:
parent
594fef4164
commit
5fc2c0fc88
@ -12,7 +12,7 @@
|
|||||||
|
|
||||||
//#define DISABLE_AABB_CLIPPING
|
//#define DISABLE_AABB_CLIPPING
|
||||||
//#define DISABLE_TRIANGLE_CLIPPING
|
//#define DISABLE_TRIANGLE_CLIPPING
|
||||||
//#define DISABLE_WIREFRAME_MODE
|
#define DISABLE_WIREFRAME_MODE
|
||||||
|
|
||||||
|
|
||||||
// Rendering pipeline:
|
// Rendering pipeline:
|
||||||
|
@ -13,6 +13,14 @@ void Camera::SetFrustrum(float fov, float r, float zn, float zf) {
|
|||||||
frustrumUpdated = true;
|
frustrumUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Camera::SetFrustrumOrthographic(float w, float h, float zn, float zf) {
|
||||||
|
//if (!frameDirty)
|
||||||
|
this->fov = 90.f;
|
||||||
|
M3D_MATRIX pMat = M3D_TransformMatrixOrthographicLH(w, h, zn, zf);
|
||||||
|
M3D_V4StoreF4x4(&mProjMat, pMat);
|
||||||
|
frustrumUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
void Camera::UpdateCamView() {
|
void Camera::UpdateCamView() {
|
||||||
M3D_VECTOR P = M3D_V4LoadF3(&mPos);
|
M3D_VECTOR P = M3D_V4LoadF3(&mPos);
|
||||||
M3D_VECTOR L = M3D_V4LoadF3(&mLook);
|
M3D_VECTOR L = M3D_V4LoadF3(&mLook);
|
||||||
|
@ -29,6 +29,7 @@ public:
|
|||||||
void SetPosition(const M3D_F3 v) { mPos = v; }
|
void SetPosition(const M3D_F3 v) { mPos = v; }
|
||||||
|
|
||||||
void SetFrustrum(float fov, float r, float zn, float zf);
|
void SetFrustrum(float fov, float r, float zn, float zf);
|
||||||
|
void SetFrustrumOrthographic(float w, float h, float zn, float zf);
|
||||||
void UpdateCamView();
|
void UpdateCamView();
|
||||||
void LookAt(M3D_VECTOR pos, M3D_VECTOR target, M3D_VECTOR worldUp);
|
void LookAt(M3D_VECTOR pos, M3D_VECTOR target, M3D_VECTOR worldUp);
|
||||||
void LookAt(const M3D_F3& pos, const M3D_F3& target, const M3D_F3& up);
|
void LookAt(const M3D_F3& pos, const M3D_F3& target, const M3D_F3& up);
|
||||||
|
100
Engine/Graphics/InfoScreen.cpp
Normal file
100
Engine/Graphics/InfoScreen.cpp
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
#include "InfoScreen.hpp"
|
||||||
|
|
||||||
|
#include "../Utils/MeshHelper.hpp"
|
||||||
|
|
||||||
|
#define SF_COLOR_4CHEX(h) sf::Color((uint32_t)h)
|
||||||
|
|
||||||
|
|
||||||
|
InfoScreen::InfoScreen() : mRTOffset(sf::Vector2f(8.f, 464.f)) {
|
||||||
|
if (mCamera == nullptr) {
|
||||||
|
mCamera = std::make_unique<Camera>();
|
||||||
|
mCamera->SetFrustrumOrthographic(304.f / 100, 220.f / 100, 0.1f, 20.f);
|
||||||
|
mCamera->SetPosition(0.f, 0.f, -8.f);
|
||||||
|
mCamera->UpdateCamView();
|
||||||
|
}
|
||||||
|
mRTSize.x = 304.f; mRTSize.y = 220.f;
|
||||||
|
|
||||||
|
if (mTankHolo == nullptr) {
|
||||||
|
mTankHolo = std::make_unique<Tank>();
|
||||||
|
mTankHolo->SetPosition(0.f, 0.f, 0.f);
|
||||||
|
mTankHolo->SetRotation(0.f, M3D_Deg2Rad(90.f), M3D_Deg2Rad(90.f));
|
||||||
|
mTankHolo->SetScale(2.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
InfoScreen::~InfoScreen() {}
|
||||||
|
|
||||||
|
void InfoScreen::SetRTSize(unsigned int w, unsigned int h) {
|
||||||
|
mRTSize.x = w; mRTSize.y = h;
|
||||||
|
mCamera->SetFrustrumOrthographic(mRTSize.x, mRTSize.y, 0.1f, 20.f);
|
||||||
|
}
|
||||||
|
|
||||||
|
void InfoScreen::Draw(sf::RenderTexture& context) {
|
||||||
|
sf::BlendMode sBM = sf::BlendNone;
|
||||||
|
sf::RenderStates sRS(sBM);
|
||||||
|
|
||||||
|
// Get global (camera and projection) matrixes
|
||||||
|
M3D_MATRIX viewProjMat = mCamera->GetView() * mCamera->GetProj();
|
||||||
|
|
||||||
|
const size_t vCount = mTankHolo->GetObjectVerticesCount();
|
||||||
|
std::vector<M3D_F4> projVertices(vCount);
|
||||||
|
auto& oMesh = mTankHolo->GetObjectMesh();
|
||||||
|
// Vertices homogeneous clip space (NDC) transformation
|
||||||
|
M3D_V3Transform(
|
||||||
|
projVertices.data(), sizeof(M3D_F4),
|
||||||
|
reinterpret_cast<const M3D_F3*>(oMesh.vertices.data()), sizeof(Vertex),
|
||||||
|
vCount,
|
||||||
|
mTankHolo->GetTransform() * viewProjMat
|
||||||
|
);
|
||||||
|
|
||||||
|
sf::Vertex drawPoints[4];
|
||||||
|
for (auto& objPt : oMesh.parts) {
|
||||||
|
auto indicePtr = static_cast<const uint32_t*>(objPt.indices.data());
|
||||||
|
|
||||||
|
for (uint32_t i = 0; i < objPt.GetIndicesCount(); i += 3) {
|
||||||
|
// Indices failsafe - discard triangle rendering
|
||||||
|
if ((i+2 > objPt.GetIndicesCount()) || indicePtr[i] >= vCount || indicePtr[i+1] >= vCount || indicePtr[i+2] >= vCount) {
|
||||||
|
//log.PrintWarning()
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
M3D_VECTOR V1 = M3D_V4LoadF4(&projVertices[indicePtr[i]]);
|
||||||
|
M3D_VECTOR V2 = M3D_V4LoadF4(&projVertices[indicePtr[i+1]]);
|
||||||
|
M3D_VECTOR V3 = M3D_V4LoadF4(&projVertices[indicePtr[i+2]]);
|
||||||
|
|
||||||
|
// Back-face culling in LH-z system
|
||||||
|
// (front when (triangle normal . projected vertice) < 0)
|
||||||
|
//if (M3D_V4GetX(M3D_V3Dot(M3D_Tri3DNormal(V1,V2,V3), V1)) < 0)
|
||||||
|
// NOT USED - Too heavy computation resources usage
|
||||||
|
|
||||||
|
// Do the perspective divide
|
||||||
|
V1 = M3D_V4Divide(V1, M3D_V4SplatW(V1));
|
||||||
|
V2 = M3D_V4Divide(V2, M3D_V4SplatW(V2));
|
||||||
|
V3 = M3D_V4Divide(V3, M3D_V4SplatW(V3));
|
||||||
|
|
||||||
|
// Finally project from NDC to the screen
|
||||||
|
V1 = M3D_V3TransformNDCToViewport(V1, mRTOffset.x, mRTOffset.y, mRTSize.x, mRTSize.y, 0.1f, 20.f);
|
||||||
|
V2 = M3D_V3TransformNDCToViewport(V2, mRTOffset.x, mRTOffset.y, mRTSize.x, mRTSize.y, 0.1f, 20.f);
|
||||||
|
V3 = M3D_V3TransformNDCToViewport(V3, mRTOffset.x, mRTOffset.y, mRTSize.x, mRTSize.y, 0.1f, 20.f);
|
||||||
|
|
||||||
|
// Simplified back-face culling on 2D viewport triangle
|
||||||
|
//if (M3D_V4GetX(M3D_Tri2DNormal(V1,V2,V3)) > 0)
|
||||||
|
{
|
||||||
|
// Set pixels color depending of states (WIP... A long time)
|
||||||
|
// if (player.components.main_canon.state == failure)
|
||||||
|
{
|
||||||
|
drawPoints[0].color = sf::Color::White;
|
||||||
|
drawPoints[1].color = sf::Color::White;
|
||||||
|
drawPoints[2].color = sf::Color::White;
|
||||||
|
}
|
||||||
|
|
||||||
|
drawPoints[1].position = sf::Vector2f(M3D_V4GetX(V2), M3D_V4GetY(V2));
|
||||||
|
drawPoints[0].position = sf::Vector2f(M3D_V4GetX(V1), M3D_V4GetY(V1));
|
||||||
|
drawPoints[2].position = sf::Vector2f(M3D_V4GetX(V3), M3D_V4GetY(V3));
|
||||||
|
drawPoints[3] = drawPoints[0];
|
||||||
|
|
||||||
|
context.draw(drawPoints, 4, sf::LineStrip, sRS);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
34
Engine/Graphics/InfoScreen.hpp
Normal file
34
Engine/Graphics/InfoScreen.hpp
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <SFML/Graphics/RenderTexture.hpp>
|
||||||
|
#include <SFML/System/Vector2.hpp>
|
||||||
|
|
||||||
|
#include "Camera.hpp"
|
||||||
|
#include "../World/Tank.hpp"
|
||||||
|
|
||||||
|
|
||||||
|
class InfoScreen final {
|
||||||
|
public:
|
||||||
|
InfoScreen();
|
||||||
|
~InfoScreen();
|
||||||
|
|
||||||
|
InfoScreen(InfoScreen&&) = default;
|
||||||
|
InfoScreen& operator= (InfoScreen&&) = default;
|
||||||
|
InfoScreen(InfoScreen const&) = delete;
|
||||||
|
InfoScreen& operator= (InfoScreen const&) = delete;
|
||||||
|
|
||||||
|
const sf::Vector2f& GetRTSize() const noexcept { return mRTSize; }
|
||||||
|
void SetRTSize(unsigned int w, unsigned int h);
|
||||||
|
const sf::Vector2f& GetRTOffset() const noexcept { return mRTOffset; }
|
||||||
|
void SetRTOffset(unsigned int w, unsigned int h) { mRTOffset.x = w; mRTOffset.y = h; }
|
||||||
|
|
||||||
|
void Draw(sf::RenderTexture& context);
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<Camera> mCamera;
|
||||||
|
sf::Vector2f mRTSize;
|
||||||
|
sf::Vector2f mRTOffset;
|
||||||
|
|
||||||
|
std::unique_ptr<Tank> mTankHolo;
|
||||||
|
|
||||||
|
};
|
@ -51,6 +51,9 @@ CockpitUI::CockpitUI(unsigned int w, unsigned int h) : UI(w, h) {
|
|||||||
mStaticCockpitTexture.setSrgb(true);
|
mStaticCockpitTexture.setSrgb(true);
|
||||||
if (!mStaticCockpitTexture.loadFromFile("cockpit_ui.png", sf::IntRect(0, 0, 1280, 780)))
|
if (!mStaticCockpitTexture.loadFromFile("cockpit_ui.png", sf::IntRect(0, 0, 1280, 780)))
|
||||||
throw std::runtime_error("Unable to load texture datas");
|
throw std::runtime_error("Unable to load texture datas");
|
||||||
|
|
||||||
|
if (mInfoScreen == nullptr)
|
||||||
|
mInfoScreen = std::make_unique<InfoScreen>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CockpitUI::Update() {
|
void CockpitUI::Update() {
|
||||||
@ -71,6 +74,9 @@ void CockpitUI::Draw(std::shared_ptr<sf::RenderWindow>& context) {
|
|||||||
radar.setFillColor(SF_COLOR_4CHEX(0x666666FF));
|
radar.setFillColor(SF_COLOR_4CHEX(0x666666FF));
|
||||||
mUIRender.draw(radar, sRS);
|
mUIRender.draw(radar, sRS);
|
||||||
|
|
||||||
|
// Draw the player info screen
|
||||||
|
mInfoScreen->Draw(mUIRender);
|
||||||
|
|
||||||
// Draw the static board
|
// Draw the static board
|
||||||
sf::Sprite staticBoardSprite(mStaticCockpitTexture);
|
sf::Sprite staticBoardSprite(mStaticCockpitTexture);
|
||||||
mUIRender.draw(staticBoardSprite, sRS);
|
mUIRender.draw(staticBoardSprite, sRS);
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
#include <SFML/Graphics/RenderWindow.hpp>
|
#include <SFML/Graphics/RenderWindow.hpp>
|
||||||
|
|
||||||
#include "3DRenderer.hpp"
|
#include "3DRenderer.hpp"
|
||||||
|
#include "InfoScreen.hpp"
|
||||||
|
|
||||||
|
|
||||||
class UI {
|
class UI {
|
||||||
@ -48,6 +49,7 @@ public:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
sf::Texture mStaticCockpitTexture;
|
sf::Texture mStaticCockpitTexture;
|
||||||
|
std::unique_ptr<InfoScreen> mInfoScreen;
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -586,6 +586,8 @@ M3D_MATRIX M3D_TransformMatrixCamLookToLH(M3D_VECTOR viewPos, M3D_VECTOR viewDir
|
|||||||
M3D_MATRIX M3D_TransformMatrixCamLookToRH(M3D_VECTOR viewPos, M3D_VECTOR viewDirection, M3D_VECTOR upDirection) noexcept;
|
M3D_MATRIX M3D_TransformMatrixCamLookToRH(M3D_VECTOR viewPos, M3D_VECTOR viewDirection, M3D_VECTOR upDirection) noexcept;
|
||||||
M3D_MATRIX M3D_TransformMatrixFrustrumFovLH(float fov, float ratio, float near, float far) noexcept;
|
M3D_MATRIX M3D_TransformMatrixFrustrumFovLH(float fov, float ratio, float near, float far) noexcept;
|
||||||
M3D_MATRIX M3D_TransformMatrixFrustrumFovRH(float fov, float ratio, float near, float far) noexcept;
|
M3D_MATRIX M3D_TransformMatrixFrustrumFovRH(float fov, float ratio, float near, float far) noexcept;
|
||||||
|
M3D_MATRIX M3D_TransformMatrixOrthographicLH(float w, float h, float near, float far) noexcept;
|
||||||
|
M3D_MATRIX M3D_TransformMatrixOrthographicRH(float w, float h, float near, float far) noexcept;
|
||||||
M3D_MATRIX M3D_TransformMatrixScale(float ScaleX, float ScaleY, float ScaleZ) noexcept;
|
M3D_MATRIX M3D_TransformMatrixScale(float ScaleX, float ScaleY, float ScaleZ) noexcept;
|
||||||
M3D_MATRIX M3D_TransformMatrixScale(M3D_VECTOR Scale) noexcept;
|
M3D_MATRIX M3D_TransformMatrixScale(M3D_VECTOR Scale) noexcept;
|
||||||
M3D_MATRIX M3D_TransformMatrixTranslate(float OffsetX, float OffsetY, float OffsetZ) noexcept;
|
M3D_MATRIX M3D_TransformMatrixTranslate(float OffsetX, float OffsetY, float OffsetZ) noexcept;
|
||||||
|
@ -1749,6 +1749,116 @@ INLINE_AVX_FIX M3D_MATRIX M3D_TransformMatrixFrustrumFovRH(float fov, float rati
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INLINE_AVX_FIX M3D_MATRIX M3D_TransformMatrixOrthographicLH(float w, float h, float near, float far) noexcept {
|
||||||
|
float fRange = 1.0f / (far - near);
|
||||||
|
|
||||||
|
#ifdef DISABLE_INTRINSICS
|
||||||
|
M3D_MATRIX ret;
|
||||||
|
ret.mat[0][0] = 2.0f / w;
|
||||||
|
ret.mat[0][1] = 0.0f;
|
||||||
|
ret.mat[0][2] = 0.0f;
|
||||||
|
ret.mat[0][3] = 0.0f;
|
||||||
|
|
||||||
|
ret.mat[1][0] = 0.0f;
|
||||||
|
ret.mat[1][1] = 2.0f / h;
|
||||||
|
ret.mat[1][2] = 0.0f;
|
||||||
|
ret.mat[1][3] = 0.0f;
|
||||||
|
|
||||||
|
ret.mat[2][0] = 0.0f;
|
||||||
|
ret.mat[2][1] = 0.0f;
|
||||||
|
ret.mat[2][2] = fRange;
|
||||||
|
ret.mat[2][3] = 0.0f;
|
||||||
|
|
||||||
|
ret.mat[3][0] = 0.0f;
|
||||||
|
ret.mat[3][1] = 0.0f;
|
||||||
|
ret.mat[3][2] = -fRange * near;
|
||||||
|
ret.mat[3][3] = 1.0f;
|
||||||
|
return ret;
|
||||||
|
#else
|
||||||
|
M3D_VECTOR rMem = {
|
||||||
|
2.0f / w,
|
||||||
|
2.0f / h,
|
||||||
|
fRange,
|
||||||
|
-fRange * near
|
||||||
|
};
|
||||||
|
|
||||||
|
// Copy from memory to SSE register
|
||||||
|
M3D_VECTOR vValues = rMem;
|
||||||
|
|
||||||
|
M3D_MATRIX ret;
|
||||||
|
M3D_VECTOR vTemp = _mm_setzero_ps();
|
||||||
|
vTemp = _mm_move_ss(vTemp, vValues);
|
||||||
|
|
||||||
|
ret.rows[0] = vTemp; // 2.0f / w, 0, 0, 0
|
||||||
|
|
||||||
|
vTemp = vValues;
|
||||||
|
vTemp = _mm_and_ps(vTemp, M3D_MMaskY);
|
||||||
|
ret.rows[1] = vTemp; // 0, 2.0f / h, 0, 0
|
||||||
|
vTemp = _mm_setzero_ps();
|
||||||
|
vValues = _mm_shuffle_ps(vValues, M3D_MIdentityR3, _MM_SHUFFLE(3, 2, 3, 2));
|
||||||
|
vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 0, 0, 0));
|
||||||
|
ret.rows[2] = vTemp; // 0, 0, fRange, 0.f
|
||||||
|
vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 1, 0, 0));
|
||||||
|
ret.rows[3] = vTemp; // 0, 0, -fRange * near, 1.0f
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
INLINE_AVX_FIX M3D_MATRIX M3D_TransformMatrixOrthographicRH(float w, float h, float near, float far) noexcept {
|
||||||
|
float fRange = 1.0f / (near - far);
|
||||||
|
|
||||||
|
#ifdef DISABLE_INTRINSICS
|
||||||
|
M3D_MATRIX ret;
|
||||||
|
ret.mat[0][0] = 2.0f / w;
|
||||||
|
ret.mat[0][1] = 0.0f;
|
||||||
|
ret.mat[0][2] = 0.0f;
|
||||||
|
ret.mat[0][3] = 0.0f;
|
||||||
|
|
||||||
|
ret.mat[1][0] = 0.0f;
|
||||||
|
ret.mat[1][1] = 2.0f / h;
|
||||||
|
ret.mat[1][2] = 0.0f;
|
||||||
|
ret.mat[1][3] = 0.0f;
|
||||||
|
|
||||||
|
ret.mat[2][0] = 0.0f;
|
||||||
|
ret.mat[2][1] = 0.0f;
|
||||||
|
ret.mat[2][2] = fRange;
|
||||||
|
ret.mat[2][3] = 0.0f;
|
||||||
|
|
||||||
|
ret.mat[3][0] = 0.0f;
|
||||||
|
ret.mat[3][1] = 0.0f;
|
||||||
|
ret.mat[3][2] = fRange * near;
|
||||||
|
ret.mat[3][3] = 1.0f;
|
||||||
|
return ret;
|
||||||
|
#else
|
||||||
|
M3D_VECTOR rMem = {
|
||||||
|
2.0f / w,
|
||||||
|
2.0f / h,
|
||||||
|
fRange,
|
||||||
|
fRange * near
|
||||||
|
};
|
||||||
|
|
||||||
|
// Copy from memory to SSE register
|
||||||
|
M3D_VECTOR vValues = rMem;
|
||||||
|
|
||||||
|
M3D_MATRIX ret;
|
||||||
|
M3D_VECTOR vTemp = _mm_setzero_ps();
|
||||||
|
vTemp = _mm_move_ss(vTemp, vValues);
|
||||||
|
|
||||||
|
ret.rows[0] = vTemp; // 2.0f / w, 0, 0, 0
|
||||||
|
|
||||||
|
vTemp = vValues;
|
||||||
|
vTemp = _mm_and_ps(vTemp, M3D_MMaskY);
|
||||||
|
ret.rows[1] = vTemp; // 0, 2.0f / h, 0, 0
|
||||||
|
vTemp = _mm_setzero_ps();
|
||||||
|
vValues = _mm_shuffle_ps(vValues, M3D_MIdentityR3, _MM_SHUFFLE(3, 2, 3, 2));
|
||||||
|
vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(2, 0, 0, 0));
|
||||||
|
ret.rows[2] = vTemp; // 0, 0, fRange, 0.f
|
||||||
|
vTemp = _mm_shuffle_ps(vTemp, vValues, _MM_SHUFFLE(3, 1, 0, 0));
|
||||||
|
ret.rows[3] = vTemp; // 0, 0, fRange * near, 1.0f
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
INLINE_AVX_FIX M3D_MATRIX M3D_TransformMatrixTranslate(M3D_VECTOR Offset) noexcept {
|
INLINE_AVX_FIX M3D_MATRIX M3D_TransformMatrixTranslate(M3D_VECTOR Offset) noexcept {
|
||||||
#ifdef DISABLE_INTRINSICS
|
#ifdef DISABLE_INTRINSICS
|
||||||
M3D_MATRIX ret;
|
M3D_MATRIX ret;
|
||||||
|
@ -18,6 +18,7 @@ This code has been written with experimentation and education in mind. It is sub
|
|||||||
|
|
||||||
I've used some libs for backend boilerplate like:
|
I've used some libs for backend boilerplate like:
|
||||||
- SFML (window management)
|
- SFML (window management)
|
||||||
|
- fmt (logging)
|
||||||
- tinyobjloader (OBJ file loading)
|
- tinyobjloader (OBJ file loading)
|
||||||
- Tweaked DirectXMath (Heavy math duty)
|
- Tweaked DirectXMath (Heavy math duty)
|
||||||
|
|
||||||
@ -32,7 +33,7 @@ the question of the proprietary code issue was quickly answered!
|
|||||||
|
|
||||||
## About
|
## About
|
||||||
|
|
||||||
*Actually, 72 coffees have been used to produce this code.*
|
*Actually, 80 coffees have been used to produce this code.*
|
||||||
|
|
||||||
Feel free to ask question about the code: jackcartersmith@jcsmith.fr
|
Feel free to ask question about the code: jackcartersmith@jcsmith.fr
|
||||||
|
|
||||||
|
@ -34,6 +34,8 @@ set(GAME_SCRS
|
|||||||
set(GRAPHS_SCRS
|
set(GRAPHS_SCRS
|
||||||
Engine/Graphics/3DRenderer.cpp
|
Engine/Graphics/3DRenderer.cpp
|
||||||
Engine/Graphics/3DRenderer.hpp
|
Engine/Graphics/3DRenderer.hpp
|
||||||
|
Engine/Graphics/InfoScreen.cpp
|
||||||
|
Engine/Graphics/InfoScreen.hpp
|
||||||
Engine/Graphics/Camera.cpp
|
Engine/Graphics/Camera.cpp
|
||||||
Engine/Graphics/Camera.hpp
|
Engine/Graphics/Camera.hpp
|
||||||
Engine/Graphics/UI.cpp
|
Engine/Graphics/UI.cpp
|
||||||
|
Loading…
x
Reference in New Issue
Block a user