void Program::setAttributes( const VertexFormat& reference ) { int attributeCount = reference.attributeCount(); std::set<std::string> referenceAttributes; // Attribute der Referenz in eine Map schreiben (schneller zugriff über Name) for(int i = 0; i < attributeCount; ++i) { referenceAttributes.insert(reference.attribute(i).name()); } // Schauen welche Atribute es im Shader, aber nicht in der Referenz gibt for(std::map<std::string, int>::const_iterator i = m_AttributeSizes.begin(); i != m_AttributeSizes.end(); ++i) { if(referenceAttributes.count(i->first) == 0) { // i ist nicht in reference enthalten! // Das IST schlimm! LogError("Shader %s needs the vertex attribute %s, which the format does not provide.", toString().c_str(), i->first.c_str() ); return; } } for(int i = 0; i < attributeCount; ++i) { const VertexAttribute& attribute = reference.attribute(i); std::map<std::string, int>::const_iterator targetSizeIter = m_AttributeSizes.find(attribute.name()); if(targetSizeIter == m_AttributeSizes.end()) { Log("Vertex format %s has overhead to %s, because %s is not present in the shader.", reference.asString().c_str(), toString().c_str(), attribute.name() ); continue; } // Sind sie vielleicht unterschiedlich groß? if(attribute.dataType().componentCount() != targetSizeIter->second) { LogError("Vertex format %s is incomplatible to %s, because the shader needs %s to consist of %d instead of %d components.", reference.asString().c_str(), toString().c_str(), attribute.name(), targetSizeIter->second, attribute.dataType().componentCount() ); return; } glBindAttribLocation(m_Handle, i, attribute.name()); m_Dirty = true; } linkSilent(); }
void Context::setVertexFormat( const VertexFormat& format, void* data ) { int offset = 0; int formatAttributeCount = format.attributeCount(); for(int i = 0; i < formatAttributeCount; ++i) { const VertexAttribute& newAttribute = format.attribute(i); //if(m_Attributes[i] != newAttribute) // TODO: GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING und so { m_Attributes[i] = newAttribute; if(i >= m_ActiveAttributes) { // Enable .. glEnableVertexAttribArray(i); } // Setup .. glVertexAttribPointer( i, // the identifier newAttribute.dataType().componentCount(), // size (i.e. how many elements of type) ConvertToGL(newAttribute.dataType().primitveType()), // type newAttribute.isNormalized(), format.sizeInBytes(), // stride between each element of this attribute (void*)((long)data+offset) // offset from the beginning ); } offset += newAttribute.dataType().sizeInBytes(); } if(formatAttributeCount < m_ActiveAttributes) { for(int i = formatAttributeCount; i < m_ActiveAttributes; ++i) { // Disable .. glDisableVertexAttribArray(i); } } m_ActiveAttributes = formatAttributeCount; }