Mercurial > games > semicongine
changeset 324:cbfe96272205
add: first complete working version of multiple materials and shaders per scene, yipie :)
author | Sam <sam@basx.dev> |
---|---|
date | Sat, 19 Aug 2023 23:30:25 +0700 |
parents | 9defff46da48 |
children | 0c3f4f6f1aa2 |
files | src/semicongine/mesh.nim tests/test_vulkan_wrapper.nim |
diffstat | 2 files changed, 19 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/src/semicongine/mesh.nim Sat Aug 19 22:24:06 2023 +0700 +++ b/src/semicongine/mesh.nim Sat Aug 19 23:30:25 2023 +0700 @@ -236,8 +236,10 @@ proc updateAttributeData*[T: GPUType|int|uint|float](mesh: Mesh, attribute: string, data: seq[T]) = if mesh.vertexData.contains(attribute): + assert data.len < mesh.vertexData[attribute].len setValues(mesh.vertexData[attribute], data) elif mesh.instanceData.contains(attribute): + assert data.len < mesh.instanceData[attribute].len setValues(mesh.instanceData[attribute], data) else: raise newException(Exception, &"Attribute {attribute} is not defined for mesh {mesh}") @@ -245,8 +247,10 @@ proc updateAttributeData*[T: GPUType|int|uint|float](mesh: Mesh, attribute: string, i: uint32, value: T) = if mesh.vertexData.contains(attribute): + assert i < mesh.vertexData[attribute].len setValue(mesh.vertexData[attribute], i, value) elif mesh.instanceData.contains(attribute): + assert i < mesh.instanceData[attribute].len setValue(mesh.instanceData[attribute], i, value) else: raise newException(Exception, &"Attribute {attribute} is not defined for mesh {mesh}")
--- a/tests/test_vulkan_wrapper.nim Sat Aug 19 22:24:06 2023 +0700 +++ b/tests/test_vulkan_wrapper.nim Sat Aug 19 23:30:25 2023 +0700 @@ -41,7 +41,7 @@ name: "mat3", materialType: "my_special_material", constants: { - "colors": toGPUValue(newVec4f(0.5, 0.5, 0)) + "color": toGPUValue(newVec4f(0.5, 0.5, 0)) }.toTable ) @@ -155,7 +155,7 @@ # INIT RENDERER: const - shaderConfiguration = createShaderConfiguration( + shaderConfiguration1 = createShaderConfiguration( inputs=[ attr[Vec3f]("position", memoryPerformanceHint=PreferFastRead), attr[Vec4f]("color", memoryPerformanceHint=PreferFastWrite), @@ -174,9 +174,20 @@ vertexCode="""gl_Position = vec4(position + translate, 1.0); outcolor = color; materialIndexOut = materialIndex;""", fragmentCode="color = texture(my_little_texture[materialIndexOut], outcolor.xy) * 0.5 + outcolor * 0.5;", ) + shaderConfiguration2 = createShaderConfiguration( + inputs=[ + attr[Vec3f]("position", memoryPerformanceHint=PreferFastRead), + attr[Vec3f]("translate", perInstance=true), + ], + intermediates=[attr[Vec4f]("outcolor")], + outputs=[attr[Vec4f]("color")], + uniforms=[attr[Vec4f]("color")], + vertexCode="""gl_Position = vec4(position + translate, 1.0); outcolor = Uniforms.color;""", + fragmentCode="color = outcolor;", + ) engine.initRenderer({ - "my_material": shaderConfiguration, - "my_special_material": shaderConfiguration, + "my_material": shaderConfiguration1, + "my_special_material": shaderConfiguration2, }.toTable) # INIT SCENES