Skip to content

Commit

Permalink
+ Added normal information to tz_mesh_demo. We now display the final …
Browse files Browse the repository at this point in the history
…computed normal instead of the colour, because I'm missing basic lighting. Working on that next tho.
  • Loading branch information
harrand committed Jul 4, 2023
1 parent ab3beaa commit 53c3576
Show file tree
Hide file tree
Showing 6 changed files with 48 additions and 14 deletions.
21 changes: 18 additions & 3 deletions demo/gl/tz_mesh_demo/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ int main()
scene_t scene = temp_debug_load_cube_gltf();
std::vector<meshid_t> scene_meshes(scene.meshes.size());
std::vector<texid_t> scene_images(scene.images.size());
std::vector<std::size_t> mesh_bound_images(scene.meshes.size());
std::vector<std::vector<std::size_t>> mesh_bound_images(scene.meshes.size());

mesh_renderer renderer{scene.images.size()};
renderer.push_back_timeline();
Expand All @@ -46,11 +46,16 @@ int main()
std::string mname = "GLTF Mesh" + std::to_string(i);
scene_meshes[i] = renderer.add_mesh(scene.meshes[i], mname.c_str());
std::size_t iid = 0;
std::size_t nid = 0;
if(scene.meshes[i].image_id != static_cast<std::size_t>(-1))
{
iid = scene.meshes[i].image_id;
}
mesh_bound_images[i] = iid;
if(scene.meshes[i].norm_image_id != static_cast<std::size_t>(-1))
{
nid = scene.meshes[i].norm_image_id;
}
mesh_bound_images[i] = {iid, nid};
}
for(std::size_t i = 0; i < scene.images.size(); i++)
{
Expand All @@ -60,7 +65,12 @@ int main()
}
for(std::size_t i = 0; i < scene.meshes.size(); i++)
{
renderer.add_to_draw_list(scene_meshes[i], {.scale = {0.01f, 0.01f, 0.01f}}, scene_images[mesh_bound_images[i]]);
std::vector<texid_t> real_image_ids;
for(std::size_t id : mesh_bound_images[i])
{
real_image_ids.push_back(scene_images[id]);
}
renderer.add_to_draw_list(scene_meshes[i], {.scale = {0.01f, 0.01f, 0.01f}}, real_image_ids);
}

tz::duration update_timer = tz::system_time();
Expand Down Expand Up @@ -191,6 +201,11 @@ scene_t temp_debug_load_cube_gltf()
cur.image_id = tex.image_id;
tz::assert(tex.texcoord_id == 0, "use of multiple texcoords is NYI. GLTF wants to use texcoord %zu for colour", tex.texcoord_id);
}
else if(tex.type == tz::io::gltf_submesh_texture_type::normal)
{
cur.norm_image_id = tex.image_id;
tz::assert(tex.texcoord_id == 0, "use of multiple texcoords is NYI. GLTF wants to use texcoord %zu for colour", tex.texcoord_id);
}
}
}
}
Expand Down
1 change: 1 addition & 0 deletions demo/gl/tz_mesh_demo/mesh.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,4 +18,5 @@ struct mesh_t
std::vector<vertex_t> vertices = {};
std::vector<std::uint32_t> indices = {};
std::size_t image_id = -1;
std::size_t norm_image_id = -1;
};
12 changes: 8 additions & 4 deletions demo/gl/tz_mesh_demo/mesh_renderer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -118,7 +118,7 @@ void mesh_renderer::push_back_timeline() const
tz::gl::get_device().render_graph().add_dependencies(this->rh, this->ch);
}

void mesh_renderer::add_to_draw_list(meshid_t mesh, transform_t transform, texid_t tex)
void mesh_renderer::add_to_draw_list(meshid_t mesh, transform_t transform, std::vector<texid_t> tex)
{
this->append_meshid_to_draw_buffer(mesh, transform, tex);
this->draw_list.push_back(mesh);
Expand Down Expand Up @@ -189,7 +189,7 @@ void mesh_renderer::dbgui()
ImGui::SliderInt("Texture", &create_texid, 0, this->textures.size());
if(ImGui::Button("Create"))
{
this->add_to_draw_list(create_meshid, {}, create_texid);
this->add_to_draw_list(create_meshid, {}, {static_cast<std::uint32_t>(create_texid), 0u});
}
ImGui::EndTabItem();
}
Expand Down Expand Up @@ -349,13 +349,17 @@ void mesh_renderer::append_mesh_to_buffers(const mesh_t& mesh)
);
}

void mesh_renderer::append_meshid_to_draw_buffer(meshid_t mesh, transform_t transform, texid_t tex)
void mesh_renderer::append_meshid_to_draw_buffer(meshid_t mesh, transform_t transform, std::vector<texid_t> tex)
{
// write the draw data.
drawdata_storage_t& draw_data = tz::gl::get_device().get_renderer(this->rh).get_resource(this->drawdata_buf)->data_as<drawdata_storage_t>().front();
drawdata_element_t& elem = draw_data.draws[this->draw_list.size()];
elem.model = tz::model(transform.pos, transform.rot, transform.scale);
elem.textures[0] = {.tint = {1.0f, 1.0f, 1.0f}, .texid = tex};
tz::assert(tex.size() == 2, "Textures supported: {colour, normal}. You have specified %zu, we want 2.", tex.size());
for(std::size_t i = 0; i < tex.size(); i++)
{
elem.textures[i] = {.tint = {1.0f, 1.0f, 1.0f}, .texid = tex[i]};
}
// write out the mesh reference.
mesh_reference ref = this->get_reference(mesh);
meshref_storage_t& storage = tz::gl::get_device().get_renderer(this->ch).get_resource(this->meshref_buf)->data_as<meshref_storage_t>().front();
Expand Down
4 changes: 2 additions & 2 deletions demo/gl/tz_mesh_demo/mesh_renderer.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -80,12 +80,12 @@ class mesh_renderer
texid_t add_texture(unsigned int width, unsigned int height, std::span<const std::byte> imgdata);

void push_back_timeline() const;
void add_to_draw_list(meshid_t mesh, transform_t transform = {}, texid_t tex = 0);
void add_to_draw_list(meshid_t mesh, transform_t transform = {}, std::vector<texid_t> tex = {});
void dbgui();
void update(float dt);
private:
void append_mesh_to_buffers(const mesh_t& mesh);
void append_meshid_to_draw_buffer(meshid_t mesh, transform_t transform, texid_t tex);
void append_meshid_to_draw_buffer(meshid_t mesh, transform_t transform, std::vector<texid_t> tex);
mesh_reference get_reference(meshid_t mesh) const;
void write_camera_buffer();
// draw indirect buffer
Expand Down
20 changes: 16 additions & 4 deletions demo/gl/tz_mesh_demo/shaders/mesh3d.fragment.tzsl
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,27 @@ struct texture_t

output(id = 0) vec4 out::colour;
input(id = 0) vec2 in::texc;
input(id = 1, flat) texture_t in::textures[TEX_COUNT];
input(id = 1) vec3 in::norm;
input(id = 2, flat) texture_t in::textures[TEX_COUNT];
resource(id = 3) const texture textures[];

void main()
{
out::colour = vec4(vec3(0.0f), 1.0f);
for(uint i = 0; i < 1; i++)

texture_t colour_tex = in::textures[0];
vec3 tex_colour = texture(textures[colour_tex.texid], in::texc).xyz * colour_tex.tint;

texture_t normal_tex = in::textures[1];
vec3 norm = in::norm;
if(normal_tex.texid != 0)
{
texture_t this_tex = in::textures[i];
out::colour.xyz += texture(textures[this_tex.texid], in::texc).xyz * this_tex.tint;
vec3 sampled_normal = texture(textures[normal_tex.texid], in::texc).xyz;
vec3 tangent_normal = normalize(norm);
vec3 binormal = cross(vec3(0.0f, 1.0f, 0.0f), tangent_normal);
vec3 tangent = cross(tangent_normal, binormal);
mat3 tbn = mat3(tangent, binormal, tangent_normal);
norm = normalize(tbn * sampled_normal);
}
out::colour.xyz = norm;
}
4 changes: 3 additions & 1 deletion demo/gl/tz_mesh_demo/shaders/mesh3d.vertex.tzsl
Original file line number Diff line number Diff line change
Expand Up @@ -46,14 +46,16 @@ resource(id = 2) const buffer camera_buffer
// OUTPUTS

output(id = 0) vec2 out::texc;
output(id = 1) texture_t out::textures[TEX_COUNT];
output(id = 1) vec3 out::norm;
output(id = 2) texture_t out::textures[TEX_COUNT];

void main()
{
vertex_t vtx = vertex.data[in::vertex_id];
drawdata_t draw = draws.data[in::draw_id];
out::position = camera.p * camera.v * draw.model * vec4(vtx.pos, 1.0f);
out::texc = vtx.texc;
out::norm = vtx.nrm;

for(uint i = 0; i < TEX_COUNT; i++)
{
Expand Down

0 comments on commit 53c3576

Please sign in to comment.