fixed normals

This commit is contained in:
OusmBlueNinja 2025-04-17 22:09:03 -05:00
parent fde77eed31
commit 91dc1864d3
9 changed files with 134 additions and 214 deletions

View File

@ -1,195 +0,0 @@
engine_version: 0.1.0
scene_name: __tmp_scene
scene_hash: a0262a35199dae8ff5db4383e9e2d30c63c7a681d14f524a60210fde4c9dc71e
format_version: 1
objects:
- name: Tiles
uid: f5e01f7892874a67b662633650b41dbd
id: 3
position: [0, 0]
layer: 0
visable: true
components: []
children:
- name: Bark
uid: 7dc3bbf8affb4844ae3801f03857b904
id: 4
position: [0, 0]
layer: 0
visable: true
components:
- type: SpriteComponent
texture: C:\Users\spenc\OneDrive\Pictures\textures\bark_willow_02_diff_1k.png
normalMap: C:\Users\spenc\OneDrive\Pictures\textures\bark_willow_02_nor_gl_1k.png
renderType: Lit
children: []
- name: Planks
uid: 13d8988343354e3c8a1f51c03ed40cda
id: 5
position: [1024, 0]
layer: 0
visable: true
components:
- type: SpriteComponent
texture: C:\Users\spenc\OneDrive\Pictures\textures\wood_floor_worn_diff_1k.png
normalMap: C:\Users\spenc\OneDrive\Pictures\textures\wood_floor_worn_nor_gl_1k.png
renderType: Lit
children: []
- name: Rocks
uid: cff28abe7e3b455ab9b756acc84cd2d7
id: 6
position: [0, 1024]
layer: 0
visable: true
components:
- type: SpriteComponent
texture: C:\Users\spenc\OneDrive\Pictures\textures\ganges_river_pebbles_diff_1k.png
normalMap: C:\Users\spenc\OneDrive\Pictures\textures\ganges_river_pebbles_nor_gl_1k.png
renderType: Lit
children: []
- name: Metal
uid: 98967eb30e5b429b992766d8062b7c17
id: 7
position: [1024, 1025]
layer: 0
visable: true
components:
- type: SpriteComponent
texture: C:\Users\spenc\OneDrive\Pictures\textures\metal_plate_diff_1k.png
normalMap: C:\Users\spenc\OneDrive\Pictures\textures\metal_plate_nor_gl_1k.png
renderType: Lit
children: []
- name: Logo
uid: c4ce6f16dfb347b0ae0ac67f5881b243
id: 8
position: [2048, 0]
layer: 0
visable: true
components:
- type: SpriteComponent
texture: C:\Users\spenc\OneDrive\Pictures\blue_logo.png
normalMap: C:\Users\spenc\OneDrive\Pictures\textures\circuits_normal.jpg
renderType: Lit
children: []
- name: Carbooon Fobar
uid: 5ea269572751401da6d86519d3513b7d
id: 9
position: [2567, 1545]
layer: 1
visable: true
components:
- type: SpriteComponent
texture: C:\Users\spenc\OneDrive\Pictures\textures\carbon-fiber-smooth-bl\carbon-fiber-smooth-bl\carbon-fiber_smooth_albedo.png
normalMap: C:\Users\spenc\OneDrive\Pictures\textures\carbon-fiber-smooth-bl\carbon-fiber-smooth-bl\carbon-fiber_smooth_normal-ogl.png
renderType: Lit
children: []
- name: Mud
uid: a36b71937ba349bd8e6414f75be9ee16
id: 10
position: [0, 2561.80005]
layer: 0
visable: true
components:
- type: SpriteComponent
texture: C:\Users\spenc\OneDrive\Pictures\textures\mud-bl\mud-bl\mud_albedo.png
normalMap: C:\Users\spenc\OneDrive\Pictures\textures\mud-bl\mud-bl\mud_normal-ogl.png
renderType: Lit
children: []
- name: Lights
uid: 051b338a725a4076ad53ad8fa00c5f4e
id: 12
position: [-556, 951]
layer: 0
visable: true
components: []
children:
- name: Red
uid: 6afde2dd47aa4557b6afb1a607c99dc8
id: 13
position: [512, 1024]
layer: 2
visable: true
components:
- type: LightComponent
color:
- 1
- 0
- 0
intensity: 2
radius: 1000
falloff: 0.100000001
type: 0
- type: SpriteComponent
texture: C:\Users\spenc\OneDrive\Documents\GitHub\Create-Engine\src\assets\icons\lightbulb-on-10.png
normalMap: ""
renderType: Unlit
children: []
- name: Green
uid: 0f950d76d24b4dc18f54cab2c3aaaf9a
id: 14
position: [1024, 512]
layer: 2
visable: true
components:
- type: LightComponent
color:
- 0
- 1
- 0
intensity: 2
radius: 1000
falloff: 1
type: 0
- type: SpriteComponent
texture: C:\Users\spenc\OneDrive\Documents\GitHub\Create-Engine\src\assets\icons\lightbulb-on-10.png
normalMap: ""
renderType: Unlit
children: []
- name: Blue
uid: 09f722f51c7c4b0f98de3a0a16d127c4
id: 15
position: [250, 250]
layer: 2
visable: true
components:
- type: LightComponent
color:
- 0
- 0
- 1
intensity: 2
radius: 1000
falloff: 1
type: 0
- type: SpriteComponent
texture: C:\Users\spenc\OneDrive\Documents\GitHub\Create-Engine\src\assets\icons\lightbulb-on-10.png
normalMap: ""
renderType: Unlit
children: []
- name: Ambient light
uid: d4fb425522d84a8cbbd7d1415bcd93df
id: 16
position: [500, 500]
layer: 0
visable: true
components:
- type: LightComponent
color:
- 1
- 1
- 1
intensity: 0
radius: 1000000
falloff: 1
type: 0
children: []
- name: ScriptHandler
uid: 895c655f3dda4aec9f2a354c1276c53e
id: 14
position: [0, 0]
layer: 0
visable: true
components:
- type: ScriptComponent
scriptPath: C:\Users\spenc\OneDrive\Documents\GitHub\Create-Engine\src\assets\lua\test.lua
children: []

View File

@ -1,2 +1,2 @@
[COMPILE] g++ -std=c++20 -Wall -Isrc/include -Isrc/include/lua -Isrc/vendor -Isrc/vendor/imgui -IC:/msys64/mingw64/include -IC:\msys64\mingw64\lib\libyaml-cpp.a -Isrc\vendor\imgui -MMD -MP -c src\src\Engine.cpp -o src\build\Engine.o
[LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\Entitys\Object.o src\build\utils\EngineConfig.o src\build\utils\ExceptionHandler.o src\build\utils\FileDialog.o src\build\utils\GameObjectsList.o src\build\utils\Logging.o src\build\utils\Shader.o src\build\utils\UID.o src\build\utils\utils.o src\build\imgui\imgui.o src\build\imgui\imgui_demo.o src\build\imgui\imgui_draw.o src\build\imgui\imgui_impl_glfw.o src\build\imgui\imgui_impl_opengl3.o src\build\imgui\imgui_tables.o src\build\imgui\imgui_widgets.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto [LINK] g++ src\build\Engine.o src\build\main.o src\build\Renderer.o src\build\Components\CameraComponent.o src\build\Components\LightComponent.o src\build\Components\ScriptComponent.o src\build\Components\SpriteComponent.o src\build\Components\TextComonent.o src\build\Components\TilemapComponent.o src\build\Entitys\Object.o src\build\utils\EngineConfig.o src\build\utils\ExceptionHandler.o src\build\utils\FileDialog.o src\build\utils\GameObjectsList.o src\build\utils\Logging.o src\build\utils\Shader.o src\build\utils\UID.o src\build\utils\utils.o src\build\imgui\imgui.o src\build\imgui\imgui_demo.o src\build\imgui\imgui_draw.o src\build\imgui\imgui_impl_glfw.o src\build\imgui\imgui_impl_opengl3.o src\build\imgui\imgui_tables.o src\build\imgui\imgui_widgets.o src\build\lapi.o src\build\lauxlib.o src\build\lbaselib.o src\build\lcode.o src\build\lcorolib.o src\build\lctype.o src\build\ldblib.o src\build\ldebug.o src\build\ldo.o src\build\ldump.o src\build\lfunc.o src\build\lgc.o src\build\linit.o src\build\liolib.o src\build\llex.o src\build\lmathlib.o src\build\lmem.o src\build\loadlib.o src\build\lobject.o src\build\lopcodes.o src\build\loslib.o src\build\lparser.o src\build\lstate.o src\build\lstring.o src\build\lstrlib.o src\build\ltable.o src\build\ltablib.o src\build\ltm.o src\build\lua.o src\build\luac.o src\build\lundump.o src\build\lutf8lib.o src\build\lvm.o src\build\lzio.o -o src\build\app.exe -LC:\msys64\mingw64\lib -lglfw3 -lglew32 -lopengl32 -lgdi32 -lyaml-cpp -lcomdlg32 -lssl -lcrypto
[RUN] Executed app.exe successfully.

View File

@ -1,6 +1,6 @@
engine_version: 0.1.0 engine_version: 0.1.0
scene_name: lighting_test_2 scene_name: lighting_test_2
scene_hash: a0262a35199dae8ff5db4383e9e2d30c63c7a681d14f524a60210fde4c9dc71e scene_hash: a0ae96d593e1990a6f3944184fd6595738629af0dcb2d4cdd83011a91aaa738c
format_version: 1 format_version: 1
objects: objects:
- name: Tiles - name: Tiles
@ -50,7 +50,7 @@ objects:
- name: Metal - name: Metal
uid: 98967eb30e5b429b992766d8062b7c17 uid: 98967eb30e5b429b992766d8062b7c17
id: 7 id: 7
position: [1024, 1025] position: [1024, 1024]
layer: 0 layer: 0
visable: true visable: true
components: components:
@ -74,7 +74,7 @@ objects:
- name: Carbooon Fobar - name: Carbooon Fobar
uid: 5ea269572751401da6d86519d3513b7d uid: 5ea269572751401da6d86519d3513b7d
id: 9 id: 9
position: [2567, 1545] position: [2559.30005, 1562]
layer: 1 layer: 1
visable: true visable: true
components: components:
@ -178,7 +178,7 @@ objects:
- 1 - 1
- 1 - 1
- 1 - 1
intensity: 0 intensity: 0.0500000007
radius: 1000000 radius: 1000000
falloff: 1 falloff: 1
type: 0 type: 0

View File

@ -9,9 +9,9 @@ uniform sampler2D uNormalMap;
#define MAX_LIGHTS 512 #define MAX_LIGHTS 512
uniform int uLightCount; uniform int uLightCount;
uniform vec2 uLightPos[MAX_LIGHTS]; uniform vec2 uLightPos[MAX_LIGHTS];
uniform vec3 uLightColor[MAX_LIGHTS]; uniform vec3 uLightColor[MAX_LIGHTS];
uniform float uLightIntensity[MAX_LIGHTS]; uniform float uLightIntensity[MAX_LIGHTS];
uniform float uLightRadius[MAX_LIGHTS]; uniform float uLightRadius[MAX_LIGHTS];
@ -21,8 +21,11 @@ void main()
if (texColor.a < 0.1) if (texColor.a < 0.1)
discard; discard;
vec3 normal = texture(uNormalMap, vUV).rgb * 2.0 - 1.0; // unpack normal map and convert from [0,1] to [-1,1]
normal = normalize(normal); vec3 n = texture(uNormalMap, vUV).rgb * 2.0 - 1.0;
// invert the green channel for OpenGL
n.y = -n.y;
vec3 normal = normalize(n);
vec3 finalLight = vec3(0.0); vec3 finalLight = vec3(0.0);

View File

@ -395,7 +395,7 @@ void Engine::Run()
Logger::LogInfo("[LoadScene] Loading Scene."); Logger::LogInfo("[LoadScene] Loading Scene.");
if (!file.empty()) if (!file.empty())
LoadScene(file); LoadScene(file);
selected = nullptr; selected = nullptr;
} }
ImGui::EndMenu(); ImGui::EndMenu();
} }
@ -404,6 +404,8 @@ void Engine::Run()
{ {
// simple checkbox never closes the menu when you click it // simple checkbox never closes the menu when you click it
ImGui::Checkbox("Enable Lighting", &g_engineConfig.lighting_enabled); ImGui::Checkbox("Enable Lighting", &g_engineConfig.lighting_enabled);
ImGui::Checkbox("Enable Gizmos", &g_engineConfig.settings.draw_gizmos);
ImGui::EndMenu(); ImGui::EndMenu();
} }
@ -542,6 +544,14 @@ void Engine::Run()
light->GetColor(), light->GetColor(),
light->GetIntensity(), light->GetIntensity(),
light->GetRadius() * cameraZoom); light->GetRadius() * cameraZoom);
Renderer::DrawGizmoCircle(
world,
light->GetRadius(),
64, // segments
light->GetColor(), // circle color
cameraPos,
cameraZoom);
} }
// Collect scripts // Collect scripts

View File

@ -294,6 +294,73 @@ void Renderer::DrawEditorGrid(const glm::vec2 &cameraPos, float zoom)
glEnd(); glEnd();
} }
void Renderer::DrawGizmoLine(
const glm::vec2 &worldStart,
const glm::vec2 &worldEnd,
const glm::vec3 &color,
const glm::vec2 &cameraPos,
float zoom)
{
// Transform to screen space
glm::vec2 a = (worldStart - cameraPos) * zoom + glm::vec2(width * 0.5f, height * 0.5f);
glm::vec2 b = (worldEnd - cameraPos) * zoom + glm::vec2(width * 0.5f, height * 0.5f);
glUseProgram(0);
glLineWidth(2.0f);
glColor3f(color.r, color.g, color.b);
glBegin(GL_LINES);
glVertex2f(a.x, a.y);
glVertex2f(b.x, b.y);
glEnd();
}
void Renderer::DrawGizmoRect(
const glm::vec2 &worldPos,
const glm::vec2 &size,
const glm::vec3 &color,
const glm::vec2 &cameraPos,
float zoom)
{
glm::vec2 p0 = worldPos;
glm::vec2 p1 = worldPos + glm::vec2(size.x, 0.0f);
glm::vec2 p2 = worldPos + size;
glm::vec2 p3 = worldPos + glm::vec2(0.0f, size.y);
// draw four edges
DrawGizmoLine(p0, p1, color, cameraPos, zoom);
DrawGizmoLine(p1, p2, color, cameraPos, zoom);
DrawGizmoLine(p2, p3, color, cameraPos, zoom);
DrawGizmoLine(p3, p0, color, cameraPos, zoom);
}
void Renderer::DrawGizmoCircle(
const glm::vec2 &worldCenter,
float radius,
int segments,
const glm::vec3 &color,
const glm::vec2 &cameraPos,
float zoom)
{
if (segments < 3)
segments = 3;
const float thetaStep = 2.0f * 3.14159265f / float(segments);
glUseProgram(0);
glLineWidth(2.0f);
glColor3f(color.r, color.g, color.b);
glBegin(GL_LINE_LOOP);
for (int i = 0; i < segments; ++i)
{
float theta = thetaStep * float(i);
glm::vec2 worldPoint = worldCenter + glm::vec2(std::cos(theta), std::sin(theta)) * radius;
glm::vec2 screenPoint = (worldPoint - cameraPos) * zoom + glm::vec2(width * 0.5f, height * 0.5f);
glVertex2f(screenPoint.x, screenPoint.y);
}
glEnd();
}
GLuint Renderer::GetRenderTexture() GLuint Renderer::GetRenderTexture()
{ {
return textureColorBuffer; return textureColorBuffer;

View File

@ -7,10 +7,6 @@
#include "Components/SpriteComponent.h" #include "Components/SpriteComponent.h"
#include "utils/EngineConfig.h" #include "utils/EngineConfig.h"
struct Light { struct Light {
glm::vec2 screenPos; glm::vec2 screenPos;
glm::vec3 color; glm::vec3 color;
@ -18,25 +14,55 @@ struct Light {
float radius; float radius;
}; };
static int MAX_LIGHTS = g_engineConfig.gl_maxLight;
class Renderer { class Renderer {
public: public:
static void Init(); static void Init();
static void Resize(int w, int h); static void Resize(int w, int h);
static void Begin(); static void Begin();
static void End(); static void End();
static void DrawSprite(SpriteComponent* sprite, const glm::vec2& pos, float zoom, glm::vec2& CameraPos); static void DrawSprite(SpriteComponent* sprite, const glm::vec2& pos, float zoom, glm::vec2& CameraPos);
static void AddLight(const glm::vec2& screenPos, const glm::vec3& color, float intensity, float radius);
static void DrawTilemap(TilemapComponent* tilemap, const glm::vec2& worldPos, float zoom, const glm::vec2& cameraPos); static void DrawTilemap(TilemapComponent* tilemap, const glm::vec2& worldPos, float zoom, const glm::vec2& cameraPos);
static void AddLight(const glm::vec2& screenPos, const glm::vec3& color, float intensity, float radius);
static void ClearLights(); static void ClearLights();
static void DrawEditorGrid(const glm::vec2& cameraPos, float zoom); static void DrawEditorGrid(const glm::vec2& cameraPos, float zoom);
// —— New gizmo functions ——
// Draws a colored line between two worldspace points.
static void DrawGizmoLine(
const glm::vec2& worldStart,
const glm::vec2& worldEnd,
const glm::vec3& color,
const glm::vec2& cameraPos,
float zoom
);
// Draws a colored axisaligned rectangle in world space.
static void DrawGizmoRect(
const glm::vec2& worldPos,
const glm::vec2& size,
const glm::vec3& color,
const glm::vec2& cameraPos,
float zoom
);
// Draws a colored circle (approximated by segments) in world space.
static void DrawGizmoCircle(
const glm::vec2& worldCenter,
float radius,
int segments,
const glm::vec3& color,
const glm::vec2& cameraPos,
float zoom
);
static GLuint GetRenderTexture(); static GLuint GetRenderTexture();
static glm::ivec2 GetSize(); static glm::ivec2 GetSize();
static int GetDrawCallCount(); static int GetDrawCallCount();
static int GetLightsCount(); static int GetLightsCount();
private: private:
static std::vector<Light> s_Lights; static std::vector<Light> s_Lights;
static GLuint fbo, textureColorBuffer, rbo; static GLuint fbo, textureColorBuffer, rbo;

View File

@ -7,5 +7,8 @@ EngineConfig g_engineConfig {
.version = "0.1.0", .version = "0.1.0",
.gl_version = "430", .gl_version = "430",
.gl_maxLight = 512, .gl_maxLight = 512,
.settings{
.draw_gizmos = true,
},
}; };

View File

@ -1,11 +1,17 @@
#pragma once #pragma once
#include <string> #include <string>
struct UserSettings{
bool draw_gizmos;
};
struct EngineConfig { struct EngineConfig {
bool lighting_enabled; bool lighting_enabled;
std::string version; std::string version;
std::string gl_version; std::string gl_version;
int gl_maxLight; int gl_maxLight;
UserSettings settings;
}; };
extern EngineConfig g_engineConfig; extern EngineConfig g_engineConfig;