ProgramVertexFixedFunction.java revision 9c9ad3f8c218954e46aab81f9af7834cea5675ca
1b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk/* 2b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * Copyright (C) 2008 The Android Open Source Project 3b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * 4b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * Licensed under the Apache License, Version 2.0 (the "License"); 5b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * you may not use this file except in compliance with the License. 6b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * You may obtain a copy of the License at 7b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * 8b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * http://www.apache.org/licenses/LICENSE-2.0 9b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * 10b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * Unless required by applicable law or agreed to in writing, software 11b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * distributed under the License is distributed on an "AS IS" BASIS, 12b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * See the License for the specific language governing permissions and 14b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * limitations under the License. 15b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk */ 16b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 17b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukpackage android.renderscript; 18b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 19b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 20b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukimport android.graphics.Matrix; 21b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukimport android.util.Log; 22b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 23b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 249c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 25df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * ProgramVertexFixedFunction is a helper class that provides a 26df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * simple way to create a fixed function emulation vertex shader 27df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * without writing any GLSL code. 28b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk * 29b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk **/ 30b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchoukpublic class ProgramVertexFixedFunction extends ProgramVertex { 31b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 32b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ProgramVertexFixedFunction(int id, RenderScript rs) { 33b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk super(id, rs); 34b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 35b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 369c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 37df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Binds the constant buffer containing fixed function emulation 38df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * matrices 39df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 40df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param va allocation containing fixed function matrices 41df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 42b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public void bindConstants(Constants va) { 43b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mRS.validate(); 44b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk bindConstants(va.getAllocation(), 0); 45b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 46b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 47b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk static class InternalBuilder extends BaseProgramBuilder { 48b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public InternalBuilder(RenderScript rs) { 49b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk super(rs); 50b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 51b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 52b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public InternalBuilder addInput(Element e) throws IllegalStateException { 53b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk // Should check for consistant and non-conflicting names... 54b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if(mInputCount >= MAX_INPUT) { 55b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk throw new RSIllegalArgumentException("Max input count exceeded."); 56b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 57b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (e.isComplex()) { 58b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk throw new RSIllegalArgumentException("Complex elements not allowed."); 59b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 60b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mInputs[mInputCount++] = e; 61b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 62b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 63b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 649c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 65df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates ProgramVertexFixedFunction from the current state of 66df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * the builder 67df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 68df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @return ProgramVertexFixedFunction 69df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 70b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public ProgramVertexFixedFunction create() { 71b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mRS.validate(); 72b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int[] tmp = new int[(mInputCount + mOutputCount + mConstantCount + mTextureCount) * 2]; 732123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk String[] texNames = new String[mTextureCount]; 74b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk int idx = 0; 75b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 76b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mInputCount; i++) { 77b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.INPUT.mID; 78e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams tmp[idx++] = mInputs[i].getID(mRS); 79b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 80b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mOutputCount; i++) { 81b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.OUTPUT.mID; 82e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams tmp[idx++] = mOutputs[i].getID(mRS); 83b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 84b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mConstantCount; i++) { 85b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.CONSTANT.mID; 86e07694b24f7d12d72b084b6651356681ebd0efd6Jason Sams tmp[idx++] = mConstants[i].getID(mRS); 87b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 88b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for (int i=0; i < mTextureCount; i++) { 89b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = ProgramParam.TEXTURE_TYPE.mID; 90b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk tmp[idx++] = mTextureTypes[i].mID; 912123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk texNames[i] = mTextureNames[i]; 92b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 93b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 942123b46ba85adb2cfb78068f8368e830640118d3Alex Sakhartchouk int id = mRS.nProgramVertexCreate(mShader, texNames, tmp); 95b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk ProgramVertexFixedFunction pv = new ProgramVertexFixedFunction(id, mRS); 96b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk initProgram(pv); 97b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return pv; 98b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 99b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 100b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 101b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public static class Builder { 102b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk boolean mTextureMatrixEnable; 103b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk String mShader; 104b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk RenderScript mRS; 105b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 1069c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 107df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates a builder for fixed function vertex program 108df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 109f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * @param rs Context to which the program will belong. 110df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 111b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder(RenderScript rs) { 112b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mRS = rs; 113b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 114b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 1159c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 116df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Specifies whether texture matrix calculations are to be added 117df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * to the shader 118df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 119df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 120b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Builder setTextureMatrixEnable(boolean enable) { 121b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mTextureMatrixEnable = enable; 122b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return this; 123b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 124b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk static Type getConstantInputType(RenderScript rs) { 125b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Element.Builder b = new Element.Builder(rs); 126b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.MATRIX4X4(rs), "MV"); 127b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.MATRIX4X4(rs), "P"); 128b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.MATRIX4X4(rs), "TexMatrix"); 129b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.MATRIX4X4(rs), "MVP"); 130b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 131b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Type.Builder typeBuilder = new Type.Builder(rs, b.create()); 132b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk typeBuilder.setX(1); 133b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return typeBuilder.create(); 134b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 135b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 136b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk private void buildShaderString() { 137b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 138b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader = "//rs_shader_internal\n"; 139b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "varying vec4 varColor;\n"; 140b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "varying vec2 varTex0;\n"; 141b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 142b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "void main() {\n"; 143b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " gl_Position = UNI_MVP * ATTRIB_position;\n"; 144b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " gl_PointSize = 1.0;\n"; 145b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 146b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " varColor = ATTRIB_color;\n"; 147b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk if (mTextureMatrixEnable) { 148b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " varTex0 = (UNI_TexMatrix * vec4(ATTRIB_texture0, 0.0, 1.0)).xy;\n"; 149b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } else { 150b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += " varTex0 = ATTRIB_texture0;\n"; 151b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 152b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mShader += "}\n"; 153b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 154b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 1559c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 156df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Creates ProgramVertexFixedFunction from the current state of 157df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * the builder 158df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 159df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @return Fixed function emulation ProgramVertex 160df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 161b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public ProgramVertexFixedFunction create() { 162b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk buildShaderString(); 163b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 164b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk InternalBuilder sb = new InternalBuilder(mRS); 165b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.setShader(mShader); 166b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.addConstant(getConstantInputType(mRS)); 167b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 168b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Element.Builder b = new Element.Builder(mRS); 169b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.F32_4(mRS), "position"); 170b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.F32_4(mRS), "color"); 171b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.F32_3(mRS), "normal"); 172b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk b.add(Element.F32_2(mRS), "texture0"); 173b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk sb.addInput(b.create()); 174b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 175b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return sb.create(); 176b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 177b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 178b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 1799c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 180df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Helper class to store modelview, projection and texture 181df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * matrices for ProgramVertexFixedFunction 182df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 183df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 184b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public static class Constants { 185b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk static final int MODELVIEW_OFFSET = 0; 186b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk static final int PROJECTION_OFFSET = 16; 187b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk static final int TEXTURE_OFFSET = 32; 188b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 189b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Matrix4f mModel; 190b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Matrix4f mProjection; 191b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Matrix4f mTexture; 192b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 193b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Allocation mAlloc; 194b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Allocation getAllocation() { 195b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk return mAlloc; 196b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 197b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk private FieldPacker mIOBuffer; 198b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 1999c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 200f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * Creates a buffer to store fixed function emulation matrices 201df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 202f5c876e82d7cc647ba94d29eb914e64b7977c303Alex Sakhartchouk * @param rs Context to which the allocation will belong. 203df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk **/ 204b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public Constants(RenderScript rs) { 205b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk Type constInputType = ProgramVertexFixedFunction.Builder.getConstantInputType(rs); 206b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mAlloc = Allocation.createTyped(rs, constInputType); 207918e840628a0b40a95fd42618f604ea5a44aebaeAlex Sakhartchouk int bufferSize = constInputType.getElement().getBytesSize()* 208b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk constInputType.getCount(); 209b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mIOBuffer = new FieldPacker(bufferSize); 210b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mModel = new Matrix4f(); 211b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mProjection = new Matrix4f(); 212b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mTexture = new Matrix4f(); 213b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk setModelview(new Matrix4f()); 214b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk setProjection(new Matrix4f()); 215b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk setTexture(new Matrix4f()); 216b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 217b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2189c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 219df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Forces deallocation of memory backing the contant matrices. 220df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Normally, this is unnecessary and will be garbage collected 221df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 222df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 223b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public void destroy() { 224b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mAlloc.destroy(); 225b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mAlloc = null; 226b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 227b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 228b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk private void addToBuffer(int offset, Matrix4f m) { 229b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mIOBuffer.reset(offset); 230b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk for(int i = 0; i < 16; i ++) { 231b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mIOBuffer.addF32(m.mMat[i]); 232b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 233b97b251c26b801b26f2630e3a2e3f93e4088f2c5Jason Sams mAlloc.setFromFieldPacker(0, mIOBuffer); 234b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 235b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2369c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 237df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Sets the modelview matrix in the fixed function matrix buffer 238df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 239df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param m modelview matrix 240df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 241b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public void setModelview(Matrix4f m) { 242b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mModel.load(m); 243b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk addToBuffer(MODELVIEW_OFFSET*4, m); 244b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 245b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2469c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 247df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Sets the projection matrix in the fixed function matrix buffer 248df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 249df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param m projection matrix 250df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 251b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public void setProjection(Matrix4f m) { 252b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mProjection.load(m); 253b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk addToBuffer(PROJECTION_OFFSET*4, m); 254b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 255b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk 2569c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 257df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Sets the texture matrix in the fixed function matrix buffer. 258df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * Texture matrix must be enabled in the 259df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * ProgramVertexFixedFunction builder for the shader to utilize 260df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * it. 261df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * 262df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk * @param m modelview matrix 263df27202debdc2573b7882405010fba31ee4d46e6Alex Sakhartchouk */ 264b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk public void setTexture(Matrix4f m) { 265b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk mTexture.load(m); 266b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk addToBuffer(TEXTURE_OFFSET*4, m); 267b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 268b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk } 269b4d7bb6872f523b4318144202e119766ed9054edAlex Sakhartchouk} 270