Shape(const Program& prog, const ShapeBuilder& builder) : make_shape(builder) , shape_instr(make_shape.Instructions()) , shape_indices(make_shape.Indices()) , vbos(4) { // bind the VAO for the shape vao.Bind(); typename ShapeBuilder::VertexAttribs vert_attr_info; const GLchar* vert_attr_name[] = { "Position", "Normal", "Tangent", "TexCoord"}; for(int va = 0; va != 4; ++va) { const GLchar* name = vert_attr_name[va]; std::vector<GLfloat> data; auto getter = vert_attr_info.VertexAttribGetter(data, name); if(getter != nullptr) try { // bind the VBO for the vertex attribute vbos[va].Bind(Buffer::Target::Array); GLuint npv = getter(make_shape, data); // upload the data Buffer::Data(Buffer::Target::Array, data); // setup the vertex attribs array VertexArrayAttrib attr(prog, name); attr.Setup<GLfloat>(npv); attr.Enable(); } catch(Error&) { } } }
ShapeAnalyzerGraphData(const ShapeBuilder& builder) : _instr(builder.Instructions()) , _index(_adapt(builder.Indices())) , _main_va() , _main_vpv(builder.Positions(_main_va)) , _smooth_va() , _smooth_vpv(builder.Normals(_smooth_va)) , _eps(1.0e-9) { _initialize(); }
Shape(const Program& prog, const ShapeBuilder& builder) : make_shape(builder) , shape_instr(make_shape.Instructions(shapes::DrawMode::Default())) , edge_instr(make_shape.Instructions(shapes::DrawMode::Edges())) , shape_indices(make_shape.Indices(shapes::DrawMode::Default())) , edge_indices(make_shape.Indices(shapes::DrawMode::Edges())) , vbos(3) { // bind the VAO for the shape vao.Bind(); typename ShapeBuilder::VertexAttribs vert_attr_info; const GLuint nva = 3; const GLchar* vert_attr_name[nva] = { "Position", "Normal", "TexCoord" }; for(GLuint va=0; va!=nva; ++va) { const GLchar* name = vert_attr_name[va]; std::vector<GLfloat> data; auto getter = vert_attr_info.VertexAttribGetter(data, name); if(getter != nullptr) { // bind the VBO for the vertex attribute vbos[va].Bind(Buffer::Target::Array); GLuint n_per_vertex = getter(make_shape, data); // upload the data Buffer::Data(Buffer::Target::Array, data); // setup the vertex attribs array VertexArrayAttrib attr(prog, name); attr.Setup<GLfloat>(n_per_vertex); attr.Enable(); } } }
ShapeWrapperBase( Iterator names_begin, Iterator names_end, const ShapeBuilder& builder ): _face_winding(builder.FaceWinding()) , _shape_instr(builder.Instructions()) , _index_info(builder) , _vbos(std::distance(names_begin, names_end)+1) , _npvs(std::distance(names_begin, names_end)+1, 0) , _names(std::distance(names_begin, names_end)) { this->_init( builder, builder.Indices(), names_begin, names_end ); }
Shape(const Program& prog, const ShapeBuilder& builder) : make_shape(builder) , shape_instr(make_shape.Instructions()) , shape_indices(make_shape.Indices()) , nva(4) , vbos(nva+1) { vao.Bind(); typename ShapeBuilder::VertexAttribs vert_attr_info; const GLchar* vert_attr_name[] = { "Position", "Normal", "Tangent", "TexCoord" }; for(GLuint va=0; va!=nva; ++va) { const GLchar* name = vert_attr_name[va]; std::vector<GLfloat> data; auto getter = vert_attr_info.VertexAttribGetter(data, name); if(getter != nullptr) try { vbos[va].Bind(Buffer::Target::Array); GLuint npv = getter(make_shape, data); Buffer::Data(Buffer::Target::Array, data); VertexAttribArray attr(prog, name); attr.Setup<GLfloat>(npv); attr.Enable(); } catch(Error& error) { } } vbos[nva].Bind(Buffer::Target::ElementArray); Buffer::Data(Buffer::Target::ElementArray, shape_indices); shape_indices.clear(); }