Editor progress

This commit is contained in:
KP 2024-07-24 13:29:59 -05:00
parent 7402494e92
commit be91ae1d6f
18 changed files with 730 additions and 74 deletions

View file

@ -56,7 +56,7 @@ void main()
vec3 res = light.diffuse * lambert(norm, light.position);
float a = dist(v_position.xy, vec2(0.0, 0.0)) * 2.0f;
float a = dist(v_position.xz, vec2(0.0, 0.0)) * 2.0f;
v_output = vec4(tex.rgb, tex.a - a);
}

View file

@ -0,0 +1,17 @@
#version 330 core
in vec3 v_position;
in vec4 v_color;
in vec2 v_texcoord;
out vec4 v_output;
uniform sampler2D u_texture;
uniform float u_time;
void main()
{
vec4 tex = texture(u_texture, v_texcoord) * v_color;
v_output = vec4(1.0, 0.0, 0.0, 0.5 + (sin(u_time * 0.3f) + 1.0) * 0.25);
}

View file

@ -0,0 +1,24 @@
#version 330 core
uniform mat4 u_mvp;
layout (location = 0) in vec3 position;
layout (location = 1) in vec4 color;
layout (location = 2) in vec2 texcoord;
out vec3 v_position;
out vec4 v_color;
out vec2 v_texcoord;
out float v_id;
void main()
{
v_position = position;
v_color = color;
v_texcoord = texcoord;
v_id = gl_VertexID;
gl_Position = u_mvp * vec4(v_position, 1.0);
}

View file

@ -1,16 +1,356 @@
[03:52:19 AM] Info: Starting...
[01:28:26 PM] Info: Starting...
KP3D version 2
===============================
Copyright (C) kpworld.xyz 2018-2024
Contact me! @kp_cftsz
[03:52:19 AM] Info: Initializing SDL
[03:52:19 AM] Info: Initializing OpenGL
[03:52:19 AM] Info: OpenGL version: 4.6.0 NVIDIA 536.23
[03:52:19 AM] Info: Initializing GLEW
[03:52:19 AM] Info: Initializing SDL_mixer
[03:52:19 AM] Info: Reticulating splines...
[03:52:20 AM] Info: Ready!
[03:53:11 AM] Info: $ set-mode edit
[03:53:11 AM] Info: $
[01:28:26 PM] Info: Initializing SDL
[01:28:27 PM] Info: Initializing OpenGL
[01:28:27 PM] Info: OpenGL version: 4.6.0 NVIDIA 517.70
[01:28:27 PM] Info: Initializing GLEW
[01:28:27 PM] Info: Initializing SDL_mixer
[01:28:27 PM] Info: Reticulating splines...
[01:28:27 PM] Info: Ready!
[01:28:27 PM] Info: SECTOR HIERARCHY
[01:28:27 PM] Info: Sector 3 (area: 1)
[01:28:27 PM] Info: Parent:
[01:28:27 PM] Info: - 1
[01:28:27 PM] Info: Children:
[01:28:27 PM] Info: - [NO CHILDREN]
[01:28:27 PM] Info: -----
[01:28:27 PM] Info: Sector 4 (area: 1)
[01:28:27 PM] Info: Parent:
[01:28:27 PM] Info: - 2
[01:28:27 PM] Info: Children:
[01:28:27 PM] Info: - [NO CHILDREN]
[01:28:27 PM] Info: -----
[01:28:27 PM] Info: Sector 6 (area: 6)
[01:28:27 PM] Info: Parent:
[01:28:27 PM] Info: - 1
[01:28:27 PM] Info: Children:
[01:28:27 PM] Info: - [NO CHILDREN]
[01:28:27 PM] Info: -----
[01:28:27 PM] Info: Sector 2 (area: 19)
[01:28:27 PM] Info: Parent:
[01:28:27 PM] Info: - 1
[01:28:27 PM] Info: Children:
[01:28:27 PM] Info: - 4
[01:28:27 PM] Info: -----
[01:28:27 PM] Info: Sector 5 (area: 34)
[01:28:27 PM] Info: Parent:
[01:28:27 PM] Info: - [NO PARENT]
[01:28:27 PM] Info: Children:
[01:28:27 PM] Info: - [NO CHILDREN]
[01:28:27 PM] Info: -----
[01:28:27 PM] Info: Sector 1 (area: 105.5)
[01:28:27 PM] Info: Parent:
[01:28:27 PM] Info: - [NO PARENT]
[01:28:27 PM] Info: Children:
[01:28:27 PM] Info: - 3
[01:28:27 PM] Info: - 6
[01:28:27 PM] Info: - 2
[01:28:27 PM] Info: -----
[01:28:27 PM] Info: 3 IS CONNECTED TO 2
[01:28:27 PM] Info: 3 IS CONNECTED TO 2
[01:28:27 PM] Info: 2 IS CONNECTED TO 3
[01:28:27 PM] Info: 2 IS CONNECTED TO 3
[01:28:27 PM] Info: 1 IS CONNECTED TO 5
[01:28:40 PM] Info: SECTOR HIERARCHY
[01:28:40 PM] Info: Sector 3 (area: 1)
[01:28:40 PM] Info: Parent:
[01:28:40 PM] Info: - 1
[01:28:40 PM] Info: Children:
[01:28:40 PM] Info: - [NO CHILDREN]
[01:28:40 PM] Info: -----
[01:28:40 PM] Info: Sector 4 (area: 1)
[01:28:40 PM] Info: Parent:
[01:28:40 PM] Info: - 2
[01:28:40 PM] Info: Children:
[01:28:40 PM] Info: - [NO CHILDREN]
[01:28:40 PM] Info: -----
[01:28:40 PM] Info: Sector 6 (area: 6)
[01:28:40 PM] Info: Parent:
[01:28:40 PM] Info: - 1
[01:28:40 PM] Info: Children:
[01:28:40 PM] Info: - [NO CHILDREN]
[01:28:40 PM] Info: -----
[01:28:40 PM] Info: Sector 2 (area: 19)
[01:28:40 PM] Info: Parent:
[01:28:40 PM] Info: - 1
[01:28:40 PM] Info: Children:
[01:28:40 PM] Info: - 4
[01:28:40 PM] Info: -----
[01:28:40 PM] Info: Sector 5 (area: 34)
[01:28:40 PM] Info: Parent:
[01:28:40 PM] Info: - [NO PARENT]
[01:28:40 PM] Info: Children:
[01:28:40 PM] Info: - [NO CHILDREN]
[01:28:40 PM] Info: -----
[01:28:40 PM] Info: Sector 1 (area: 105.5)
[01:28:40 PM] Info: Parent:
[01:28:40 PM] Info: - [NO PARENT]
[01:28:40 PM] Info: Children:
[01:28:40 PM] Info: - 3
[01:28:40 PM] Info: - 6
[01:28:40 PM] Info: - 2
[01:28:40 PM] Info: -----
[01:28:40 PM] Info: Sector 7 (area: 311)
[01:28:40 PM] Info: Parent:
[01:28:40 PM] Info: - [NO PARENT]
[01:28:40 PM] Info: Children:
[01:28:40 PM] Info: - [NO CHILDREN]
[01:28:40 PM] Info: -----
[01:28:40 PM] Info: 3 IS CONNECTED TO 2
[01:28:40 PM] Info: 3 IS CONNECTED TO 2
[01:28:40 PM] Info: 2 IS CONNECTED TO 3
[01:28:40 PM] Info: 2 IS CONNECTED TO 3
[01:28:40 PM] Info: 1 IS CONNECTED TO 7
[01:28:40 PM] Info: 1 IS CONNECTED TO 5
[01:28:40 PM] Info: 7 IS CONNECTED TO 1
[01:28:40 PM] Info: 7 IS CONNECTED TO 1
[01:28:50 PM] Info: SECTOR HIERARCHY
[01:28:50 PM] Info: Sector 3 (area: 1)
[01:28:50 PM] Info: Parent:
[01:28:50 PM] Info: - 1
[01:28:50 PM] Info: Children:
[01:28:50 PM] Info: - [NO CHILDREN]
[01:28:50 PM] Info: -----
[01:28:50 PM] Info: Sector 4 (area: 1)
[01:28:50 PM] Info: Parent:
[01:28:50 PM] Info: - 2
[01:28:50 PM] Info: Children:
[01:28:50 PM] Info: - [NO CHILDREN]
[01:28:50 PM] Info: -----
[01:28:50 PM] Info: Sector 6 (area: 6)
[01:28:50 PM] Info: Parent:
[01:28:50 PM] Info: - 1
[01:28:50 PM] Info: Children:
[01:28:50 PM] Info: - [NO CHILDREN]
[01:28:50 PM] Info: -----
[01:28:50 PM] Info: Sector 2 (area: 19)
[01:28:50 PM] Info: Parent:
[01:28:50 PM] Info: - 1
[01:28:50 PM] Info: Children:
[01:28:50 PM] Info: - 4
[01:28:50 PM] Info: -----
[01:28:50 PM] Info: Sector 5 (area: 34)
[01:28:50 PM] Info: Parent:
[01:28:50 PM] Info: - [NO PARENT]
[01:28:50 PM] Info: Children:
[01:28:50 PM] Info: - [NO CHILDREN]
[01:28:50 PM] Info: -----
[01:28:50 PM] Info: Sector 1 (area: 105.5)
[01:28:50 PM] Info: Parent:
[01:28:50 PM] Info: - [NO PARENT]
[01:28:50 PM] Info: Children:
[01:28:50 PM] Info: - 3
[01:28:50 PM] Info: - 6
[01:28:50 PM] Info: - 2
[01:28:50 PM] Info: -----
[01:28:50 PM] Info: Sector 7 (area: 311)
[01:28:50 PM] Info: Parent:
[01:28:50 PM] Info: - [NO PARENT]
[01:28:50 PM] Info: Children:
[01:28:50 PM] Info: - [NO CHILDREN]
[01:28:50 PM] Info: -----
[01:28:50 PM] Info: Sector 8 (area: 585)
[01:28:50 PM] Info: Parent:
[01:28:50 PM] Info: - [NO PARENT]
[01:28:50 PM] Info: Children:
[01:28:50 PM] Info: - [NO CHILDREN]
[01:28:50 PM] Info: -----
[01:28:50 PM] Info: 3 IS CONNECTED TO 2
[01:28:50 PM] Info: 3 IS CONNECTED TO 2
[01:28:50 PM] Info: 2 IS CONNECTED TO 3
[01:28:50 PM] Info: 2 IS CONNECTED TO 3
[01:28:50 PM] Info: 1 IS CONNECTED TO 7
[01:28:50 PM] Info: 1 IS CONNECTED TO 5
[01:28:50 PM] Info: 7 IS CONNECTED TO 1
[01:28:50 PM] Info: 7 IS CONNECTED TO 8
[01:28:50 PM] Info: 7 IS CONNECTED TO 1
[01:28:50 PM] Info: 8 IS CONNECTED TO 7
[01:28:50 PM] Info: 8 IS CONNECTED TO 7
[01:29:01 PM] Info: SECTOR HIERARCHY
[01:29:01 PM] Info: Sector 3 (area: 1)
[01:29:01 PM] Info: Parent:
[01:29:01 PM] Info: - 1
[01:29:01 PM] Info: Children:
[01:29:01 PM] Info: - [NO CHILDREN]
[01:29:01 PM] Info: -----
[01:29:01 PM] Info: Sector 4 (area: 1)
[01:29:01 PM] Info: Parent:
[01:29:01 PM] Info: - 2
[01:29:01 PM] Info: Children:
[01:29:01 PM] Info: - [NO CHILDREN]
[01:29:01 PM] Info: -----
[01:29:01 PM] Info: Sector 6 (area: 6)
[01:29:01 PM] Info: Parent:
[01:29:01 PM] Info: - 1
[01:29:01 PM] Info: Children:
[01:29:01 PM] Info: - [NO CHILDREN]
[01:29:01 PM] Info: -----
[01:29:01 PM] Info: Sector 2 (area: 19)
[01:29:01 PM] Info: Parent:
[01:29:01 PM] Info: - 1
[01:29:01 PM] Info: Children:
[01:29:01 PM] Info: - 4
[01:29:01 PM] Info: -----
[01:29:01 PM] Info: Sector 5 (area: 34)
[01:29:01 PM] Info: Parent:
[01:29:01 PM] Info: - [NO PARENT]
[01:29:01 PM] Info: Children:
[01:29:01 PM] Info: - [NO CHILDREN]
[01:29:01 PM] Info: -----
[01:29:01 PM] Info: Sector 9 (area: 48.5)
[01:29:01 PM] Info: Parent:
[01:29:01 PM] Info: - [NO PARENT]
[01:29:01 PM] Info: Children:
[01:29:01 PM] Info: - [NO CHILDREN]
[01:29:01 PM] Info: -----
[01:29:01 PM] Info: Sector 1 (area: 105.5)
[01:29:01 PM] Info: Parent:
[01:29:01 PM] Info: - [NO PARENT]
[01:29:01 PM] Info: Children:
[01:29:01 PM] Info: - 3
[01:29:01 PM] Info: - 6
[01:29:01 PM] Info: - 2
[01:29:01 PM] Info: -----
[01:29:01 PM] Info: Sector 7 (area: 311)
[01:29:01 PM] Info: Parent:
[01:29:01 PM] Info: - [NO PARENT]
[01:29:01 PM] Info: Children:
[01:29:01 PM] Info: - [NO CHILDREN]
[01:29:01 PM] Info: -----
[01:29:01 PM] Info: Sector 8 (area: 585)
[01:29:01 PM] Info: Parent:
[01:29:01 PM] Info: - [NO PARENT]
[01:29:01 PM] Info: Children:
[01:29:01 PM] Info: - [NO CHILDREN]
[01:29:01 PM] Info: -----
[01:29:01 PM] Info: 3 IS CONNECTED TO 2
[01:29:01 PM] Info: 3 IS CONNECTED TO 2
[01:29:01 PM] Info: 2 IS CONNECTED TO 3
[01:29:01 PM] Info: 2 IS CONNECTED TO 3
[01:29:01 PM] Info: 1 IS CONNECTED TO 7
[01:29:01 PM] Info: 1 IS CONNECTED TO 5
[01:29:01 PM] Info: 7 IS CONNECTED TO 1
[01:29:01 PM] Info: 7 IS CONNECTED TO 8
[01:29:01 PM] Info: 7 IS CONNECTED TO 1
[01:29:01 PM] Info: 8 IS CONNECTED TO 7
[01:29:01 PM] Info: 8 IS CONNECTED TO 7
[01:29:11 PM] Info: SECTOR HIERARCHY
[01:29:11 PM] Info: Sector 3 (area: 1)
[01:29:11 PM] Info: Parent:
[01:29:11 PM] Info: - 1
[01:29:11 PM] Info: Children:
[01:29:11 PM] Info: - [NO CHILDREN]
[01:29:11 PM] Info: -----
[01:29:11 PM] Info: Sector 4 (area: 1)
[01:29:11 PM] Info: Parent:
[01:29:11 PM] Info: - 2
[01:29:11 PM] Info: Children:
[01:29:11 PM] Info: - [NO CHILDREN]
[01:29:11 PM] Info: -----
[01:29:11 PM] Info: Sector 6 (area: 6)
[01:29:11 PM] Info: Parent:
[01:29:11 PM] Info: - 1
[01:29:11 PM] Info: Children:
[01:29:11 PM] Info: - [NO CHILDREN]
[01:29:11 PM] Info: -----
[01:29:11 PM] Info: Sector 2 (area: 19)
[01:29:11 PM] Info: Parent:
[01:29:11 PM] Info: - 1
[01:29:11 PM] Info: Children:
[01:29:11 PM] Info: - 4
[01:29:11 PM] Info: -----
[01:29:11 PM] Info: Sector 5 (area: 34)
[01:29:11 PM] Info: Parent:
[01:29:11 PM] Info: - [NO PARENT]
[01:29:11 PM] Info: Children:
[01:29:11 PM] Info: - [NO CHILDREN]
[01:29:11 PM] Info: -----
[01:29:11 PM] Info: Sector 10 (area: 36)
[01:29:11 PM] Info: Parent:
[01:29:11 PM] Info: - [NO PARENT]
[01:29:11 PM] Info: Children:
[01:29:11 PM] Info: - [NO CHILDREN]
[01:29:11 PM] Info: -----
[01:29:11 PM] Info: Sector 9 (area: 48.5)
[01:29:11 PM] Info: Parent:
[01:29:11 PM] Info: - [NO PARENT]
[01:29:11 PM] Info: Children:
[01:29:11 PM] Info: - [NO CHILDREN]
[01:29:11 PM] Info: -----
[01:29:11 PM] Info: Sector 1 (area: 105.5)
[01:29:11 PM] Info: Parent:
[01:29:11 PM] Info: - [NO PARENT]
[01:29:11 PM] Info: Children:
[01:29:11 PM] Info: - 3
[01:29:11 PM] Info: - 6
[01:29:11 PM] Info: - 2
[01:29:11 PM] Info: -----
[01:29:11 PM] Info: Sector 7 (area: 311)
[01:29:11 PM] Info: Parent:
[01:29:11 PM] Info: - [NO PARENT]
[01:29:11 PM] Info: Children:
[01:29:11 PM] Info: - [NO CHILDREN]
[01:29:11 PM] Info: -----
[01:29:11 PM] Info: Sector 8 (area: 585)
[01:29:11 PM] Info: Parent:
[01:29:11 PM] Info: - [NO PARENT]
[01:29:11 PM] Info: Children:
[01:29:11 PM] Info: - [NO CHILDREN]
[01:29:11 PM] Info: -----
[01:29:11 PM] Info: 3 IS CONNECTED TO 2
[01:29:11 PM] Info: 3 IS CONNECTED TO 2
[01:29:11 PM] Info: 2 IS CONNECTED TO 3
[01:29:11 PM] Info: 2 IS CONNECTED TO 3
[01:29:11 PM] Info: 5 IS CONNECTED TO 10
[01:29:11 PM] Info: 10 IS CONNECTED TO 5
[01:29:11 PM] Info: 10 IS CONNECTED TO 9
[01:29:11 PM] Info: 10 IS CONNECTED TO 5
[01:29:11 PM] Info: 9 IS CONNECTED TO 10
[01:29:11 PM] Info: 9 IS CONNECTED TO 10
[01:29:11 PM] Info: 1 IS CONNECTED TO 7
[01:29:11 PM] Info: 1 IS CONNECTED TO 5
[01:29:11 PM] Info: 7 IS CONNECTED TO 1
[01:29:11 PM] Info: 7 IS CONNECTED TO 8
[01:29:11 PM] Info: 7 IS CONNECTED TO 1
[01:29:11 PM] Info: 8 IS CONNECTED TO 7
[01:29:11 PM] Info: 8 IS CONNECTED TO 7
[01:29:38 PM] Info: SECTOR HIERARCHY
[01:29:38 PM] Info: Sector 3 (area: 1)
[01:29:38 PM] Info: Parent:
[01:29:38 PM] Info: - 1
[01:29:38 PM] Info: Children:
[01:29:38 PM] Info: - [NO CHILDREN]
[01:29:38 PM] Info: -----
[01:29:38 PM] Info: Sector 4 (area: 1)
[01:29:38 PM] Info: Parent:
[01:29:38 PM] Info: - 2
[01:29:38 PM] Info: Children:
[01:29:38 PM] Info: - [NO CHILDREN]
[01:29:38 PM] Info: -----
[01:29:38 PM] Info: Sector 6 (area: 6)
[01:29:38 PM] Info: Parent:
[01:29:38 PM] Info: - 1
[01:29:38 PM] Info: Children:
[01:29:38 PM] Info: - [NO CHILDREN]
[01:29:38 PM] Info: -----
[01:29:38 PM] Info: Sector 2 (area: 19)
[01:29:38 PM] Info: Parent:
[01:29:38 PM] Info: - 1
[01:29:38 PM] Info: Children:
[01:29:38 PM] Info: - 4
[01:29:38 PM] Info: -----
[01:29:38 PM] Info: Sector 5 (area: 34)
[01:29:38 PM] Info: Parent:
[01:29:38 PM] Info: - [NO PARENT]
[01:29:38 PM] Info: Children:
[01:29:38 PM] Info: - [NO CHILDREN]
[01:29:38 PM] Info: -----
[01:29:38 PM] Info: Sector 10 (area: 36)
[01:29:38 PM] Info: Parent:
[01:29:38 PM] Info: - [NO PARENT]
[01:29:38 PM] In

View file

@ -265,17 +265,23 @@ void Map::BuildWall(Sector& sector, Wall& wall)
if (wall.flags & Wall::FLAG_OPENING)
{
// Build upper and lower walls for sectors connected to other sectors
// Kinda inefficient the way I'm doing this but whatever YOLO etc.
BuildQuad(sector, sector.floor, wall.portal->floor, wall.textures[TEX_LOWER], a, b, false, false, false, wall.uv_offset[TEX_LOWER]);
BuildQuad(sector, sector.floor, wall.portal->floor, wall.textures[TEX_LOWER], a, b, true, false, false, wall.uv_offset[TEX_LOWER]);
BuildQuad(sector, sector.ceiling, wall.portal->ceiling, wall.textures[TEX_UPPER], a, b, true, false, false, wall.uv_offset[TEX_UPPER]);
BuildQuad(sector, sector.ceiling, wall.portal->ceiling, wall.textures[TEX_UPPER], a, b, false, false, false, wall.uv_offset[TEX_UPPER]);
}
}
void Map::JoinSectors(Sector& sector)
{
// "Connect" sectors by splitting up their walls where other sectors intersect
//for (int i = 0; i < sector.walls.size(); i++)
for (int i = 0; i < sector.walls.size(); i++)
{
Wall& ld = sector.walls[i];
// Clipper2Lib::PathD p;
// p.push_back({ld.start.x, ld.start.y});
for (Sector& s: sectors)
{
if (s.id == sector.id)
@ -288,18 +294,29 @@ void Map::JoinSectors(Sector& sector)
float yt = s.ceiling.base_height;
bool not_child = s.parent_id != sector.id;
float e = 1.0f / 128.0f;
for (Wall& l : s.walls)
{
if (PointInLine(l.start, {pos_a.x, pos_a.z}, {pos_b.x, pos_b.z}) &&
PointInLine(l.end, {pos_a.x, pos_a.z}, {pos_b.x, pos_b.z}) &&
!PosCmp({l.start.x, 0.0f, l.start.y}, {pos_a.x, 0.0f, pos_a.z}) &&
!PosCmp({l.start.x, 0.0f, l.start.y}, {pos_b.x, 0.0f, pos_b.z}) &&
!PosCmp({l.end.x, 0.0f, l.end.y}, {pos_b.x, 0.0f, pos_b.z}) &&
!PosCmp({l.end.x, 0.0f, l.end.y}, {pos_a.x, 0.0f, pos_a.z}) && not_child)
// Clipper2Lib::PointD pi = { l.start.x, l.start.y };
bool good = false;
bool same_points = PosCmp({l.start.x, 0.0f, l.start.y}, {pos_a.x, 0.0f, pos_a.z}, e) ||
PosCmp({l.start.x, 0.0f, l.start.y}, {pos_b.x, 0.0f, pos_b.z}, e) ||
PosCmp({l.end.x, 0.0f, l.end.y}, {pos_b.x, 0.0f, pos_b.z}, e) ||
PosCmp({l.end.x, 0.0f, l.end.y}, {pos_a.x, 0.0f, pos_a.z}, e);
bool on_segment = PointInLine(l.start, {pos_a.x, pos_a.z}, {pos_b.x, pos_b.z}) &&
PointInLine(l.end, {pos_a.x, pos_a.z}, {pos_b.x, pos_b.z});
if (on_segment && not_child)
good = true;
if (good && !l.portal && !ld.portal)
{
XYf old_end = ld.end;
ld.end.x = l.end.x;
ld.end.y = l.end.y;
ld.flags = Wall::FLAG_TOUCHED;
Wall w1 = ld;
w1.start.x = ld.end.x;
w1.start.y = ld.end.y;
@ -308,19 +325,23 @@ void Map::JoinSectors(Sector& sector)
w1.textures[TEX_FRONT] = nullptr;
w1.flags = Wall::FLAG_OPENING;
w1.portal = &s;
w1.flags = Wall::FLAG_TOUCHED;
Wall w2 = ld;
w2.start.x = w1.end.x;
w2.start.y = w1.end.y;
w2.end.x = old_end.x;
w2.end.y = old_end.y;
w2.flags = Wall::FLAG_TOUCHED;
InsertLine(sector.walls, i + 1, w1);
InsertLine(sector.walls, i + 2, w2);
KP3D_LOG_INFO("{} IS CONNECTED TO {}", sector.id, s.id);
// Mark the other one as an opening
// This really shouldn't be necessary I think, but whatever
l.textures[TEX_FRONT] = nullptr;
l.flags = Wall::FLAG_OPENING;
l.flags = Wall::FLAG_OPENING | Wall::FLAG_TOUCHED;
l.portal = &sector;
}
}
@ -337,10 +358,10 @@ void Map::Init()
BuildGrid();
static Texture tex, tex2, tex3, tex4;
tex.Load("GRASS2.png");
tex2.Load("floor0.png");
tex3.Load("FLAT5_7.png");
tex4.Load("block.png");
tex.Load("GRASS2.png", true);
tex2.Load("floor0.png", true);
tex3.Load("FLAT5_7.png", true);
tex4.Load("block.png", true);
m_dot.Load("dot.png");
// Build a stupid little test map
@ -371,7 +392,7 @@ void Map::Init()
float scl = 1.0f;
for (size_t i = 0; i < num_points; i++)
s.walls.push_back(Wall{ {wall,wall,wall}, {{0, 0}}, points[i], points[(i + 1) % num_points], Wall::NO_FLAGS, (uint)i });
sectors.push_back(s);
original_sectors.push_back(s);
};
build_sector(&tex3, &tex, &tex2, -1.0f, 5.0f, 1, points, std::size(points));
build_sector(&tex4, &tex2, &tex2, -1.5f, 4.0f, 2, points2, std::size(points2));
@ -380,6 +401,19 @@ void Map::Init()
build_sector(&tex3, &tex, &tex2, test_u, test_l, 5, points5, std::size(points5), false);
build_sector(&tex4, &tex4, &tex4, 1.0f, 1.4f, 6, points6, std::size(points6), true);
Rebuild(GEN_NORMALS);
}
void Map::Rebuild(NormalGenType gen_normals)
{
m_mesh.Reset();
sectors.clear();
for (Sector& s : original_sectors)
{
sectors.push_back(s);
}
// Correct sectors with counter-clockwise linedef order using the shoelace formula,
// also while we're at it grab the sector areas (will be useful later) and reset old data.
int i = 0;
@ -387,6 +421,7 @@ void Map::Init()
{
// Since we're regenerating the map, we don't want to re-use this data, it may be old.
s.children.clear();
s.area = 0.0f;
s.flags = Sector::NO_FLAGS;
s.parent_id = 0;
s.id = ++i;
@ -402,6 +437,7 @@ void Map::Init()
l.flags |= Wall::FLAG_TOUCHED;
if (no_collisions)
l.flags |= Wall::FLAG_NO_COLLISION;
l.portal = nullptr;
area += l.start.x * l.end.y;
area -= l.end.x * l.start.y;
@ -433,7 +469,7 @@ void Map::Init()
}
}
#if 0
#if 1
// Debug: Print out the sector hierachy
KP3D_LOG_INFO("SECTOR HIERARCHY");
for (Sector& s: sectors)
@ -482,8 +518,8 @@ void Map::Init()
{
float yv0 = PerlinNoise2D(steiner_point.x, steiner_point.y, 1.0, 10.0);
float yv1 = -PerlinNoise2D(steiner_point.x, steiner_point.y, 0.5, 9.0);
s.floor.steiner_points.push_back({ steiner_point.x, yv0, steiner_point.y });
s.ceiling.steiner_points.push_back({ steiner_point.x, yv1, steiner_point.y });
//s.floor.steiner_points.push_back({ steiner_point.x, yv0, steiner_point.y });
//s.ceiling.steiner_points.push_back({ steiner_point.x, yv1, steiner_point.y });
}
}
}
@ -514,12 +550,6 @@ void Map::Init()
}
// Finalize the mesh
m_mesh.Finalize();
}
void Map::Rebuild(NormalGenType gen_normals)
{
// This routine is really just here for me to test smooth normal generation; in the future, everything in Init() should go here
m_mesh.Finalize(gen_normals);
}
@ -622,16 +652,19 @@ void Map::RenderSkybox()
void Map::BuildGrid()
{
m_grid_shader.Load(".kp3d/map_grid_v.glsl", ".kp3d/map_grid_f.glsl");
m_grid_texture.Load(".kp3d/map_grid.png", false, kp3d::Texture::FILTER_LINEAR);
m_grid_texture.Load(".kp3d/map_grid.png", true, kp3d::Texture::FILTER_LINEAR);
m_grid_mesh.AddBatch(&m_grid_texture, {
Vertex3D(Vec3(-0.5f, -0.5f, 0.0f), Vec2(0.0f, 1.0f)),
Vertex3D(Vec3(-0.5f, 0.5f, 0.0f), Vec2(0.0f, 0.0f)),
Vertex3D(Vec3( 0.5f, -0.5f, 0.0f), Vec2(1.0f, 1.0f)),
Vertex3D(Vec3(-0.5f, 0.5f, 0.0f), Vec2(0.0f, 0.0f)),
Vertex3D(Vec3( 0.5f, 0.5f, 0.0f), Vec2(1.0f, 0.0f)),
Vertex3D(Vec3( 0.5f, -0.5f, 0.0f), Vec2(1.0f, 1.0f))
}, true);
Vertex3D(Vec3(-0.5f, 0.0f, 0.5f), Vec2(0.0f, 1.0f)),
Vertex3D(Vec3(-0.5f, 0.0f, -0.5f), Vec2(0.0f, 0.0f)),
Vertex3D(Vec3( 0.5f, 0.0f, 0.5f), Vec2(1.0f, 1.0f)),
Vertex3D(Vec3(-0.5f, 0.0f, -0.5f), Vec2(0.0f, 0.0f)),
Vertex3D(Vec3( 0.5f, 0.0f, -0.5f), Vec2(1.0f, 0.0f)),
Vertex3D(Vec3( 0.5f, 0.0f, 0.5f), Vec2(1.0f, 1.0f))
}, false);
m_grid_mesh.Finalize();
for (const RenderBatch3D& batch: m_grid_mesh.GetBatchesRef())
for (int i = 0; i < batch.vertex_data.size(); i++)
grid_box[i] = batch.vertex_data[i].position * 1000.0f;
}
void Map::RenderGrid()
@ -639,7 +672,7 @@ void Map::RenderGrid()
Renderer3D::PushShader(m_grid_shader);
Vec3 camera_pos = Renderer3D::GetPrimaryCamera()->position;
camera_pos.y = 0.0f;
Transform grid_transform(camera_pos, {ToRadians(90.0f), 0.0, 0.0}, {1000.0, 1000.0, 0.0});
Transform grid_transform(camera_pos, {0.0, 0.0, 0.0}, {1000.0, 0.0, 1000.0});
glDisable(GL_CULL_FACE);
Renderer3D::DrawMesh(m_grid_mesh, grid_transform);
glEnable(GL_CULL_FACE);

View file

@ -122,9 +122,11 @@ public:
void RenderGrid();
public:
std::vector<Sector> original_sectors;
std::vector<Sector> sectors;
bool render_wireframe = true;
float texture_scale = 128.0f;
Vec3 grid_box[6];
float test_u = -1.5f, test_l = 3.0f;

View file

@ -55,6 +55,9 @@ bool RayIntersectsTriangle(const Vec3& ray_origin, const Vec3& ray_vector, Trian
Vec3 vertex0 = in_triangle->vertices[0];
Vec3 vertex1 = in_triangle->vertices[1];
Vec3 vertex2 = in_triangle->vertices[2];
// vertex0 *= Vec3(1, 1, -1);
// vertex1 *= Vec3(1, 1, -1);
// vertex2 *= Vec3(1, 1, -1);
Vec3 edge1, edge2, h, s, q;
float a, f, u, v;
edge1 = vertex1 - vertex0;

View file

@ -147,6 +147,11 @@ void Renderer2D::ResetShader()
r2d_state->shader = &r2d_state->default_shader;
}
const Texture& Renderer2D::GetDefaultTexture()
{
return r2d_state->default_texture;
}
void Renderer2D::PushVertex(float x, float y, float r, float g, float b, float a, float u, float v)
{
assert(r2d_state->num_vertices + V_BUFFER_SIZE < sizeof(r2d_state->vdata));

View file

@ -30,6 +30,8 @@ public:
static void SetShader(const Shader& shader);
static void ResetShader();
static const Texture& GetDefaultTexture();
static void PushVertex(float x, float y, float r, float g, float b, float a, float u, float v);
static void DrawRect(float x, float y, float w, float h, uint rgba = COLOR_WHITE);

View file

@ -11,9 +11,16 @@
#include "KP3D_Texture.h"
#include "KP3D_Time.h"
#include "KP3D_Transform.h"
#include "KP3D_Color.h"
#include "KP3D_Renderer2D.h"
namespace {
constexpr kp3d::uint V_POSITION_SIZE = 3;
constexpr kp3d::uint V_COLOR_SIZE = 4, V_COLOR_OFFSET = 3 * sizeof(float);
constexpr kp3d::uint V_TEXCOORD_SIZE = 2, V_TEXCOORD_OFFSET = 7 * sizeof(float);
constexpr kp3d::uint V_BUFFER_SIZE = 9, V_MAX = 4096;
struct RenderState3D
{
const kp3d::Camera* v;
@ -32,10 +39,100 @@ struct RenderState3D
const kp3d::Shader* shader;
bool active;
// "Legacy rendering" stuff; immediate mode GL emulation (similar to Renderer2D)
kp3d::uint lr_num_vertices;
kp3d::uint lr_num_vertices_last_flushed;
GLuint lr_gl_vao_id;
GLuint lr_gl_vbo_id;
const kp3d::Texture* lr_texture;
float lr_vdata[V_MAX * V_BUFFER_SIZE];
kp3d::Shader lr_shader;
};
std::unique_ptr<RenderState3D> r3d_state;
void LR_Flush()
{
if (!r3d_state->lr_num_vertices)
return;
r3d_state->lr_texture->Bind();
kp3d::Mat4 m = kp3d::Transform().GetProjectedTransformationMatrix(*r3d_state->v, *r3d_state->p);
// kp3d::Renderer3D::PushShader(r3d_state->lr_shader);
r3d_state->shader = &r3d_state->lr_shader;
r3d_state->shader->Bind();
r3d_state->shader->SetUniform("u_mvp", m);
r3d_state->shader->SetUniform("u_campos", r3d_state->v->position);
r3d_state->shader->SetUniform("u_time", r3d_state->time);
glBindVertexArray(r3d_state->lr_gl_vao_id);
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
glBindBuffer(GL_ARRAY_BUFFER, r3d_state->lr_gl_vbo_id);
glBufferData(GL_ARRAY_BUFFER, sizeof(r3d_state->lr_vdata), r3d_state->lr_vdata, GL_DYNAMIC_DRAW);
glVertexAttribPointer(0, V_POSITION_SIZE, GL_FLOAT, false, V_BUFFER_SIZE * sizeof(float), nullptr);
glVertexAttribPointer(
1, V_COLOR_SIZE, GL_FLOAT, false, V_BUFFER_SIZE * sizeof(float), reinterpret_cast<void*>(V_COLOR_OFFSET)
);
glVertexAttribPointer(
2, V_TEXCOORD_SIZE, GL_FLOAT, false, V_BUFFER_SIZE * sizeof(float), reinterpret_cast<void*>(V_TEXCOORD_OFFSET)
);
glDrawArrays(GL_TRIANGLES, 0, r3d_state->lr_num_vertices);
glDisableVertexAttribArray(2);
glDisableVertexAttribArray(1);
glDisableVertexAttribArray(0);
glBindVertexArray(0);
std::fill_n(r3d_state->lr_vdata, std::size(r3d_state->lr_vdata), 0.0f);
r3d_state->lr_num_vertices_last_flushed += r3d_state->lr_num_vertices;
r3d_state->lr_num_vertices = 0;
//kp3d::Renderer3D::PopShader();
}
void LR_FlushOnOverflow(kp3d::uint batch_size)
{
if (r3d_state->lr_num_vertices + batch_size > V_MAX)
LR_Flush();
}
void LR_PushVertex(float x, float y, float z, float r, float g, float b, float a, float u, float v)
{
assert(r3d_state->lr_num_vertices + V_BUFFER_SIZE < sizeof(r3d_state->lr_vdata));
r3d_state->lr_vdata[r3d_state->lr_num_vertices + 0] = x;
r3d_state->lr_vdata[r3d_state->lr_num_vertices + 1] = y;
r3d_state->lr_vdata[r3d_state->lr_num_vertices + 2] = z;
r3d_state->lr_vdata[r3d_state->lr_num_vertices + 3] = r;
r3d_state->lr_vdata[r3d_state->lr_num_vertices + 4] = g;
r3d_state->lr_vdata[r3d_state->lr_num_vertices + 5] = b;
r3d_state->lr_vdata[r3d_state->lr_num_vertices + 6] = a;
r3d_state->lr_vdata[r3d_state->lr_num_vertices + 7] = u;
r3d_state->lr_vdata[r3d_state->lr_num_vertices + 8] = v;
r3d_state->lr_num_vertices += V_BUFFER_SIZE;
}
void LR_SetTexture(const kp3d::Texture& texture)
{
if (r3d_state->lr_texture->GetGLID() == texture.GetGLID())
return;
LR_Flush();
r3d_state->lr_texture = &texture;
r3d_state->lr_texture->Bind();
}
} // namespace
namespace kp3d {
@ -62,6 +159,9 @@ void Renderer3D::End()
return;
}
r3d_state->lr_num_vertices_last_flushed = 0;
LR_Flush();
r3d_state->active = false;
}
@ -292,6 +392,31 @@ void Renderer3D::DrawModel(Model& model, Transform& m)
DrawModel(model, m.GetProjectedTransformationMatrix(*r3d_state->v, *r3d_state->p));
}
void Renderer3D::DrawLine(const Vec3& start, const Vec3& end, float thickness, uint rgba)
{
using namespace util_color_index;
std::array<float, 4> in_floats = ColorToFloats(rgba);
LR_SetTexture(Renderer2D::GetDefaultTexture());
LR_FlushOnOverflow(6);
float angle = atan2(start.z - end.z, start.x - end.x) - ToRadians(90.0f);
Vec3 v0 = { start.x - cosf(angle) * thickness, start.y, start.z - sinf(angle) * thickness };
Vec3 v1 = { start.x + cosf(angle) * thickness, start.y, start.z + sinf(angle) * thickness };
Vec3 v2 = { end.x + cosf(angle) * thickness, end.y, end.z + sinf(angle) * thickness };
Vec3 v3 = { end.x - cosf(angle) * thickness, end.y, end.z - sinf(angle) * thickness };
LR_PushVertex(v0.x, v0.y, v0.z, in_floats[R], in_floats[G], in_floats[B], in_floats[A], 0.0f, 0.0f);
LR_PushVertex(v1.x, v1.y, v1.z, in_floats[R], in_floats[G], in_floats[B], in_floats[A], 1.0f, 0.0f);
LR_PushVertex(v3.x, v3.y, v3.z, in_floats[R], in_floats[G], in_floats[B], in_floats[A], 0.0f, 1.0f);
LR_PushVertex(v2.x, v2.y, v2.z, in_floats[R], in_floats[G], in_floats[B], in_floats[A], 1.0f, 1.0f);
LR_PushVertex(v3.x, v3.y, v3.z, in_floats[R], in_floats[G], in_floats[B], in_floats[A], 0.0f, 1.0f);
LR_PushVertex(v1.x, v1.y, v1.z, in_floats[R], in_floats[G], in_floats[B], in_floats[A], 1.0f, 0.0f);
}
void Renderer3D::PushShader(const Shader& shader)
{
if (r3d_state->shader->GetGLID() == shader.GetGLID())
@ -387,11 +512,20 @@ void Renderer3D::Init()
r3d_state->default_shader.Load(".kp3d/r3d_v.glsl", ".kp3d/r3d_f.glsl");
r3d_state->shader = &r3d_state->default_shader;
glGenVertexArrays(1, &r3d_state->lr_gl_vao_id);
glBindVertexArray(r3d_state->lr_gl_vao_id);
glGenBuffers(1, &r3d_state->lr_gl_vbo_id);
r3d_state->lr_shader.Load(".kp3d/r3d_legacy_v.glsl", ".kp3d/r3d_legacy_f.glsl");
r3d_state->lr_texture = &Renderer2D::GetDefaultTexture();
}
void Renderer3D::Destroy()
{
// ...
glDeleteBuffers(1, &r3d_state->lr_gl_vbo_id);
glDeleteVertexArrays(1, &r3d_state->lr_gl_vao_id);
}
} // namespace kp3d

View file

@ -39,6 +39,8 @@ public:
static void DrawModel(Model& model, const Mat4& m);
static void DrawModel(Model& model, Transform& m);
static void DrawLine(const Vec3& start, const Vec3& end, float thickness = 1.0f, uint rgba = 0xFFFFFFFF);
static void PushShader(const Shader& shader);
static void PopShader();
static void ReloadShaders();

View file

@ -79,8 +79,8 @@ Texture::Load(const byte* data, int width, int height, bool mipmap, FilterMode f
if (mipmap)
{
glGenerateMipmap(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_LINEAR);
glGenerateMipmap(GL_TEXTURE_2D);
}
glBindTexture(GL_TEXTURE_2D, 0);

View file

@ -3,17 +3,34 @@
#include <imgui.h>
#include "KP3D_Renderer3D.h"
#include "KP3D_Raycast.h"
#include "KP3D_Math.h"
#include "KP3D_Geometry.h"
#include "Sandbox.h"
namespace {
constexpr float MIN_DISTANCE_FROM_PLAYER = 0.1f;
constexpr float MAX_DISTANCE_FROM_PLAYER = 100.0f;
std::vector<kp3d::Vec3> points;
inline float Align(float value, float size)
{
return value - (std::fmod(value, size));
}
inline float Distance(kp3d::Vec3 a, kp3d::Vec3 b)
{
return sqrtf((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y) + (b.z - a.z) * (b.z - a.z));
}
}
Editor::Editor()
{
m_stem.Load("editor/stem.png");
m_block.Load("block.png", true);
}
Editor::~Editor()
@ -24,34 +41,105 @@ void Editor::Init()
{
}
void Editor::Update()
{
if (sandbox->IsMouseButtonDown(kp3d::MOUSE_BUTTON_LEFT))
{
points.push_back(m_stem_pos);
if (points.size() >= 3 && kp3d::PosCmp(points.back(), points.front(), 1.0f / 128.0f))// points.back() == points.front())
{
kp3d::Sector s;
s.ceiling.texture = &m_block;
s.floor.texture = &m_block;
s.floor.floor = true;
s.floor.base_height = 0.0f;
s.ceiling.base_height = 2.0f;
s.id = sandbox->map.sectors.size() + 1;
s.parent_id = 0;
s.inverted = false;
for (int i = 0; i < points.size() - 1; i++)
{
kp3d::Wall wall;
wall.start = {points[i].x, -points[i].z};
wall.end = {points[i+1].x, -points[i+1].z};
wall.uid = i;
for (int j = 0; j < 3; j++)
wall.textures[j] = &m_block;
s.walls.push_back(wall);
}
sandbox->map.original_sectors.push_back(s);
sandbox->map.Rebuild(kp3d::GEN_NORMALS);
points.clear();
}
sandbox->MouseButtonReset(kp3d::MOUSE_BUTTON_LEFT);
}
}
void Editor::RenderMap()
{
// Render the map grid
sandbox->map.RenderGrid();
RenderStem({5.0f, 0.0f, 0.0f});
// Render the points we're drawing
if (points.size() > 1)
{
for (int i = 0; i < points.size() - 1; i++)
{
kp3d::Vec3 p0 = points[i];
kp3d::Vec3 p1 = points[i + 1];
float target_thickness = 1.0f / 128.0f;
float thickness = target_thickness;
kp3d::Vec3 player_distance = ((p0 + p1) * 0.5f) - sandbox->camera.position;
float d = sqrtf(
player_distance.x * player_distance.x + player_distance.y * player_distance.y + player_distance.z * player_distance.z
);
if (d < 0.01f)
d = 0.01f;
thickness *= d;
if (thickness > target_thickness)
thickness = target_thickness;
p0.y += 0.01f;
p1.y += 0.01f;
kp3d::Renderer3D::DrawLine(p0, p1, thickness * d, 0xFF0000FF);
}
}
// Render the "stem"
auto ray = kp3d::GetRayFromCamera(sandbox->camera);
kp3d::Vec3 pos{5,0,0};
float dist = 0.0f;
kp3d::Triangle tri0 = {{sandbox->map.grid_box[0], sandbox->map.grid_box[1], sandbox->map.grid_box[2]}, 0, 0};
kp3d::Triangle tri1 = {{sandbox->map.grid_box[3], sandbox->map.grid_box[4], sandbox->map.grid_box[5]}, 0, 0};
bool on_grid = kp3d::RayIntersectsTriangle(ray[0], ray[1], &tri0, pos) || kp3d::RayIntersectsTriangle(ray[0], ray[1], &tri1, pos);
pos.x = Align(pos.x, 1.0f);
pos.z = Align(pos.z, 1.0f);
RenderStem(pos);
m_stem_pos = pos;
}
void Editor::RenderStem(kp3d::Vec3 position)
{
using namespace kp3d;
Vec2 size = {
1.0f,
(float)m_stem.GetHeight() / (float)m_stem.GetWidth()
};
Vec2 size = {1.0f, (float) m_stem.GetHeight() / (float) m_stem.GetWidth()};
const Camera* camera = Renderer3D::GetPrimaryCamera();
kp3d::Vec3 player_distance = position - camera->position;
float vec_distance = sqrtf(
player_distance.x * player_distance.x +
player_distance.y * player_distance.y +
player_distance.z * player_distance.z
player_distance.x * player_distance.x + player_distance.y * player_distance.y + player_distance.z * player_distance.z
);
float scale = vec_distance;
scale *= 0.1f;
if (scale < MIN_DISTANCE_FROM_PLAYER)
scale = MIN_DISTANCE_FROM_PLAYER;
if (scale > MAX_DISTANCE_FROM_PLAYER)
scale = MAX_DISTANCE_FROM_PLAYER;
float scale = 1.0f;
if (vec_distance > scale)
scale = vec_distance * 0.1f;
if (scale > 1.0f)
scale = 1.0f;
size.x *= scale;
size.y *= scale;

View file

@ -10,11 +10,14 @@ public:
~Editor();
void Init();
void Update();
void RenderMap();
void RenderStem(kp3d::Vec3 position);
void RenderUI();
private:
kp3d::Texture m_stem;
kp3d::Texture m_block;
kp3d::Vec3 m_stem_pos;
};

View file

@ -59,6 +59,9 @@ void Sandbox::Update()
if (kp3d::console::open || m_mode == MODE_MENU)
return;
if (m_mode == MODE_EDIT)
editor.Update();
if (IsKeyDown(kp3d::KEY_F1))
{
map.render_wireframe ^= 1;
@ -76,7 +79,7 @@ void Sandbox::Update()
}
if (IsKeyDown(kp3d::KEY_B))
{
map.Init();
//map.Init();
//map.Rebuild(kp3d::GEN_NORMALS);
//KeyReset(kp3d::KEY_B);
}
@ -98,18 +101,18 @@ void Sandbox::Update()
}
float qerf_speed = 1.0f;
float move_speed = 0.2f;
if (IsKeyDown(kp3d::KEY_W)) m_camera.Move(m_camera.forward, move_speed);
if (IsKeyDown(kp3d::KEY_S)) m_camera.Move(m_camera.forward, -move_speed);
if (IsKeyDown(kp3d::KEY_A)) m_camera.Move(m_camera.right, move_speed);
if (IsKeyDown(kp3d::KEY_D)) m_camera.Move(m_camera.right, -move_speed);
if (IsKeyDown(kp3d::KEY_SPACE)) m_camera.position.y += move_speed;
if (IsKeyDown(kp3d::KEY_LSHIFT)) m_camera.position.y -= move_speed;
if (IsKeyDown(kp3d::KEY_Q)) m_camera.Rotate(kp3d::Camera::AXIS_X, qerf_speed);
if (IsKeyDown(kp3d::KEY_E)) m_camera.Rotate(kp3d::Camera::AXIS_X, -qerf_speed);
if (IsKeyDown(kp3d::KEY_R)) m_camera.Rotate(kp3d::Camera::AXIS_Y, qerf_speed);
if (IsKeyDown(kp3d::KEY_F)) m_camera.Rotate(kp3d::Camera::AXIS_Y, -qerf_speed);
ResetMouseCursor([&](float x, float y) { m_camera.UpdateMouseLook({x, y}); });
m_camera.UpdateMatrix();
if (IsKeyDown(kp3d::KEY_W)) camera.Move(camera.forward, move_speed);
if (IsKeyDown(kp3d::KEY_S)) camera.Move(camera.forward, -move_speed);
if (IsKeyDown(kp3d::KEY_A)) camera.Move(camera.right, move_speed);
if (IsKeyDown(kp3d::KEY_D)) camera.Move(camera.right, -move_speed);
if (IsKeyDown(kp3d::KEY_SPACE)) camera.position.y += move_speed;
if (IsKeyDown(kp3d::KEY_LSHIFT)) camera.position.y -= move_speed;
if (IsKeyDown(kp3d::KEY_Q)) camera.Rotate(kp3d::Camera::AXIS_X, qerf_speed);
if (IsKeyDown(kp3d::KEY_E)) camera.Rotate(kp3d::Camera::AXIS_X, -qerf_speed);
if (IsKeyDown(kp3d::KEY_R)) camera.Rotate(kp3d::Camera::AXIS_Y, qerf_speed);
if (IsKeyDown(kp3d::KEY_F)) camera.Rotate(kp3d::Camera::AXIS_Y, -qerf_speed);
ResetMouseCursor([&](float x, float y) { camera.UpdateMouseLook({x, y}); });
camera.UpdateMatrix();
}
void Sandbox::Render()
@ -120,7 +123,7 @@ void Sandbox::Render()
if (m_mode == MODE_GAME || m_mode == MODE_EDIT)
{
// 3D scene
kp3d::Renderer3D::Begin(m_camera, m_projection);
kp3d::Renderer3D::Begin(camera, m_projection);
map.Render();
if (m_mode == MODE_EDIT)
editor.RenderMap();

View file

@ -31,11 +31,11 @@ public:
// Temp
kp3d::Map map;
Editor editor;
kp3d::Camera camera;
private:
// KP3D essentials
kp3d::Mat4 m_projection;
kp3d::Camera m_camera;
int m_mode;
};

Binary file not shown.

BIN
x64/Debug/zlib1.dll Normal file

Binary file not shown.