X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Freflect.cpp;h=e63553163c8435f23e2199effa17cc91eb5e52ee;hp=93d64e5fdb62aac1087d080efb37a0687fd99901;hb=3ffa465364a36477b81b1b644ae8d19ee3bac8c2;hpb=c701c8787cb19fbb6dc5b0bfae1a94e2b07dd549 diff --git a/source/glsl/reflect.cpp b/source/glsl/reflect.cpp index 93d64e5f..e6355316 100644 --- a/source/glsl/reflect.cpp +++ b/source/glsl/reflect.cpp @@ -51,6 +51,36 @@ T *TypeComparer::multi_visit(T &node) return 0; } +void TypeComparer::visit(Literal &literal) +{ + if(Literal *lit1 = multi_visit(literal)) + { + if(!lit1->type || !literal.type) + r_result = false; + else + { + compare(*lit1->type, *literal.type); + if(r_result) + r_result = (literal.value.check_type() && lit1->value.value()==literal.value.value()); + } + } +} + +void TypeComparer::visit(VariableReference &var) +{ + if(VariableReference *var1 = multi_visit(var)) + { + if(!var1->declaration || !var.declaration) + r_result = false; + else if(!var1->declaration->constant || !var.declaration->constant) + r_result = false; + else if(!var1->declaration->init_expression || !var.declaration->init_expression) + r_result = false; + else + compare(*var1->declaration->init_expression, *var.declaration->init_expression); + } +} + void TypeComparer::visit(BasicTypeDeclaration &basic) { if(BasicTypeDeclaration *basic1 = multi_visit(basic)) @@ -106,8 +136,13 @@ void TypeComparer::visit(VariableDeclaration &var) r_result = false; else { - // TODO Compare array sizes - if(var1->type_declaration!=var.type_declaration) + if(var1->array) + { + r_result = false; + if(var1->array_size && var.array_size) + compare(*var1->array_size, *var.array_size); + } + if(r_result && var1->type_declaration!=var.type_declaration) compare(*var1->type_declaration, *var.type_declaration); // TODO Compare layout qualifiers for interface block members }