SDGeometryHandle compile_geometry(SDRenderMode mode, SDVec2* vertices, SDuint numVertices, SDuint* indices, SDuint numIndices) { kglt::MeshID new_mesh = stage()->new_mesh(); { auto mesh = stage()->mesh(new_mesh); auto submesh = mesh->new_submesh( stage()->get_material_with_alias("diffuse_render"), (mode == SD_RENDER_MODE_TRIANGLES) ? kglt::MESH_ARRANGEMENT_TRIANGLES : kglt::MESH_ARRANGEMENT_LINES, true ); for(SDuint i = 0; i < numVertices; ++i) { mesh->shared_data().position(vertices[i]); mesh->shared_data().diffuse(kglt::Colour::WHITE); mesh->shared_data().move_next(); } for(SDuint i = 0; i < numIndices; ++i) { mesh->submesh(submesh).index_data().index(indices[i]); } mesh->submesh(submesh).index_data().done(); mesh->shared_data().done(); } kglt::ActorID new_actor = stage()->new_actor(new_mesh); return new_actor.value(); }
void Debug::draw_line(const Vec3 &start, const Vec3 &end, const Colour &colour, double duration, bool depth_test) { auto mesh = stage_.mesh(mesh_); DebugElement element; element.submesh = mesh->new_submesh(material_, MESH_ARRANGEMENT_LINE_STRIP, /*shares_vertices=*/ false); element.colour = colour; element.duration = duration; element.depth_test = depth_test; element.type = DebugElementType::DET_LINE; auto& submesh = mesh->submesh(element.submesh); submesh.vertex_data().move_to_start(); submesh.vertex_data().position(start); submesh.vertex_data().diffuse(colour); submesh.vertex_data().move_next(); submesh.vertex_data().position(end); submesh.vertex_data().diffuse(colour); submesh.vertex_data().done(); submesh.index_data().index(0); submesh.index_data().index(1); submesh.index_data().done(); elements_.push_back(element); }
void Boid::enable_debug(bool value) { assert(actor_); Stage* stage = actor_->stage(); assert(stage); if(value) { if(!debug_mesh_) { debug_mesh_ = stage->new_mesh(); } auto mesh = stage->mesh(debug_mesh_).lock(); mesh->clear(); auto smi = mesh->new_submesh(kglt::MaterialID(), MESH_ARRANGEMENT_LINE_STRIP, false); normal_points_mesh_ = mesh->new_submesh(kglt::MaterialID(), MESH_ARRANGEMENT_POINTS, false); { auto mat = stage->material(mesh->submesh(normal_points_mesh_).material_id()); mat->technique().pass(0).set_point_size(5); } for(uint32_t i = 0; i < path_.length(); ++i) { mesh->submesh(smi).vertex_data().position(path_.point(i)); mesh->submesh(smi).vertex_data().diffuse(kglt::Colour::blue); mesh->submesh(smi).vertex_data().tex_coord0(kglt::Vec2()); mesh->submesh(smi).vertex_data().tex_coord1(kglt::Vec2()); mesh->submesh(smi).vertex_data().normal(kglt::Vec3()); mesh->submesh(smi).vertex_data().move_next(); mesh->submesh(smi).index_data().index(i); } mesh->submesh(smi).vertex_data().done(); mesh->submesh(smi).index_data().done(); if(!debug_actor_) { debug_actor_ = stage->new_actor(debug_mesh_); } } else { stage->delete_actor(debug_actor_); debug_actor_ = kglt::ActorID(); debug_mesh_ = kglt::MeshID(); } }
MeshID ResourceManagerImpl::new_mesh_from_vertices(const std::vector<Vec3> &vertices, MeshArrangement arrangement, bool garbage_collect) { //FIXME: THis is literally a copy/paste of the function above, we can templatize this MeshID m = new_mesh(garbage_collect); auto new_mesh = mesh(m); auto smi = new_mesh->new_submesh(arrangement); int i = 0; for(auto v: vertices) { new_mesh->shared_data().position(v); new_mesh->shared_data().diffuse(kglt::Colour::WHITE); new_mesh->shared_data().normal(kglt::Vec3()); new_mesh->shared_data().tex_coord0(kglt::Vec2()); new_mesh->shared_data().move_next(); new_mesh->submesh(smi)->index_data().index(i++); } new_mesh->shared_data().done(); new_mesh->submesh(smi)->index_data().done(); MeshManager::mark_as_uncollected(m); return m; }