# HG changeset patch # User sam # Date 1716208487 -25200 # Node ID f7802c5069ce13d0fcf59789966b7dbdd17fc81e # Parent 5a8713d0afd529068b5cea39fedaa5385285cfb2 did: some trivial renaming diff -r 5a8713d0afd5 -r f7802c5069ce semicongine/mesh.nim --- a/semicongine/mesh.nim Mon May 20 17:53:01 2024 +0700 +++ b/semicongine/mesh.nim Mon May 20 19:34:47 2024 +0700 @@ -382,6 +382,11 @@ proc clearDirtyAttributes*(mesh: var MeshObject) = mesh.dirtyAttributes.reset +proc setShaderMaterialIndices*(mesh: var MeshObject, shadername: string, values: seq[uint16], attributeName = MATERIALINDEX_ATTRIBUTE) = + let indexAttribute = shadername & "_" & attributeName + assert values.len == mesh.instanceCount, &"Mesh {mesh}: While trying to set shader material indices for shader '{shadername}': indices have len {values.len}, but instance count is {mesh.instanceCount}" + mesh[indexAttribute] = values + # MESH-TOOLS proc transform*[T: GPUType](mesh: var MeshObject, attribute: string, transform: Mat4) = diff -r 5a8713d0afd5 -r f7802c5069ce semicongine/renderer.nim --- a/semicongine/renderer.nim Mon May 20 17:53:01 2024 +0700 +++ b/semicongine/renderer.nim Mon May 20 19:34:47 2024 +0700 @@ -222,28 +222,28 @@ var uploadedTextures: Table[Texture, VulkanTexture] for (materialType, shaderPipeline) in sceneShaders: # gather textures - for texture in shaderPipeline.samplers: - scenedata.shaderData[shaderPipeline.vk].textures[texture.name] = newSeq[VulkanTexture]() - if scene.shaderGlobals.contains(texture.name): - for textureValue in scene.shaderGlobals[texture.name][Texture][]: + for textureAttribute in shaderPipeline.samplers: + scenedata.shaderData[shaderPipeline.vk].textures[textureAttribute.name] = newSeq[VulkanTexture]() + if scene.shaderGlobals.contains(textureAttribute.name): + for textureValue in scene.shaderGlobals[textureAttribute.name][Texture][]: if not uploadedTextures.contains(textureValue): uploadedTextures[textureValue] = renderer.device.uploadTexture(renderer.queue, textureValue) - scenedata.shaderData[shaderPipeline.vk].textures[texture.name].add uploadedTextures[textureValue] + scenedata.shaderData[shaderPipeline.vk].textures[textureAttribute.name].add uploadedTextures[textureValue] else: var foundTexture = false for material in scene.getMaterials(materialType): - if material.hasMatchingAttribute(texture): + if material.hasMatchingAttribute(textureAttribute): foundTexture = true - let value = material[texture.name, Texture][] - assert value.len == 1, &"Mesh material attribute '{texture.name}' has texture-array, but only single textures are allowed" + let value = material[textureAttribute.name, Texture][] + assert value.len == 1, &"Mesh material attribute '{textureAttribute.name}' has texture-array, but only single textures are allowed" if not uploadedTextures.contains(value[0]): uploadedTextures[value[0]] = renderer.device.uploadTexture(renderer.queue, value[0]) - scenedata.shaderData[shaderPipeline.vk].textures[texture.name].add uploadedTextures[value[0]] - assert foundTexture, &"No texture found in shaderGlobals or materials for '{texture.name}'" - let nTextures = scenedata.shaderData[shaderPipeline.vk].textures[texture.name].len.uint32 - assert (texture.arrayCount == 0 and nTextures == 1) or texture.arrayCount >= nTextures, &"Shader assigned to render '{materialType}' expected {texture.arrayCount} textures for '{texture.name}' but got {nTextures}" - if texture.arrayCount < nTextures: - warn &"Shader assigned to render '{materialType}' expected {texture.arrayCount} textures for '{texture.name}' but got {nTextures}" + scenedata.shaderData[shaderPipeline.vk].textures[textureAttribute.name].add uploadedTextures[value[0]] + assert foundTexture, &"No texture found in shaderGlobals or materials for '{textureAttribute.name}'" + let nTextures = scenedata.shaderData[shaderPipeline.vk].textures[textureAttribute.name].len.uint32 + assert (textureAttribute.arrayCount == 0 and nTextures == 1) or textureAttribute.arrayCount >= nTextures, &"Shader assigned to render '{materialType}' expected {textureAttribute.arrayCount} textures for '{textureAttribute.name}' but got {nTextures}" + if textureAttribute.arrayCount < nTextures: + warn &"Shader assigned to render '{materialType}' expected {textureAttribute.arrayCount} textures for '{textureAttribute.name}' but got {nTextures}" # gather uniform sizes var uniformBufferSize = 0'u64 diff -r 5a8713d0afd5 -r f7802c5069ce semicongine/text.nim --- a/semicongine/text.nim Mon May 20 17:53:01 2024 +0700 +++ b/semicongine/text.nim Mon May 20 19:34:47 2024 +0700 @@ -13,7 +13,7 @@ SPACE = Rune(' ') # font shader - MAX_TEXT_MATERIALS = 10 + MAX_TEXT_MATERIALS = 100 # need for every different font AND color SHADER_ATTRIB_PREFIX = "semicon_text_" POSITION_ATTRIB = SHADER_ATTRIB_PREFIX & "position" UV_ATTRIB = SHADER_ATTRIB_PREFIX & "uv" @@ -254,8 +254,7 @@ result.mesh = newMesh(positions = positions, indices = indices, uvs = uvs, name = &"text-{instanceCounter}") result.mesh[].renameAttribute("position", POSITION_ATTRIB) result.mesh[].renameAttribute("uv", UV_ATTRIB) - result.mesh.material = initMaterialData( - theType = TEXT_MATERIAL_TYPE, + result.mesh.material = TEXT_MATERIAL_TYPE.initMaterialData( name = font.name & " text", attributes = {"fontAtlas": initDataList(@[font.fontAtlas]), "color": initDataList(@[color])}, )