| 3208 | } |
| 3209 | |
| 3210 | ShaderVariable InterpretShaderVar(const ShaderConstant &elem, const byte *data, const byte *end) |
| 3211 | { |
| 3212 | ShaderVariable ret; |
| 3213 | |
| 3214 | ret.name = elem.name; |
| 3215 | ret.type = elem.type.baseType; |
| 3216 | ret.columns = qMin(elem.type.columns, uint8_t(4)); |
| 3217 | ret.rows = qMin(elem.type.rows, uint8_t(4)); |
| 3218 | |
| 3219 | ret.flags = elem.type.flags; |
| 3220 | |
| 3221 | if(elem.type.baseType != VarType::Enum && !elem.type.members.isEmpty()) |
| 3222 | { |
| 3223 | ret.rows = ret.columns = 0; |
| 3224 | |
| 3225 | if(elem.type.elements > 1 && elem.type.elements != ~0U) |
| 3226 | { |
| 3227 | rdcarray<ShaderVariable> arrayElements; |
| 3228 | |
| 3229 | for(uint32_t a = 0; a < elem.type.elements; a++) |
| 3230 | { |
| 3231 | rdcarray<ShaderVariable> members; |
| 3232 | |
| 3233 | for(size_t m = 0; m < elem.type.members.size(); m++) |
| 3234 | { |
| 3235 | const ShaderConstant &member = elem.type.members[m]; |
| 3236 | |
| 3237 | members.push_back(InterpretShaderVar(member, data + member.byteOffset, end)); |
| 3238 | } |
| 3239 | |
| 3240 | arrayElements.push_back(ret); |
| 3241 | arrayElements.back().name = QFormatStr("%1[%2]").arg(ret.name).arg(a); |
| 3242 | arrayElements.back().members = members; |
| 3243 | |
| 3244 | data += elem.type.arrayByteStride; |
| 3245 | } |
| 3246 | |
| 3247 | ret.members = arrayElements; |
| 3248 | } |
| 3249 | else |
| 3250 | { |
| 3251 | rdcarray<ShaderVariable> members; |
| 3252 | |
| 3253 | for(size_t m = 0; m < elem.type.members.size(); m++) |
| 3254 | { |
| 3255 | const ShaderConstant &member = elem.type.members[m]; |
| 3256 | |
| 3257 | members.push_back(InterpretShaderVar(member, data + member.byteOffset, end)); |
| 3258 | } |
| 3259 | |
| 3260 | ret.members = members; |
| 3261 | } |
| 3262 | } |
| 3263 | else if(elem.type.baseType == VarType::Struct && elem.type.members.isEmpty()) |
| 3264 | { |
| 3265 | } |
| 3266 | else if(elem.type.elements > 1 && elem.type.elements != ~0U) |
| 3267 | { |