static VALUE gl_VertexAttribPointerNV(VALUE obj,VALUE arg1,VALUE arg2,VALUE arg3,VALUE arg4,VALUE arg5) { GLuint index; GLuint size; GLenum type; GLsizei stride; LOAD_GL_FUNC(glVertexAttribPointerNV, "GL_NV_vertex_program"); index = (GLuint)NUM2UINT(arg1); size = (GLuint)NUM2UINT(arg2); type = (GLenum)NUM2INT(arg3); stride = (GLsizei)NUM2UINT(arg4); if (index>_MAX_VERTEX_ATTRIBS) rb_raise(rb_eArgError, "Index too large, maximum allowed value '%i'",_MAX_VERTEX_ATTRIBS); if (CheckBufferBinding(GL_ARRAY_BUFFER_BINDING)) { g_VertexAttrib_ptr[index] = arg5; fptr_glVertexAttribPointerNV(index,size,type,stride,(GLvoid *)NUM2LONG(arg5)); } else { VALUE data; data = pack_array_or_pass_string(type,arg5); rb_str_freeze(data); g_VertexAttrib_ptr[index] = data; fptr_glVertexAttribPointerNV(index,size,type,stride,(GLvoid *)RSTRING_PTR(data)); } CHECK_GLERROR_FROM("glVertexAttribPointerNV"); return Qnil; }
void VertexManager::CommitBuffer(u32 num_vertices, u32 vertex_stride, u32 num_indices, u32* out_base_vertex, u32* out_base_index) { u32 vertex_data_size = num_vertices * vertex_stride; u32 index_data_size = num_indices * sizeof(u16); *out_base_vertex = vertex_stride > 0 ? (m_vertex_buffer->GetCurrentOffset() / vertex_stride) : 0; *out_base_index = m_index_buffer->GetCurrentOffset() / sizeof(u16); CheckBufferBinding(); m_vertex_buffer->Unmap(vertex_data_size); m_index_buffer->Unmap(index_data_size); ADDSTAT(stats.thisFrame.bytesVertexStreamed, vertex_data_size); ADDSTAT(stats.thisFrame.bytesIndexStreamed, index_data_size); }
void VertexManager::ResetBuffer(u32 vertex_stride, bool cull_all) { if (cull_all) { // This buffer isn't getting sent to the GPU. Just allocate it on the cpu. m_cur_buffer_pointer = m_base_buffer_pointer = m_cpu_v_buffer.data(); m_end_buffer_pointer = m_base_buffer_pointer + m_cpu_v_buffer.size(); IndexGenerator::Start((u16*)m_cpu_i_buffer.data()); } else { CheckBufferBinding(); auto buffer = m_vertex_buffer->Map(MAXVBUFFERSIZE, vertex_stride); m_cur_buffer_pointer = m_base_buffer_pointer = buffer.first; m_end_buffer_pointer = buffer.first + MAXVBUFFERSIZE; buffer = m_index_buffer->Map(MAXIBUFFERSIZE * sizeof(u16)); IndexGenerator::Start((u16*)buffer.first); } }