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 |