void ShaderProgram::setAttribute(GLint index, const Vector4<GLubyte> &v) { glVertexAttrib4ubv(index, &(v.x)); }
void GLGSRender::EnableVertexData(bool indexed_draw) { static u32 offset_list[m_vertex_count]; u32 cur_offset = 0; const u32 data_offset = indexed_draw ? 0 : m_draw_array_first; for(u32 i=0; i<m_vertex_count; ++i) { offset_list[i] = cur_offset; if(!m_vertex_data[i].IsEnabled() || !m_vertex_data[i].addr) continue; const size_t item_size = m_vertex_data[i].GetTypeSize() * m_vertex_data[i].size; const size_t data_size = m_vertex_data[i].data.size() - data_offset * item_size; const u32 pos = m_vdata.size(); cur_offset += data_size; m_vdata.resize(m_vdata.size() + data_size); memcpy(&m_vdata[pos], &m_vertex_data[i].data[data_offset * item_size], data_size); } m_vao.Create(); m_vao.Bind(); checkForGlError("initializing vao"); m_vbo.Create(indexed_draw ? 2 : 1); m_vbo.Bind(0); m_vbo.SetData(&m_vdata[0], m_vdata.size()); if(indexed_draw) { m_vbo.Bind(GL_ELEMENT_ARRAY_BUFFER, 1); m_vbo.SetData(GL_ELEMENT_ARRAY_BUFFER, &m_indexed_array.m_data[0], m_indexed_array.m_data.size()); } checkForGlError("initializing vbo"); #if DUMP_VERTEX_DATA rFile dump("VertexDataArray.dump", rFile::write); #endif for(u32 i=0; i<m_vertex_count; ++i) { if(!m_vertex_data[i].IsEnabled()) continue; #if DUMP_VERTEX_DATA dump.Write(wxString::Format("VertexData[%d]:\n", i)); switch(m_vertex_data[i].type) { case CELL_GCM_VERTEX_S1: for(u32 j = 0; j<m_vertex_data[i].data.size(); j+=2) { dump.Write(wxString::Format("%d\n", *(u16*)&m_vertex_data[i].data[j])); if(!(((j+2) / 2) % m_vertex_data[i].size)) dump.Write("\n"); } break; case CELL_GCM_VERTEX_F: for(u32 j = 0; j<m_vertex_data[i].data.size(); j+=4) { dump.Write(wxString::Format("%.01f\n", *(float*)&m_vertex_data[i].data[j])); if(!(((j+4) / 4) % m_vertex_data[i].size)) dump.Write("\n"); } break; case CELL_GCM_VERTEX_SF: for(u32 j = 0; j<m_vertex_data[i].data.size(); j+=2) { dump.Write(wxString::Format("%.01f\n", *(float*)&m_vertex_data[i].data[j])); if(!(((j+2) / 2) % m_vertex_data[i].size)) dump.Write("\n"); } break; case CELL_GCM_VERTEX_UB: for(u32 j = 0; j<m_vertex_data[i].data.size(); ++j) { dump.Write(wxString::Format("%d\n", m_vertex_data[i].data[j])); if(!((j+1) % m_vertex_data[i].size)) dump.Write("\n"); } break; case CELL_GCM_VERTEX_S32K: for(u32 j = 0; j<m_vertex_data[i].data.size(); j+=2) { dump.Write(wxString::Format("%d\n", *(u16*)&m_vertex_data[i].data[j])); if(!(((j+2) / 2) % m_vertex_data[i].size)) dump.Write("\n"); } break; // case CELL_GCM_VERTEX_CMP: case CELL_GCM_VERTEX_UB256: for(u32 j = 0; j<m_vertex_data[i].data.size(); ++j) { dump.Write(wxString::Format("%d\n", m_vertex_data[i].data[j])); if(!((j+1) % m_vertex_data[i].size)) dump.Write("\n"); } break; default: ConLog.Error("Bad cv type! %d", m_vertex_data[i].type); return; } dump.Write("\n"); #endif static const u32 gl_types[] = { GL_SHORT, GL_FLOAT, GL_HALF_FLOAT, GL_UNSIGNED_BYTE, GL_SHORT, GL_UNSIGNED_BYTE, }; static const bool gl_normalized[] = { true, false, false, true, false, false, }; if(m_vertex_data[i].type >= 1 && m_vertex_data[i].type <= 7) { if(!m_vertex_data[i].addr) { switch(m_vertex_data[i].type) { case CELL_GCM_VERTEX_S32K: case CELL_GCM_VERTEX_S1: switch(m_vertex_data[i].size) { case 1: glVertexAttrib1s(i, (GLshort&)m_vertex_data[i].data[0]); break; case 2: glVertexAttrib2sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; case 3: glVertexAttrib3sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; case 4: glVertexAttrib4sv(i, (GLshort*)&m_vertex_data[i].data[0]); break; } break; case CELL_GCM_VERTEX_F: switch(m_vertex_data[i].size) { case 1: glVertexAttrib1f(i, (GLfloat&)m_vertex_data[i].data[0]); break; case 2: glVertexAttrib2fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; case 3: glVertexAttrib3fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; case 4: glVertexAttrib4fv(i, (GLfloat*)&m_vertex_data[i].data[0]); break; } break; case CELL_GCM_VERTEX_CMP: case CELL_GCM_VERTEX_UB: glVertexAttrib4ubv(i, (GLubyte*)&m_vertex_data[i].data[0]); break; } checkForGlError("glVertexAttrib"); } else { u32 gltype = gl_types[m_vertex_data[i].type - 1]; bool normalized = gl_normalized[m_vertex_data[i].type - 1]; glEnableVertexAttribArray(i); checkForGlError("glEnableVertexAttribArray"); glVertexAttribPointer(i, m_vertex_data[i].size, gltype, normalized, 0, (void*)offset_list[i]); checkForGlError("glVertexAttribPointer"); } } } }
void shader_gl3::attribute(const char* name, const uchar4* arg1) const { A2E_CHECK_ATTRIBUTE_EXISTENCE(name); A2E_CHECK_ATTRIBUTE_TYPE(name, GL_FLOAT_VEC4); glVertexAttrib4ubv(A2E_SHADER_GET_ATTRIBUTE_POSITION(name), (GLubyte*)arg1); }