1e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy/* 2e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Copyright (C) 2011 The Android Open Source Project 3e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * 4e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Licensed under the Apache License, Version 2.0 (the "License"); 5e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * you may not use this file except in compliance with the License. 6e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * You may obtain a copy of the License at 7e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * 8e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * http://www.apache.org/licenses/LICENSE-2.0 9e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * 10e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * Unless required by applicable law or agreed to in writing, software 11e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * distributed under the License is distributed on an "AS IS" BASIS, 12e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * See the License for the specific language governing permissions and 14e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy * limitations under the License. 15e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy */ 16e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 17a1db574036c9bc2d397b69f8200594027e1fff16Romain Guypackage com.android.scenegraph; 18a1db574036c9bc2d397b69f8200594027e1fff16Romain Guy 19e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport java.lang.Math; 20e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport java.util.ArrayList; 21e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 22deba785f122a47915756ffd991f5540d952cf937Romain Guyimport android.content.res.Resources; 23e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guyimport android.renderscript.*; 24ce0537b80087a6225273040a987414b1dd081aa0Romain Guyimport android.util.Log; 25c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy 26f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy/** 27c7d53494f1fbd9f9d74af89053ff9fdb1ccbac6cRomain Guy * @hide 28079ba2c85b15e882629b8d188f5fbdb42f7f8eeaRomain Guy */ 29a1db574036c9bc2d397b69f8200594027e1fff16Romain Guypublic class VertexShader extends Shader { 3085bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy ProgramVertex mProgram; 31e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy ScriptField_VertexShader_s mField; 3285bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy 3306f96e2652e4855b6520ad9dd70583677605b79aRomain Guy public static class Builder { 34db1938e0e6ef816e228c815adccebd5cb05f2aa8Romain Guy VertexShader mShader; 359d5316e3f56d138504565ff311145ac01621dff4Romain Guy ProgramVertex.Builder mBuilder; 369d5316e3f56d138504565ff311145ac01621dff4Romain Guy 3785bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy public Builder(RenderScriptGL rs) { 38e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy mShader = new VertexShader(); 39e8e62a4a032a80409114a37908b5f18ab0080848Romain Guy mBuilder = new ProgramVertex.Builder(rs); 40e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy } 41e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 429d5316e3f56d138504565ff311145ac01621dff4Romain Guy public Builder setShader(Resources resources, int resourceID) { 439d5316e3f56d138504565ff311145ac01621dff4Romain Guy mBuilder.setShader(resources, resourceID); 449d5316e3f56d138504565ff311145ac01621dff4Romain Guy return this; 459d5316e3f56d138504565ff311145ac01621dff4Romain Guy } 469d5316e3f56d138504565ff311145ac01621dff4Romain Guy 479d5316e3f56d138504565ff311145ac01621dff4Romain Guy public Builder setShader(String code) { 489d5316e3f56d138504565ff311145ac01621dff4Romain Guy mBuilder.setShader(code); 497ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy return this; 507ae7ac48aa2b53453c9805075171ecd5bcafd7deRomain Guy } 519d5316e3f56d138504565ff311145ac01621dff4Romain Guy 529d5316e3f56d138504565ff311145ac01621dff4Romain Guy public Builder setObjectConst(Type type) { 53e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy mShader.mPerObjConstants = type; 54e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy return this; 55e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy } 56e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 57ce0537b80087a6225273040a987414b1dd081aa0Romain Guy public Builder setShaderConst(Type type) { 5885bf02fc16784d935fb9eebfa9cb20fe46ff7951Romain Guy mShader.mPerShaderConstants = type; 59e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy return this; 60e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy } 61ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 62f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy public Builder addInput(Element e) { 63f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy mBuilder.addInput(e); 64e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy return this; 65e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy } 66e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 67e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy public VertexShader create() { 68e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy if (mShader.mPerShaderConstants != null) { 69e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy mBuilder.addConstant(mShader.mPerShaderConstants); 70ce0537b80087a6225273040a987414b1dd081aa0Romain Guy } 71f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy if (mShader.mPerObjConstants != null) { 72f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy mBuilder.addConstant(mShader.mPerObjConstants); 73e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy } 74e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy mShader.mProgram = mBuilder.create(); 75ce0537b80087a6225273040a987414b1dd081aa0Romain Guy return mShader; 76f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy } 77f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy } 78e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy 79e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy public ProgramVertex getProgram() { 80e4d011201cea40d46cb2b2eef401db8fddc5c9c6Romain Guy return mProgram; 81bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy } 82bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 83bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy ScriptField_VertexShader_s getRSData() { 84ce0537b80087a6225273040a987414b1dd081aa0Romain Guy if (mField != null) { 85bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy return mField; 86f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy } 87f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 88bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy RenderScriptGL rs = SceneManager.getRS(); 89ce0537b80087a6225273040a987414b1dd081aa0Romain Guy Resources res = SceneManager.getRes(); 90f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy if (rs == null || res == null) { 91f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy return null; 92bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy } 93bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 94ce0537b80087a6225273040a987414b1dd081aa0Romain Guy ScriptField_VertexShader_s.Item item = new ScriptField_VertexShader_s.Item(); 95f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy item.program = mProgram; 96f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy 97bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy linkConstants(rs); 98bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy if (mPerShaderConstants != null) { 99ce0537b80087a6225273040a987414b1dd081aa0Romain Guy item.shaderConst = mConstantBuffer; 100f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy item.shaderConstParams = mConstantBufferParams.getAllocation(); 101f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy mProgram.bindConstants(item.shaderConst, 0); 102bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy } 103bb9524b6bdddc7ac77d8628daa8b366b8a7be4a4Romain Guy 104f6a11b8a9e25ff9861bbba19251bea84d8a5daf2Romain Guy item.objectConstIndex = -1; 105bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy if (mPerObjConstants != null) { 106bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy item.objectConstIndex = mPerShaderConstants != null ? 1 : 0; 107bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy } 108ce0537b80087a6225273040a987414b1dd081aa0Romain Guy 109bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy mField = new ScriptField_VertexShader_s(rs, 1); 110bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy mField.set(item, 0, true); 111bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy return mField; 112bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy } 113bd6b79b40247aea7bfe13d0831c6c0472df6c636Romain Guy} 114ce0537b80087a6225273040a987414b1dd081aa0Romain Guy