general improvements
This commit is contained in:
@@ -129,15 +129,10 @@ namespace Game
|
||||
bgfx::setDebug(BGFX_DEBUG_TEXT);
|
||||
bgfx::setViewClear(0, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x303030ff, 1.0f, 0);
|
||||
|
||||
LoadMesh(Models[0]);
|
||||
LoadMesh(Models[0], "models/cube.gltf");
|
||||
LoadMesh(Models[1], "models/zurg.gltf");
|
||||
|
||||
bgfx::ShaderHandle vertexShader = loadShader("vert");
|
||||
bgfx::ShaderHandle fragmentShader = loadShader("frag");
|
||||
|
||||
Materials[0].Shader = bgfx::createProgram(vertexShader, fragmentShader, true);
|
||||
Materials[0].State = 0 | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_WRITE_Z |
|
||||
BGFX_STATE_DEPTH_TEST_LESS | BGFX_STATE_CULL_CCW | BGFX_STATE_MSAA;
|
||||
Materials[0].Uniforms[Material::UniformTimeIdx] = bgfx::createUniform("u_time", bgfx::UniformType::Vec4);
|
||||
Materials[0] = Material::LoadFromShader("vert", "frag");
|
||||
|
||||
if (!GetInstance().IsInitialized)
|
||||
{
|
||||
@@ -156,7 +151,7 @@ namespace Game
|
||||
shared.Dev.ChangedShaderCount = 0;
|
||||
|
||||
// TODO: when to destroy shader?
|
||||
// bgfx::destroy(Shader);
|
||||
// TODO: only reload changed shaders
|
||||
bgfx::ShaderHandle vertexShader = loadShader("vert");
|
||||
bgfx::ShaderHandle fragmentShader = loadShader("frag");
|
||||
if (isValid(vertexShader) && isValid(fragmentShader))
|
||||
@@ -178,7 +173,7 @@ namespace Game
|
||||
|
||||
float delta = GetInstance().Delta;
|
||||
constexpr float moveSpeed = 10.0f;
|
||||
constexpr float rotSpeed = 1.0f;
|
||||
constexpr float rotSpeed = 0.6f;
|
||||
|
||||
float forwardInput = (GetKey(ScanCode::W) ? 1.0f : 0.0f) + (GetKey(ScanCode::S) ? -1.0f : 0.0f);
|
||||
float rightInput = (GetKey(ScanCode::D) ? 1.0f : 0.0f) + (GetKey(ScanCode::A) ? -1.0f : 0.0f);
|
||||
@@ -189,14 +184,15 @@ namespace Game
|
||||
bx::Vec3 camForward = Cam.Transform.Forward();
|
||||
bx::Vec3 camRight = Cam.Transform.Right();
|
||||
|
||||
bx::Vec3 rotInput = {shared.Window.MouseDeltaY * delta, shared.Window.MouseDeltaX * delta, 0.0f};
|
||||
bx::Vec3 rotInput = {
|
||||
shared.Window.MouseDeltaY * delta * rotSpeed, shared.Window.MouseDeltaX * delta * rotSpeed, 0.0f};
|
||||
Cam.FreelookXRot += rotInput.x;
|
||||
Cam.FreelookYRot += rotInput.y;
|
||||
bx::mtxRotateY(Cam.Transform.Rotation.M, Cam.FreelookYRot);
|
||||
Cam.Transform.RotateLocal({Cam.FreelookXRot, 0.0f, 0.0f});
|
||||
|
||||
Cam.Transform.TranslateLocal({0.0f, 0.0f, -forwardInput});
|
||||
Cam.Transform.TranslateLocal({-rightInput, 0.0f, 0.0f});
|
||||
Cam.Transform.TranslateLocal({0.0f, 0.0f, -inputVec.z});
|
||||
Cam.Transform.TranslateLocal({-inputVec.x, 0.0f, 0.0f});
|
||||
bgfx::dbgTextPrintf(1, 4, 0x0f, "Cam forward: %.2f %.2f %.2f", camForward.x, camForward.y, camForward.z);
|
||||
}
|
||||
|
||||
@@ -216,27 +212,8 @@ namespace Game
|
||||
bgfx::setViewRect(0, 0, 0, shared.Window.WindowWidth, shared.Window.WindowHeight);
|
||||
}
|
||||
|
||||
float TimeValues[4]{0.0f};
|
||||
TimeValues[0] = GetInstance().Now;
|
||||
|
||||
for (int32_t i = 0; i < GetInstance().GameLevel.Cubes.Count; ++i)
|
||||
{
|
||||
Cube* c = GetInstance().GameLevel.Cubes.Get(i);
|
||||
if (c)
|
||||
{
|
||||
bgfx::setTransform(c->Transform.M.M);
|
||||
|
||||
Model& currentModel = Models[c->ModelIdx];
|
||||
Material& currentMaterial = Materials[c->MaterialIdx];
|
||||
bgfx::setVertexBuffer(0, currentModel.VertexBuffer);
|
||||
bgfx::setIndexBuffer(currentModel.IndexBuffer);
|
||||
bgfx::setState(currentMaterial.State);
|
||||
bgfx::setUniform(Materials[0].Uniforms[Material::UniformTimeIdx], TimeValues);
|
||||
|
||||
// Submit primitive for rendering to view 0.
|
||||
bgfx::submit(0, currentMaterial.Shader);
|
||||
}
|
||||
}
|
||||
GetInstance().GameLevel.Cubes.Render(Models, Materials);
|
||||
GetInstance().GameLevel.Tests.Render(Models, Materials);
|
||||
|
||||
bgfx::dbgTextPrintf(1, 1, 0x0F, "Time: %.1f", GetInstance().Now);
|
||||
bgfx::dbgTextPrintf(1, 2, 0x0F, "Frame: %u", GetInstance().FrameCounter);
|
||||
@@ -249,4 +226,18 @@ namespace Game
|
||||
{
|
||||
bgfx::shutdown();
|
||||
}
|
||||
|
||||
Material Material::LoadFromShader(const char* vertPath, const char* fragPath)
|
||||
{
|
||||
bgfx::ShaderHandle vertexShader = loadShader("vert");
|
||||
bgfx::ShaderHandle fragmentShader = loadShader("frag");
|
||||
|
||||
Material mat;
|
||||
mat.Shader = bgfx::createProgram(vertexShader, fragmentShader, true);
|
||||
mat.State = 0 | BGFX_STATE_WRITE_RGB | BGFX_STATE_WRITE_A | BGFX_STATE_WRITE_Z | BGFX_STATE_DEPTH_TEST_LESS |
|
||||
BGFX_STATE_CULL_CCW | BGFX_STATE_MSAA;
|
||||
mat.Uniforms[Material::UTime] = bgfx::createUniform("u_time", bgfx::UniformType::Vec4);
|
||||
mat.Uniforms[Material::UDotColor] = bgfx::createUniform("u_testColor", bgfx::UniformType::Vec4);
|
||||
return mat;
|
||||
}
|
||||
} // namespace Game
|
||||
|
||||
@@ -11,6 +11,9 @@ namespace Game
|
||||
float x;
|
||||
float y;
|
||||
float z;
|
||||
float n_x;
|
||||
float n_y;
|
||||
float n_z;
|
||||
uint32_t abgr;
|
||||
float uv_x;
|
||||
float uv_y;
|
||||
@@ -105,10 +108,16 @@ namespace Game
|
||||
|
||||
struct Material
|
||||
{
|
||||
static constexpr uint32_t UniformTimeIdx = 0;
|
||||
enum UniformNames : uint32_t
|
||||
{
|
||||
UTime = 0,
|
||||
UDotColor = 1,
|
||||
};
|
||||
|
||||
bgfx::ProgramHandle Shader;
|
||||
bgfx::UniformHandle Uniforms[8];
|
||||
uint64_t State = 0;
|
||||
static Material LoadFromShader(const char* vertPath, const char* fragPath);
|
||||
};
|
||||
|
||||
struct Camera
|
||||
|
||||
Reference in New Issue
Block a user