• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2008 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.modelviewer;
18 
19 import java.io.Writer;
20 import java.util.Map;
21 import java.util.Vector;
22 
23 import android.content.res.Resources;
24 import android.renderscript.*;
25 import android.renderscript.Element.Builder;
26 import android.renderscript.Font.Style;
27 import android.renderscript.ProgramStore.DepthFunc;
28 import android.util.Log;
29 
30 
31 public class SceneGraphRS {
32 
33     private final int STATE_LAST_FOCUS = 1;
34 
35     int mWidth;
36     int mHeight;
37     int mRotation;
38 
SceneGraphRS()39     public SceneGraphRS() {
40     }
41 
init(RenderScriptGL rs, Resources res, int width, int height)42     public void init(RenderScriptGL rs, Resources res, int width, int height) {
43         mRS = rs;
44         mRes = res;
45         mWidth = width;
46         mHeight = height;
47         mRotation = 0;
48         initRS();
49     }
50 
51     private Resources mRes;
52     private RenderScriptGL mRS;
53     private Sampler mSampler;
54     private ProgramStore mPSBackground;
55     private ProgramFragment mPFBackground;
56     private ProgramVertex mPVBackground;
57     private ProgramVertexFixedFunction.Constants mPVA;
58 
59     private Allocation mGridImage;
60     private Allocation mAllocPV;
61 
62     private Mesh mMesh;
63 
64     private Font mItalic;
65     private Allocation mTextAlloc;
66 
67     private ScriptC_scenegraph mScript;
68     private ScriptC_transform mTransformScript;
69 
70     int mLastX;
71     int mLastY;
72 
touchEvent(int x, int y)73     public void touchEvent(int x, int y) {
74         int dx = mLastX - x;
75         if (Math.abs(dx) > 50 || Math.abs(dx) < 3) {
76             dx = 0;
77         }
78 
79         mRotation -= dx;
80         if (mRotation > 360) {
81             mRotation -= 360;
82         }
83         if (mRotation < 0) {
84             mRotation += 360;
85         }
86 
87         mScript.set_gRotate(-(float)mRotation);
88 
89         mLastX = x;
90         mLastY = y;
91     }
92 
initPFS()93     private void initPFS() {
94         ProgramStore.Builder b = new ProgramStore.Builder(mRS);
95 
96         b.setDepthFunc(ProgramStore.DepthFunc.LESS);
97         b.setDitherEnabled(false);
98         b.setDepthMaskEnabled(true);
99         mPSBackground = b.create();
100 
101         mScript.set_gPFSBackground(mPSBackground);
102     }
103 
initPF()104     private void initPF() {
105         Sampler.Builder bs = new Sampler.Builder(mRS);
106         bs.setMinification(Sampler.Value.LINEAR);
107         bs.setMagnification(Sampler.Value.LINEAR);
108         bs.setWrapS(Sampler.Value.CLAMP);
109         bs.setWrapT(Sampler.Value.CLAMP);
110         mSampler = bs.create();
111 
112         ProgramFragmentFixedFunction.Builder b = new ProgramFragmentFixedFunction.Builder(mRS);
113         b.setTexture(ProgramFragmentFixedFunction.Builder.EnvMode.REPLACE,
114                      ProgramFragmentFixedFunction.Builder.Format.RGBA, 0);
115         mPFBackground = b.create();
116         mPFBackground.bindSampler(mSampler, 0);
117 
118         mScript.set_gPFBackground(mPFBackground);
119     }
120 
initPV()121     private void initPV() {
122         ProgramVertexFixedFunction.Builder pvb = new ProgramVertexFixedFunction.Builder(mRS);
123         mPVBackground = pvb.create();
124 
125         mPVA = new ProgramVertexFixedFunction.Constants(mRS);
126         ((ProgramVertexFixedFunction)mPVBackground).bindConstants(mPVA);
127 
128         mScript.set_gPVBackground(mPVBackground);
129     }
130 
loadImage()131     private void loadImage() {
132         mGridImage = Allocation.createFromBitmapResource(mRS, mRes, R.drawable.robot,
133                                                          Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
134                                                          Allocation.USAGE_GRAPHICS_TEXTURE);
135         mScript.set_gTGrid(mGridImage);
136     }
137 
initTextAllocation()138     private void initTextAllocation() {
139         String allocString = "Displaying file: R.raw.robot";
140         mTextAlloc = Allocation.createFromString(mRS, allocString, Allocation.USAGE_SCRIPT);
141         mScript.set_gTextAlloc(mTextAlloc);
142     }
143 
144     SgTransform mRootTransform;
145     SgTransform mGroup1;
146 
147     SgTransform mRobot1;
148     SgTransform mRobot2;
149 
initTransformHierarchy()150     void initTransformHierarchy() {
151         mRootTransform = new SgTransform(mRS);
152 
153         mGroup1 = new SgTransform(mRS);
154         mRootTransform.addChild(mGroup1);
155 
156         mRobot1 = new SgTransform(mRS);
157         mRobot2 = new SgTransform(mRS);
158 
159         mGroup1.addChild(mRobot1);
160         mGroup1.addChild(mRobot2);
161 
162         mGroup1.setTransform(0, new Float4(0.0f, 0.0f, -15.0f, 0.0f), TransformType.TRANSLATE);
163         mGroup1.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, 15.0f), TransformType.ROTATE);
164 
165         mRobot1.setTransform(0, new Float4(-3.0f, -0.5f, 0.0f, 0.0f), TransformType.TRANSLATE);
166         mRobot1.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, 20.0f), TransformType.ROTATE);
167         mRobot1.setTransform(2, new Float4(0.2f, 0.2f, 0.2f, 0.0f), TransformType.SCALE);
168 
169         mRobot2.setTransform(0, new Float4(3.0f, 0.0f, 0.0f, 0.0f), TransformType.TRANSLATE);
170         mRobot2.setTransform(1, new Float4(0.0f, 1.0f, 0.0f, -20.0f), TransformType.ROTATE);
171         mRobot2.setTransform(2, new Float4(0.3f, 0.3f, 0.3f, 0.0f), TransformType.SCALE);
172     }
173 
initRS()174     private void initRS() {
175 
176         mScript = new ScriptC_scenegraph(mRS, mRes, R.raw.scenegraph);
177         mTransformScript = new ScriptC_transform(mRS, mRes, R.raw.transform);
178         mTransformScript.set_transformScript(mTransformScript);
179 
180         mScript.set_gTransformRS(mTransformScript);
181 
182         initPFS();
183         initPF();
184         initPV();
185 
186         loadImage();
187 
188         FileA3D model = FileA3D.createFromResource(mRS, mRes, R.raw.robot);
189         FileA3D.IndexEntry entry = model.getIndexEntry(0);
190         if (entry == null || entry.getEntryType() != FileA3D.EntryType.MESH) {
191             Log.e("rs", "could not load model");
192         } else {
193             mMesh = (Mesh)entry.getObject();
194             mScript.set_gTestMesh(mMesh);
195         }
196 
197         mItalic = Font.create(mRS, mRes, "serif", Font.Style.ITALIC, 8);
198         mScript.set_gItalic(mItalic);
199 
200         initTextAllocation();
201 
202         initTransformHierarchy();
203 
204         mScript.bind_gRootNode(mRootTransform.getField());
205 
206         mScript.bind_gGroup(mGroup1.mParent.mChildField);
207         mScript.bind_gRobot1(mRobot1.mParent.mChildField);
208         mScript.set_gRobot1Index(mRobot1.mIndexInParentGroup);
209         mScript.bind_gRobot2(mRobot2.mParent.mChildField);
210         mScript.set_gRobot2Index(mRobot2.mIndexInParentGroup);
211 
212         mRS.bindRootScript(mScript);
213     }
214 }
215 
216 
217 
218