X-Git-Url: http://git.tdb.fi/?p=libs%2Fgl.git;a=blobdiff_plain;f=source%2Fglsl%2Fgenerate.cpp;h=3e53c1526daa88c43766dbfc4a019d267c317157;hp=53676c26784cf7d32709639fea843459e3cf4269;hb=f526938b407e061c7424adedc34af4d1ff687f90;hpb=a60a60fe29850ef8a5dc291ed70741eeb95d9e0b diff --git a/source/glsl/generate.cpp b/source/glsl/generate.cpp index 53676c26..3e53c152 100644 --- a/source/glsl/generate.cpp +++ b/source/glsl/generate.cpp @@ -1,3 +1,4 @@ +#include #include #include #include @@ -367,11 +368,43 @@ void VariableResolver::visit(MemberAccess &memacc) if(i!=strct->members.variables.end()) declaration = i->second; } + else if(BasicTypeDeclaration *basic = dynamic_cast(memacc.left->type)) + { + bool scalar_swizzle = ((basic->kind==BasicTypeDeclaration::INT || basic->kind==BasicTypeDeclaration::FLOAT) && memacc.member.size()==1); + bool vector_swizzle = (basic->kind==BasicTypeDeclaration::VECTOR && memacc.member.size()<=4); + if(scalar_swizzle || vector_swizzle) + { + static const char component_names[] = { 'x', 'r', 's', 'y', 'g', 't', 'z', 'b', 'p', 'w', 'a', 'q' }; + + bool ok = true; + UInt8 components[4] = { }; + for(unsigned i=0; (ok && isource = memacc.source; + swizzle->line = memacc.line; + swizzle->oper = memacc.oper; + swizzle->left = memacc.left; + swizzle->component_group = memacc.member; + swizzle->count = memacc.member.size(); + copy(components, components+memacc.member.size(), swizzle->components); + r_replacement_expr = swizzle; + } + } + } r_any_resolved |= (declaration!=memacc.declaration); memacc.declaration = declaration; } +void VariableResolver::visit(Swizzle &swizzle) +{ + visit_and_replace(swizzle.left); +} + void VariableResolver::visit(UnaryExpression &unary) { visit_and_replace(unary.expression); @@ -589,6 +622,20 @@ void ExpressionResolver::visit(MemberAccess &memacc) resolve(memacc, memacc.declaration->type_declaration, memacc.left->lvalue); } +void ExpressionResolver::visit(Swizzle &swizzle) +{ + TraversingVisitor::visit(swizzle); + + if(BasicTypeDeclaration *left_basic = dynamic_cast(swizzle.left->type)) + { + BasicTypeDeclaration *left_elem = get_element_type(*left_basic); + if(swizzle.count==1) + resolve(swizzle, left_elem, swizzle.left->lvalue); + else if(left_basic->kind==BasicTypeDeclaration::VECTOR && left_elem) + resolve(swizzle, find_type(*left_elem, left_basic->kind, swizzle.count), swizzle.left->lvalue); + } +} + void ExpressionResolver::visit(UnaryExpression &unary) { TraversingVisitor::visit(unary);