diff --git a/include/vkcv/PushConstants.hpp b/include/vkcv/PushConstants.hpp
index e02e5e6995c9aa563cf24d2e1fe68f879b006a8e..8d441bfcb57807eedc94d4cf839f6e99729d1cbe 100644
--- a/include/vkcv/PushConstants.hpp
+++ b/include/vkcv/PushConstants.hpp
@@ -140,4 +140,24 @@ namespace vkcv {
 		return PushConstants(typeGuard<T>());
 	}
 	
+	template<typename T>
+	PushConstants pushConstants(const T& value) {
+		auto pc = pushConstants<T>();
+		pc.template appendDrawcall(value);
+		return pc;
+	}
+	
+	template<typename T>
+	PushConstants pushConstants(const std::vector<T>& values) {
+		auto pc = pushConstants<T>();
+		
+		for (const T& value : values) {
+			if (!(pc.template appendDrawcall(value))) {
+				break;
+			}
+		}
+		
+		return pc;
+	}
+	
 }
diff --git a/projects/first_triangle/src/main.cpp b/projects/first_triangle/src/main.cpp
index c3824b49702780775bbfc2f92af741ebfaaa0edd..bfbc9909cef71f2c05f91b4a73fa84303faa961c 100644
--- a/projects/first_triangle/src/main.cpp
+++ b/projects/first_triangle/src/main.cpp
@@ -100,9 +100,6 @@ int main(int argc, const char** argv) {
 		
 		cameraManager.update(0.000001 * static_cast<double>(deltatime.count()));
         glm::mat4 mvp = cameraManager.getActiveCamera().getMVP();
-
-		vkcv::PushConstants pushConstants = vkcv::pushConstants<glm::mat4>();
-		pushConstants.appendDrawcall(mvp);
 		
 		auto cmdStream = core.createCommandStream(vkcv::QueueType::Graphics);
 		core.setDebugLabel(cmdStream, "Render Commands");
@@ -111,7 +108,7 @@ int main(int argc, const char** argv) {
 			cmdStream,
 			trianglePass,
 			trianglePipeline,
-			pushConstants,
+			vkcv::pushConstants<glm::mat4>(mvp),
 			{ drawcall },
 			{ swapchainInput },
 			windowHandle);