1 /*
2  * Copyright (C) 2011 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.fbotest;
18 
19 import java.io.Writer;
20 
21 import android.content.res.Resources;
22 import android.renderscript.*;
23 import android.renderscript.Element.DataType;
24 import android.renderscript.Element.DataKind;
25 import android.renderscript.ProgramStore.DepthFunc;
26 import android.renderscript.Type.Builder;
27 import android.util.Log;
28 
29 
30 public class FBOTestRS {
31 
FBOTestRS()32     public FBOTestRS() {
33     }
34 
init(RenderScriptGL rs, Resources res)35     public void init(RenderScriptGL rs, Resources res) {
36         mRS = rs;
37         mRes = res;
38         initRS();
39     }
40 
surfaceChanged()41     public void surfaceChanged() {
42         mRS.getWidth();
43         mRS.getHeight();
44     }
45 
46     private Resources mRes;
47     private RenderScriptGL mRS;
48     private Sampler mSampler;
49     private ProgramStore mPSBackground;
50     private ProgramFragment mPFBackground;
51     private ProgramVertex mPVBackground;
52     private ProgramVertexFixedFunction.Constants mPVA;
53 
54     private Allocation mGridImage;
55     private Allocation mOffscreen;
56     private Allocation mOffscreenDepth;
57     private Allocation mAllocPV;
58 
59     private Font mItalic;
60     private Allocation mTextAlloc;
61 
62     private ScriptField_MeshInfo mMeshes;
63     private ScriptC_fbotest mScript;
64 
65 
onActionDown(float x, float y)66     public void onActionDown(float x, float y) {
67         mScript.invoke_onActionDown(x, y);
68     }
69 
onActionScale(float scale)70     public void onActionScale(float scale) {
71         mScript.invoke_onActionScale(scale);
72     }
73 
onActionMove(float x, float y)74     public void onActionMove(float x, float y) {
75         mScript.invoke_onActionMove(x, y);
76     }
77 
initPFS()78     private void initPFS() {
79         ProgramStore.Builder b = new ProgramStore.Builder(mRS);
80 
81         b.setDepthFunc(ProgramStore.DepthFunc.LESS);
82         b.setDitherEnabled(false);
83         b.setDepthMaskEnabled(true);
84         mPSBackground = b.create();
85 
86         mScript.set_gPFSBackground(mPSBackground);
87     }
88 
initPF()89     private void initPF() {
90         Sampler.Builder bs = new Sampler.Builder(mRS);
91         bs.setMinification(Sampler.Value.LINEAR);
92         bs.setMagnification(Sampler.Value.LINEAR);
93         bs.setWrapS(Sampler.Value.CLAMP);
94         bs.setWrapT(Sampler.Value.CLAMP);
95         mSampler = bs.create();
96 
97         ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
98         b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
99                      ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
100         mPFBackground = b.create();
101         mPFBackground.bindSampler(mSampler, 0);
102 
103         mScript.set_gPFBackground(mPFBackground);
104     }
105 
initPV()106     private void initPV() {
107         ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
108         mPVBackground = pvb.create();
109 
110         mPVA = new ProgramVertexFixedFunction.Constants(mRS);
111         ((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA);
112 
113         mScript.set_gPVBackground(mPVBackground);
114     }
115 
loadImage()116     private void loadImage() {
117         mGridImage = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot,
118                                                          Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
119                                                          Allocation.USAGE_GRAPHICS_TEXTURE);
120         mScript.set_gTGrid(mGridImage);
121     }
122 
initTextAllocation(String fileName)123     private void initTextAllocation(String fileName) {
124         String allocString = "Displaying file: " + fileName;
125         mTextAlloc = Allocation.createFromString(mRS, allocString, Allocation.USAGE_SCRIPT);
126         mScript.set_gTextAlloc(mTextAlloc);
127     }
128 
initMeshes(FileA3D model)129     private void initMeshes(FileA3D model) {
130         int numEntries = model.getIndexEntryCount();
131         int numMeshes = 0;
132         for (int i = 0; i < numEntries; i ++) {
133             FileA3D.IndexEntry entry = model.getIndexEntry(i);
134             if (entry != null && entry.getEntryType() == FileA3D.EntryType.MESH) {
135                 numMeshes ++;
136             }
137         }
138 
139         if (numMeshes > 0) {
140             mMeshes = new ScriptField_MeshInfo(mRS, numMeshes);
141 
142             for (int i = 0; i < numEntries; i ++) {
143                 FileA3D.IndexEntry entry = model.getIndexEntry(i);
144                 if (entry != null && entry.getEntryType() == FileA3D.EntryType.MESH) {
145                     Mesh mesh = entry.getMesh();
146                     mMeshes.set_mMesh(i, mesh, false);
147                     mMeshes.set_mNumIndexSets(i, mesh.getPrimitiveCount(), false);
148                 }
149             }
150             mMeshes.copyAll();
151         } else {
152             throw new RSRuntimeException("No valid meshes in file");
153         }
154 
155         mScript.bind_gMeshes(mMeshes);
156         mScript.invoke_updateMeshInfo();
157     }
158 
loadA3DFile(String path)159     public void loadA3DFile(String path) {
160         FileA3D model = FileA3D.createFromFile(mRS, path);
161         initMeshes(model);
162         initTextAllocation(path);
163     }
164 
initRS()165     private void initRS() {
166 
167         mScript = new ScriptC_fbotest(mRS, mRes, R.raw.fbotest);
168 
169         initPFS();
170         initPF();
171         initPV();
172 
173         loadImage();
174 
175         Type.Builder b = new Type.Builder(mRS, Element.RGBA_8888(mRS));
176         b.setX(512).setY(512);
177         mOffscreen = Allocation.createTyped(mRS,
178                                             b.create(),
179                                             Allocation.USAGE_GRAPHICS_TEXTURE |
180                                             Allocation.USAGE_GRAPHICS_RENDER_TARGET);
181         mScript.set_gOffscreen(mOffscreen);
182 
183         b = new Type.Builder(mRS,
184                              Element.createPixel(mRS, DataType.UNSIGNED_16,
185                              DataKind.PIXEL_DEPTH));
186         b.setX(512).setY(512);
187         mOffscreenDepth = Allocation.createTyped(mRS,
188                                                  b.create(),
189                                                  Allocation.USAGE_GRAPHICS_RENDER_TARGET);
190         mScript.set_gOffscreenDepth(mOffscreenDepth);
191 
192         FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
193         initMeshes(model);
194 
195         mItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
196         mScript.set_gItalic(mItalic);
197 
198         initTextAllocation("R.raw.robot");
199 
200         mRS.bindRootScript(mScript);
201     }
202 }
203 
204 
205 
206