Drawable::~Drawable() { if (vertex_format_) renderer_->DeleteVertexFormat(vertex_format_); if (vertex_buffer_) renderer_->DeleteVertexBuffer(vertex_buffer_); if (vertex_array_object_) renderer_->context()->DeleteVertexArrayObject(vertex_array_object_); FreeArrays(); }
void PRTHierarchyMapping::GetMapping( Mesh* renderMesh, Mesh* approxMesh, int* mappingIndices, float* mappingWeights) { mTree = new K3Tree(renderMesh, approxMesh); mTree->FillTreeWithData(); bool debug = false; InitArrays(); for(int i = 0; i < renderMesh->GetNumVertices(); ++i) { Vertex* vertices = renderMesh->GetVertices(); Vertex vertex = vertices[i]; if(i == 12314 || i == 12272 || i == 12266) { PD(L"mapping info for vertex ", i); PD(L"Blue, Point[{", vertex.pos.x); PD(L",", vertex.pos.y); PD(L",", vertex.pos.z); PD(L"}]"); mTree->SetDebug(true); debug = true; } else{ mTree->SetDebug(false); debug = false; } mTree->GetMapping(vertex, indices, weights); float sumOfWeights = 0; for(int k = 0; k < 3; ++k) { if(debug) { PD(L"nn: ", k); PD(L"index :", indices[k]); PD(L"weights :", weights[k]); } mappingIndices[(i*3) + k] = indices[k]; mappingWeights[(i*3) + k] = weights[k]; sumOfWeights += weights[k]; } if(sumOfWeights > 1.001f || sumOfWeights < 0.999f) { PD(L"sum of weights not 1"); } } FreeArrays(); }
void Drawable::MakeRenderable() { assert(!attribs_.empty()); renderer_->AddVertexFormat(vertex_format_, &attribs_[0], (u32)attribs_.size()); renderer_->context()->CheckForErrors(); renderer_->context()->GenVertexArrayObject(vertex_array_object_); renderer_->context()->BindVertexArrayObject(vertex_array_object_); renderer_->context()->CheckForErrors(); renderer_->AddVertexBuffer(vertex_buffer_, num_vertices_ * vertex_format_->vertex_size(), vertices_array_, sht::graphics::BufferUsage::kStaticDraw); renderer_->context()->CheckForErrors(); if (vertex_buffer_ == nullptr) { can_render_ = false; return; } // Free all data in memory FreeArrays(); // There is only one attribute const char* base = (char*)0; for (u32 i = 0; i < attribs_.size(); ++i) { const sht::graphics::VertexFormat::Attrib& vf_attrib = vertex_format_->generic(i); renderer_->context()->VertexAttribPointer(i, vf_attrib.size, sht::graphics::DataType::kFloat, vertex_format_->vertex_size(), base + vf_attrib.offset); renderer_->context()->CheckForErrors(); renderer_->context()->EnableVertexAttribArray(i); renderer_->context()->CheckForErrors(); } renderer_->context()->BindVertexArrayObject(0); renderer_->context()->CheckForErrors(); attribs_.clear(); attribs_.shrink_to_fit(); can_render_ = true; }