| 142 | //////////////////////////////// |
| 143 | |
| 144 | static void GenerateUniformBuffer(HRenderContext render_context, int max_lights) |
| 145 | { |
| 146 | /* |
| 147 | struct Light |
| 148 | { |
| 149 | vec4 position; // xyz: position, w: unused |
| 150 | vec4 color; // RGBA (matches LightParams order) |
| 151 | vec4 direction_range; // xyz: normalized direction; w: range |
| 152 | vec4 params; // x: type (0 dir, 1 point, 2 spot; matches dmRender::LightType) |
| 153 | // y: intensity |
| 154 | // z: innerConeAngle (radians, spot only) |
| 155 | // w: outerConeAngle (radians, spot only) |
| 156 | }; |
| 157 | uniform LightBuffer |
| 158 | { |
| 159 | vec4 lights_count; // x: number of active lights |
| 160 | Light lights[MAX_LIGHTS]; |
| 161 | }; |
| 162 | */ |
| 163 | |
| 164 | dmGraphics::ShaderResourceMember light_buffer_members[2]; |
| 165 | dmGraphics::ShaderResourceMember light_members[4]; |
| 166 | dmGraphics::ShaderResourceTypeInfo light_types[2]; |
| 167 | |
| 168 | // Ensure all fields (including bitfields) are initialized |
| 169 | memset(light_buffer_members, 0, sizeof(light_buffer_members)); |
| 170 | memset(light_members, 0, sizeof(light_members)); |
| 171 | memset(light_types, 0, sizeof(light_types)); |
| 172 | |
| 173 | // lights_count (vec4) |
| 174 | light_buffer_members[0].m_Name = (char*)"lights_count"; |
| 175 | light_buffer_members[0].m_NameHash = dmHashString64("lights_count"); |
| 176 | light_buffer_members[0].m_Type.m_ShaderType = dmGraphics::ShaderDesc::SHADER_TYPE_VEC4; |
| 177 | light_buffer_members[0].m_Type.m_UseTypeIndex = 0; |
| 178 | light_buffer_members[0].m_ElementCount = 1; |
| 179 | // lights |
| 180 | light_buffer_members[1].m_Name = (char*)"lights"; |
| 181 | light_buffer_members[1].m_NameHash = dmHashString64("lights"); |
| 182 | light_buffer_members[1].m_Type.m_ShaderType = dmGraphics::ShaderDesc::SHADER_TYPE_FLOAT; |
| 183 | light_buffer_members[1].m_ElementCount = max_lights; |
| 184 | light_buffer_members[1].m_Type.m_TypeIndex = 1; // index into ShaderResourceTypeInfo[] |
| 185 | light_buffer_members[1].m_Type.m_UseTypeIndex = 1; |
| 186 | |
| 187 | // vec4 position |
| 188 | light_members[0].m_Name = (char*)"position"; |
| 189 | light_members[0].m_NameHash = dmHashString64("position"); |
| 190 | light_members[0].m_Type.m_ShaderType = dmGraphics::ShaderDesc::SHADER_TYPE_VEC4; |
| 191 | light_members[0].m_Type.m_UseTypeIndex = 0; |
| 192 | light_members[0].m_ElementCount = 1; |
| 193 | // vec4 color |
| 194 | light_members[1].m_Name = (char*)"color"; |
| 195 | light_members[1].m_NameHash = dmHashString64("color"); |
| 196 | light_members[1].m_Type.m_ShaderType = dmGraphics::ShaderDesc::SHADER_TYPE_VEC4; |
| 197 | light_members[1].m_Type.m_UseTypeIndex = 0; |
| 198 | light_members[1].m_ElementCount = 1; |
| 199 | // vec4 direction (xyz: direction, w: range) |
| 200 | light_members[2].m_Name = (char*)"direction_range"; |
| 201 | light_members[2].m_NameHash = dmHashString64("direction_range"); |
no test coverage detected