Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
1051 chris 1
package com.gebauz.bauzoid.graphics.shader;
2
 
3
public class Technique
4
{
5
        /** Connector class between Effect variables and Techniques.
6
         *
7
         * This class is used to store the actual shader's uniform handles, as well as a reference
8
         * to the actual Effect Variable to obtain the current value.
9
         *
10
         */
11
        public class TechniqueVariable
12
        {
13
                private ShaderUniform mUniform = null;
14
                private Effect.Variable mVariable = null;
15
 
16
                public TechniqueVariable(Effect.Variable var, ShaderUniform uniform)
17
                {
18
                        mVariable = var;
19
                        mUniform = uniform;
20
                }
21
 
22
                public void apply()
23
                {
24
                        // apply shader variable value
25
                        mVariable.apply(mUniform);
26
                }
27
 
28
        };
29
 
30
        private String mName;
31
 
32
        private Effect mEffect = null;
33
        private ShaderProgram mShader = null;
34
        private TechniqueVariable[] mTechniqueVariables = null;
35
 
36
        /** Constructor. */
37
        public Technique(Effect effect, String name, ShaderProgram shader)
38
        {
39
                mEffect = effect;
40
                mShader = shader;
41
                mName = name;
42
        }
43
 
44
        /** Destroy internal data. */
45
        public void dispose()
46
        {
47
                if (mShader != null)
48
                {
49
                        mShader.dispose();
50
                        mShader = null;
51
                }
52
        }
53
 
54
        /** Create the bindings of TechniqueVariables to actual Effect Variables. */
55
        public void connectVariables()
56
        {
57
                if (mShader == null)
58
                        return;
59
 
60
                // First, collect shader uniforms
61
                ShaderUniform[] uniforms = new ShaderUniform[mEffect.getVariableCount()];
62
                int existingUniformCount = 0;
63
 
64
                for (int i = 0; i < uniforms.length; i++)
65
                {
66
                        uniforms[i] = mShader.getUniform(mEffect.getVariable(i).getName());
67
                        if (uniforms[i] != null)
68
                                existingUniformCount++;
69
                }
70
 
71
                // Create actual connections
72
                mTechniqueVariables = new TechniqueVariable[existingUniformCount];
73
                int currentTechVar = 0;
74
                int nextFreeTextureStage = 0;
75
 
76
                for (int i = 0; i < uniforms.length; i++)
77
                {
78
                        if (uniforms[i] != null)
79
                        {
80
                                Effect.Variable var = mEffect.getVariable(i);
81
 
82
                                // Existing connection
83
                                mTechniqueVariables[currentTechVar] = new TechniqueVariable(var, uniforms[i]);
84
 
85
                                // if it's a texture, connect also the texture stage to use 
86
                                if ((var.getType() == Effect.Variable.TYPE_TEXTURE2D) ||
87
                                        (var.getType() == Effect.Variable.TYPE_TEXTURE3D) ||
88
                                        (var.getType() == Effect.Variable.TYPE_TEXTURECUBE))
89
                                {
90
                                        Effect.VariableTexture texVar = (Effect.VariableTexture)var;
91
                                        texVar.setTextureStage(nextFreeTextureStage);
92
                                        nextFreeTextureStage++;
93
                                }
94
 
95
                                currentTechVar++;
96
                        }
97
                }              
98
        }
99
 
100
        /** Activate technique. */
101
        public void activate()
102
        {
103
                if (mShader != null)
104
                {
105
                        mShader.activate();
106
                }
107
 
108
                if (mTechniqueVariables != null)
109
                {
110
                        for (TechniqueVariable v : mTechniqueVariables)
111
                        {
112
                                v.apply();
113
                        }
114
                }
115
        }
116
 
117
        /** Deactivate technique. */
118
        public void deactivate()
119
        {
120
                if (mShader != null)
121
                {
122
                        mShader.deactivate();
123
                }
124
        }
125
 
126
        /** Obtain name. */
127
        public final String getName()
128
        {
129
                return mName;
130
        }
131
}
132
 
133
 
134