diff --git a/src/modules/graphics/Mesh.cpp b/src/modules/graphics/Mesh.cpp index f2526ce4b..a534e8646 100644 --- a/src/modules/graphics/Mesh.cpp +++ b/src/modules/graphics/Mesh.cpp @@ -141,7 +141,12 @@ void Mesh::setupAttachedAttributes() if (getAttachedAttributeIndex(name) != -1) throw love::Exception("Duplicate vertex attribute name: %s", name.c_str()); - attachedAttributes.push_back({name, vertexBuffer, nullptr, name, (int) i, 0, STEP_PER_VERTEX, true}); + BuiltinVertexAttribute builtinattrib; + int builtinAttribIndex = -1; + if (getConstant(name.c_str(), builtinattrib)) + builtinAttribIndex = (int)builtinattrib; + + attachedAttributes.push_back({name, vertexBuffer, nullptr, name, (int) i, 0, STEP_PER_VERTEX, builtinAttribIndex, true}); } } @@ -168,6 +173,12 @@ void Mesh::finalizeAttribute(BufferAttribute &attrib) const if (indexInBuffer < 0) throw love::Exception("Buffer does not have a vertex attribute with name '%s'.", attrib.nameInBuffer.c_str()); + BuiltinVertexAttribute builtinattrib; + if (getConstant(attrib.name.c_str(), builtinattrib)) + attrib.builtinAttributeIndex = (int)builtinattrib; + else + attrib.builtinAttributeIndex = -1; + attrib.indexInBuffer = indexInBuffer; } @@ -593,14 +604,11 @@ void Mesh::drawInternal(Graphics *gfx, const Matrix4 &m, int instancecount, Buff continue; Buffer *buffer = attrib.buffer.get(); - int attributeindex = -1; + int attributeindex = attrib.builtinAttributeIndex; // If the attribute is one of the LOVE-defined ones, use the constant // attribute index for it, otherwise query the index from the shader. - BuiltinVertexAttribute builtinattrib; - if (getConstant(attrib.name.c_str(), builtinattrib)) - attributeindex = (int) builtinattrib; - else if (Shader::current) + if (attributeindex < 0 && Shader::current) attributeindex = Shader::current->getVertexAttributeIndex(attrib.name); if (attributeindex >= 0) diff --git a/src/modules/graphics/Mesh.h b/src/modules/graphics/Mesh.h index f2ee074f3..c99894d34 100644 --- a/src/modules/graphics/Mesh.h +++ b/src/modules/graphics/Mesh.h @@ -60,6 +60,7 @@ class Mesh : public Drawable int indexInBuffer; int startArrayIndex; AttributeStep step; + int builtinAttributeIndex; bool enabled; }; diff --git a/src/modules/graphics/SpriteBatch.cpp b/src/modules/graphics/SpriteBatch.cpp index 60fadf462..ff6dd3486 100644 --- a/src/modules/graphics/SpriteBatch.cpp +++ b/src/modules/graphics/SpriteBatch.cpp @@ -285,6 +285,12 @@ void SpriteBatch::attachAttribute(const std::string &name, Buffer *buffer, Mesh newattrib.buffer = buffer; newattrib.mesh = mesh; + BuiltinVertexAttribute builtinattrib; + if (getConstant(name.c_str(), builtinattrib)) + newattrib.builtinAttributeIndex = (int)builtinattrib; + else + newattrib.builtinAttributeIndex = -1; + attached_attributes[name] = newattrib; } @@ -355,14 +361,11 @@ void SpriteBatch::draw(Graphics *gfx, const Matrix4 &m) if (buffer->getArrayLength() < (size_t) next * 4) throw love::Exception("Buffer with attribute '%s' attached to this SpriteBatch has too few vertices", it.first.c_str()); - int attributeindex = -1; + int attributeindex = it.second.builtinAttributeIndex; // If the attribute is one of the LOVE-defined ones, use the constant // attribute index for it, otherwise query the index from the shader. - BuiltinVertexAttribute builtinattrib; - if (getConstant(it.first.c_str(), builtinattrib)) - attributeindex = (int) builtinattrib; - else if (Shader::current) + if (attributeindex < 0 && Shader::current) attributeindex = Shader::current->getVertexAttributeIndex(it.first); if (attributeindex >= 0) diff --git a/src/modules/graphics/SpriteBatch.h b/src/modules/graphics/SpriteBatch.h index dc9c924aa..cbcd52c98 100644 --- a/src/modules/graphics/SpriteBatch.h +++ b/src/modules/graphics/SpriteBatch.h @@ -113,6 +113,7 @@ class SpriteBatch : public Drawable StrongRef buffer; StrongRef mesh; int index; + int builtinAttributeIndex; }; /**