Drawing of debug lines using new line rendering seems to work

master
Martin Felis 2016-12-22 23:20:03 +01:00
parent d7e1048b06
commit ccf8ae71ef
5 changed files with 150 additions and 147 deletions

View File

@ -1,7 +1,8 @@
vec4 v_color0 : COLOR0 = vec4(1.0, 0.0, 1.0, 1.0); vec4 v_color0 : COLOR = vec4(1.0, 0.0, 1.0, 1.0);
vec3 a_position : POSITION; vec3 a_position : POSITION;
vec3 a_texcoord0 : TEXCOORD0 = vec3(1.0, 0.0, 1.0); vec3 a_texcoord0 : TEXCOORD0 = vec3(1.0, 0.0, 1.0);
vec3 a_texcoord1 : TEXCOORD1 = vec3(1.0, 0.0, 1.0); vec3 a_texcoord1 : TEXCOORD1 = vec3(1.0, 0.0, 1.0);
float a_texcoord2 : TEXCOORD2 = 0.0; float a_texcoord2 : TEXCOORD2 = 0.0;
vec4 a_color0 : COLOR0;

View File

@ -1,4 +1,4 @@
$input a_position, a_texcoord0, a_texcoord1, a_texcoord2 $input a_position, a_texcoord0, a_texcoord1, a_texcoord2, a_color0
$output v_color0 $output v_color0
/* /*
@ -12,8 +12,7 @@ uniform vec4 u_line_params;
#define thickness u_line_params.x #define thickness u_line_params.x
#define miter u_line_params.y #define miter u_line_params.y
#define width u_line_params.z #define aspect u_line_params.z
#define height u_line_params.w
#define current_pos a_position #define current_pos a_position
#define prev_pos a_texcoord0 #define prev_pos a_texcoord0
#define next_pos a_texcoord1 #define next_pos a_texcoord1
@ -21,7 +20,6 @@ uniform vec4 u_line_params;
void main() void main()
{ {
float aspect = width / height;
vec2 aspect_vec = vec2(aspect, 1.0); vec2 aspect_vec = vec2(aspect, 1.0);
vec4 current_proj = mul(u_modelViewProj, vec4(current_pos, 1.0)); vec4 current_proj = mul(u_modelViewProj, vec4(current_pos, 1.0));
@ -61,5 +59,5 @@ void main()
vec4 offset = vec4(normal * orientation, 0.0, 0.0); vec4 offset = vec4(normal * orientation, 0.0, 0.0);
gl_Position = current_proj + offset; gl_Position = current_proj + offset;
v_color0 = vec4(1.0, 0.0, 1.0, 1.0); v_color0 = a_color0;
} }

View File

@ -562,6 +562,7 @@ struct PathVertex
float next[3]; float next[3];
// TODO: use an int for the direction // TODO: use an int for the direction
float direction; float direction;
float color[4];
static void init() static void init()
{ {
@ -571,6 +572,7 @@ struct PathVertex
.add(bgfx::Attrib::TexCoord0, 3, bgfx::AttribType::Float) .add(bgfx::Attrib::TexCoord0, 3, bgfx::AttribType::Float)
.add(bgfx::Attrib::TexCoord1, 3, bgfx::AttribType::Float) .add(bgfx::Attrib::TexCoord1, 3, bgfx::AttribType::Float)
.add(bgfx::Attrib::TexCoord2, 1, bgfx::AttribType::Float) .add(bgfx::Attrib::TexCoord2, 1, bgfx::AttribType::Float)
.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Float)
.end(); .end();
} }
@ -1418,109 +1420,6 @@ void Renderer::paintGL() {
meshSubmit(entities[i]->mesh, &s_renderStates[RenderState::Scene], 1, entities[i]->transform); meshSubmit(entities[i]->mesh, &s_renderStates[RenderState::Scene], 1, entities[i]->transform);
} }
// drawLinesHere
{
Path test_path;
test_path.points.push_back(Vector3f (0.f, -1.f, 0.f));
test_path.points.push_back(Vector3f (1.f, -1.f, 0.f));
test_path.points.push_back(Vector3f (0.f, 0.f, 0.f));
// test_path.points.push_back(Vector3f (1.f, 0.f, 0.f));
// test_path.points.push_back(Vector3f (0.25f, -0.75f, 0.f));
// create an array for the actual buffer
std::vector<PathVertex> path_vertices;
// note: we submit each vertex twice
for (int i = 0; i < test_path.points.size(); i++) {
PathVertex vertex;
memcpy (vertex.position, test_path.points[i].data(), sizeof(float) * 3);
if (i == 0) {
assert (test_path.points.size() > 1);
memcpy (vertex.prev, test_path.points[i].data(), sizeof(float) * 3);
memcpy (vertex.next, test_path.points[i + 1].data(), sizeof(float) * 3);
} else if (i == test_path.points.size() - 1) {
memcpy (vertex.next, test_path.points[i].data(), sizeof(float) * 3);
memcpy (vertex.prev, test_path.points[i - 1].data(), sizeof(float) * 3);
} else {
memcpy (vertex.prev, test_path.points[i - 1].data(), sizeof(float) * 3);
memcpy (vertex.next, test_path.points[i + 1].data(), sizeof(float) * 3);
}
vertex.direction = -1.0f;
path_vertices.push_back(vertex);
vertex.direction = 1.0f;
path_vertices.push_back(vertex);
}
// PathVertex* v = (PathVertex*) path_vertices.data();
// int vi = 0;
// while (vi < path_vertices.size()) {
// cout << vi << ": v=" << v->position[0] << ", " << v->position[1] << ", " << v->position[2]
// << " p=" << v->prev[0] << ", " << v->prev[1] << ", " << v->prev[2] << ", "
// << " n=" << v->next[0] << ", " << v->next[1] << ", " << v->next[2] << ", "
// << " d=" << v->direction << endl;
//
// v++;
// vi++;
// }
// update buffer from buffer data
bgfx::updateDynamicVertexBuffer (path_lines_vbh,
0,
bgfx::copy(path_vertices.data(), sizeof(PathVertex) * path_vertices.size())
);
std::vector<uint16_t> line_indices;
int index = 0;
for (int i = 0; i < test_path.points.size() - 1; i++) {
int j = index;
line_indices.push_back(j + 0);
line_indices.push_back(j + 1);
line_indices.push_back(j + 2);
line_indices.push_back(j + 2);
line_indices.push_back(j + 1);
line_indices.push_back(j + 3);
index += 2;
}
// for (int i = 0; i < line_indices.size(); i++) {
// cout << line_indices[i] << ", ";
// }
// cout << endl;
//
// cout << "points: " << test_path.points.size()
// << ", line indices: " << line_indices.size()
// << ", path_vertices: " << path_vertices.size()
// << ", last line index: " << line_indices[line_indices.size() -1]
// << ", width = " << width << ", height = " << height
// << endl;
// assert (line_indices[line_indices.size() -1] < path_vertices.size());
// assert (line_indices.size() == test_path.points.size() * 3);
bgfx::updateDynamicIndexBuffer (path_lines_ibh,
0,
bgfx::copy(line_indices.data(), sizeof(uint16_t) * line_indices.size())
);
// submit data
const RenderState& st = s_renderStates[RenderState::Lines];
float thickness = 0.1f;
float miter = 1.f;
float aspect = width / height;
Vector4f params (thickness, miter, width, height);
Camera &active_camera = cameras[activeCameraIndex];
bgfx::setUniform(u_line_params, params.data(), 1);
bgfx::setIndexBuffer(path_lines_ibh);
bgfx::setVertexBuffer(path_lines_vbh);
bgfx::setState(st.m_state);
bgfx::submit(st.m_viewId, st.m_program.program);
}
// render debug information // render debug information
if (drawDebug) { if (drawDebug) {
float tmp[16]; float tmp[16];
@ -1570,38 +1469,24 @@ void Renderer::paintGL() {
} }
} }
// create buffer data for the lines // clear and create buffer data for the lines
debugPaths.clear();
uint16_t* line_idx_buf = new uint16_t[line_count * 2]; uint16_t* line_idx_buf = new uint16_t[line_count * 2];
PosColorVertex *line_vert_buf = new PosColorVertex[line_count * 2]; PosColorVertex *line_vert_buf = new PosColorVertex[line_count * 2];
for (uint32_t i = 0; i < debugCommands.size(); i++) { for (uint32_t i = 0; i < debugCommands.size(); i++) {
if (debugCommands[i].type == DebugCommand::Line) { if (debugCommands[i].type == DebugCommand::Line) {
// from coordinates Path line;
line_vert_buf[2 * i].m_x = debugCommands[i].from[0];
line_vert_buf[2 * i].m_y = debugCommands[i].from[1];
line_vert_buf[2 * i].m_z = debugCommands[i].from[2];
uint32_t color = // TODO: we submit start and end twice to make sure
(0xff << 24) // we have no color blending triangles when extruding
+ (static_cast<char>(debugCommands[i].color[0]) * 255 << 0) // the lines using triangles. Should be improved.
+ (static_cast<char>(debugCommands[i].color[1]) * 255 << 8) line.points.push_back(debugCommands[i].from);
+ (static_cast<char>(debugCommands[i].color[2]) * 255 << 16); line.points.push_back(debugCommands[i].from);
line.points.push_back(debugCommands[i].to);
// from color line.points.push_back(debugCommands[i].to);
line_vert_buf[2 * i].m_abgr = color; line.color = debugCommands[i].color;
line.miter = 0.0f;
// from index debugPaths.push_back(line);
line_idx_buf[2 * i] = 2 * i;
// to coordinates
line_vert_buf[2 * i + 1].m_x = debugCommands[i].to[0];
line_vert_buf[2 * i + 1].m_y = debugCommands[i].to[1];
line_vert_buf[2 * i + 1].m_z = debugCommands[i].to[2];
// to color
line_vert_buf[2 * i + 1].m_abgr = color;
// to index
line_idx_buf[2 * i + 1] = 2 * i + 1;
} }
} }
@ -1629,6 +1514,102 @@ void Renderer::paintGL() {
delete[] line_idx_buf; delete[] line_idx_buf;
} }
// create an array for the actual buffer
std::vector<PathVertex> path_vertices;
// Rendering of debug lines and paths
for (Path &path : debugPaths) {
// note: we submit each vertex twice so that any two points are
// extruded by a quad made of two triangles (hence four points)
for (int i = 0; i < path.points.size(); i++) {
PathVertex vertex;
memcpy (vertex.position, path.points[i].data(), sizeof(float) * 3);
memcpy (vertex.color, path.color.data(), sizeof(float) * 4);
if (i == 0) {
assert (path.points.size() > 1);
memcpy (vertex.prev, path.points[i].data(), sizeof(float) * 3);
memcpy (vertex.next, path.points[i + 1].data(), sizeof(float) * 3);
} else if (i == path.points.size() - 1) {
memcpy (vertex.next, path.points[i].data(), sizeof(float) * 3);
memcpy (vertex.prev, path.points[i - 1].data(), sizeof(float) * 3);
} else {
memcpy (vertex.prev, path.points[i - 1].data(), sizeof(float) * 3);
memcpy (vertex.next, path.points[i + 1].data(), sizeof(float) * 3);
}
vertex.direction = -1.0f;
path_vertices.push_back(vertex);
vertex.direction = 1.0f;
path_vertices.push_back(vertex);
}
// PathVertex* v = (PathVertex*) path_vertices.data();
// int vi = 0;
// while (vi < path_vertices.size()) {
// cout << vi << ": v=" << v->position[0] << ", " << v->position[1] << ", " << v->position[2]
// << " p=" << v->prev[0] << ", " << v->prev[1] << ", " << v->prev[2] << ", "
// << " n=" << v->next[0] << ", " << v->next[1] << ", " << v->next[2] << ", "
// << " d=" << v->direction << endl;
//
// v++;
// vi++;
// }
}
// update buffer from buffer data
bgfx::updateDynamicVertexBuffer (path_lines_vbh,
0,
bgfx::copy(path_vertices.data(), sizeof(PathVertex) * path_vertices.size())
);
std::vector<uint16_t> line_indices;
int index = 0;
for (int i = 0; i < (path_vertices.size() / 2) - 1; i++) {
int j = index;
line_indices.push_back(j + 0);
line_indices.push_back(j + 1);
line_indices.push_back(j + 2);
line_indices.push_back(j + 2);
line_indices.push_back(j + 1);
line_indices.push_back(j + 3);
index += 2;
}
// for (int i = 0; i < line_indices.size(); i++) {
// cout << line_indices[i] << ", ";
// }
// cout << endl;
//
// cout << "points: " << path.points.size()
// << ", line indices: " << line_indices.size()
// << ", path_vertices: " << path_vertices.size()
// << ", last line index: " << line_indices[line_indices.size() -1]
// << ", width = " << width << ", height = " << height
// << endl;
// assert (line_indices[line_indices.size() -1] < path_vertices.size());
// assert (line_indices.size() == path.points.size() * 3);
bgfx::updateDynamicIndexBuffer (path_lines_ibh,
0,
bgfx::copy(line_indices.data(), sizeof(uint16_t) * line_indices.size())
);
// submit data
const RenderState& st = s_renderStates[RenderState::Lines];
float thickness = 0.05f;
float miter = 0.0f;
Vector4f params (thickness, miter, width / height, 0.0f);
Camera &active_camera = cameras[activeCameraIndex];
bgfx::setUniform(u_line_params, params.data(), 1);
bgfx::setIndexBuffer(path_lines_ibh);
bgfx::setVertexBuffer(path_lines_vbh);
bgfx::setState(st.m_state);
bgfx::submit(st.m_viewId, st.m_program.program);
// Advance to next frame. Rendering thread will be kicked to // Advance to next frame. Rendering thread will be kicked to
// process submitted rendering primitives. // process submitted rendering primitives.
@ -1776,7 +1757,7 @@ void Renderer::drawDebugLine (
cmd.type = DebugCommand::Line; cmd.type = DebugCommand::Line;
cmd.from = from; cmd.from = from;
cmd.to = to; cmd.to = to;
cmd.color = color; cmd.color = SimpleMath::Vector4f (color[0], color[1], color[2], 1.0f);
debugCommands.push_back(cmd); debugCommands.push_back(cmd);
} }

View File

@ -178,6 +178,9 @@ struct LightProbe
struct Path { struct Path {
std::vector<SimpleMath::Vector3f> points; std::vector<SimpleMath::Vector3f> points;
float thickness = 0.1f;
float miter = 0.0f;
SimpleMath::Vector4f color = SimpleMath::Vector4f (1.0f, 1.0f, 1.0f, 1.0f);
}; };
struct DebugCommand { struct DebugCommand {
@ -191,7 +194,7 @@ struct DebugCommand {
SimpleMath::Vector3f from; SimpleMath::Vector3f from;
SimpleMath::Vector3f to; SimpleMath::Vector3f to;
SimpleMath::Vector3f color; SimpleMath::Vector4f color = SimpleMath::Vector4f(1.f, 1.f, 1.f, 1.f);
}; };
struct Renderer { struct Renderer {
@ -216,6 +219,7 @@ struct Renderer {
std::vector<Camera> cameras; std::vector<Camera> cameras;
std::vector<Light> lights; std::vector<Light> lights;
std::vector<Path> debugPaths;
std::vector<DebugCommand> debugCommands; std::vector<DebugCommand> debugCommands;
uint16_t activeCameraIndex; uint16_t activeCameraIndex;

View File

@ -57,32 +57,51 @@ struct CharacterEntity {
/// Render entity /// Render entity
Entity *entity; Entity *entity;
Vector3f position; Vector3f position;
Vector3f velocity;
CharacterController controller; CharacterController controller;
void update(float dt) { void update(float dt) {
Vector3f local_velocity (Vector3f::Zero()); Vector3f controller_velocity (Vector3f::Zero());
if (controller.state[CharacterController::ControlForward]) { if (controller.state[CharacterController::ControlForward]) {
local_velocity += Vector3f (1.f, 0.f, 0.f); controller_velocity += Vector3f (1.f, 0.f, 0.f);
} }
if (controller.state[CharacterController::ControlBack]) { if (controller.state[CharacterController::ControlBack]) {
local_velocity -= Vector3f (1.f, 0.f, 0.f); controller_velocity -= Vector3f (1.f, 0.f, 0.f);
} }
if (controller.state[CharacterController::ControlRight]) { if (controller.state[CharacterController::ControlRight]) {
local_velocity += Vector3f (0.f, 0.f, 1.f); controller_velocity += Vector3f (0.f, 0.f, 1.f);
} }
if (controller.state[CharacterController::ControlLeft]) { if (controller.state[CharacterController::ControlLeft]) {
local_velocity -= Vector3f (0.f, 0.f, 1.f); controller_velocity -= Vector3f (0.f, 0.f, 1.f);
}
if (position[1] == 0.0f && controller.state[CharacterController::ControlJump]) {
controller_velocity += Vector3f (0.f, 20.f, 0.f);
} }
float vel_damping = 2.0;
Vector3f acceleration(
-velocity[0] * vel_damping,
-29.81f,
-velocity[2] * vel_damping
);
acceleration = acceleration + controller_velocity * 30.0f;
velocity = velocity + acceleration * dt;
// integrate position // integrate position
position += local_velocity * 5 * dt; position += velocity * dt;
if (position[1] < 0.f) {
position[1] = 0.f;
}
// apply transformation // apply transformation
bx::mtxTranslate(entity->transform, position[0], position[1], position[2]); bx::mtxTranslate(entity->transform, position[0], position[1] + 1.0f, position[2]);
} }
}; };
@ -274,8 +293,8 @@ static void module_reload(struct module_state *state) {
cout << "Creating render entity ... success!" << endl; cout << "Creating render entity ... success!" << endl;
cout << "Creating render entity mesh ..." << endl; cout << "Creating render entity mesh ..." << endl;
// state->character->entity->mesh = bgfxutils::createUVSphere (45, 45); state->character->entity->mesh = bgfxutils::createUVSphere (45, 45);
state->character->entity->mesh = bgfxutils::createCuboid (1.f, 1.f, 1.f); // state->character->entity->mesh = bgfxutils::createCuboid (1.f, 1.f, 1.f);
// state->character->entity->mesh = bgfxutils::createCylinder (20); // state->character->entity->mesh = bgfxutils::createCylinder (20);
cout << "Creating render entity mesh ... success!" << endl; cout << "Creating render entity mesh ... success!" << endl;