Skip to content

Commit 1eb4c26

Browse files
Alex SakhartchoukAndroid (Google) Code Review
authored andcommitted
Merge "Adding a very simple all-code scenegraph example."
2 parents 5489e4a + 57fc710 commit 1eb4c26

File tree

10 files changed

+298
-45
lines changed

10 files changed

+298
-45
lines changed

tests/RenderScriptTests/SceneGraph/AndroidManifest.xml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@
1111
<category android:name="android.intent.category.LAUNCHER" />
1212
</intent-filter>
1313
</activity>
14+
<activity android:name="SimpleApp"
15+
android:label="SimpleSceneGraph">
16+
<intent-filter>
17+
<action android:name="android.intent.action.MAIN" />
18+
<category android:name="android.intent.category.LAUNCHER" />
19+
</intent-filter>
20+
</activity>
1421
<activity android:name="FileSelector"
1522
android:label="FileSelector"
1623
android:hardwareAccelerated="true">

tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/ColladaParser.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -248,17 +248,17 @@ private void getNode(Element node, Transform parent, String indent) {
248248
String description = field.getAttribute("sid");
249249
if (fieldName.equals("translate")) {
250250
Float3 value = getFloat3(field);
251-
current.addComponent(new TranslateComponent(description, value));
251+
current.addTranslate(description, value);
252252
//Log.v(TAG, indent + " translate " + description + toString(value));
253253
} else if (fieldName.equals("rotate")) {
254254
Float4 value = getFloat4(field);
255255
//Log.v(TAG, indent + " rotate " + description + toString(value));
256256
Float3 axis = new Float3(value.x, value.y, value.z);
257-
current.addComponent(new RotateComponent(description, axis, value.w));
257+
current.addRotate(description, axis, value.w);
258258
} else if (fieldName.equals("scale")) {
259259
Float3 value = getFloat3(field);
260260
//Log.v(TAG, indent + " scale " + description + toString(value));
261-
current.addComponent(new ScaleComponent(description, value));
261+
current.addScale(description, value);
262262
} else if (fieldName.equals("instance_geometry")) {
263263
getRenderable(field, current);
264264
} else if (fieldName.equals("instance_light")) {

tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/CompoundTransform.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,24 @@ public CompoundTransform() {
134134
mTransformComponents = new ArrayList<Component>();
135135
}
136136

137+
public TranslateComponent addTranslate(String name, Float3 translate) {
138+
TranslateComponent c = new TranslateComponent(name, translate);
139+
addComponent(c);
140+
return c;
141+
}
142+
143+
public RotateComponent addRotate(String name, Float3 axis, float angle) {
144+
RotateComponent c = new RotateComponent(name, axis, angle);
145+
addComponent(c);
146+
return c;
147+
}
148+
149+
public ScaleComponent addScale(String name, Float3 scale) {
150+
ScaleComponent c = new ScaleComponent(name, scale);
151+
addComponent(c);
152+
return c;
153+
}
154+
137155
public void addComponent(Component c) {
138156
if (c.mParent != null) {
139157
throw new IllegalArgumentException("Transform components may not be shared");

tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/Scene.java

Lines changed: 21 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -248,24 +248,29 @@ private void addDrawables(RenderScriptGL rs, Resources res, SceneManager sceneMa
248248
}
249249

250250
private void addShaders(RenderScriptGL rs, Resources res, SceneManager sceneManager) {
251-
Allocation shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs),
252-
mVertexShaders.size());
253-
Allocation[] shaderAllocs = new Allocation[mVertexShaders.size()];
254-
for (int i = 0; i < mVertexShaders.size(); i ++) {
255-
VertexShader sI = mVertexShaders.get(i);
256-
shaderAllocs[i] = sI.getRSData().getAllocation();
251+
if (mVertexShaders.size() > 0) {
252+
Allocation shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs),
253+
mVertexShaders.size());
254+
Allocation[] shaderAllocs = new Allocation[mVertexShaders.size()];
255+
for (int i = 0; i < mVertexShaders.size(); i ++) {
256+
VertexShader sI = mVertexShaders.get(i);
257+
shaderAllocs[i] = sI.getRSData().getAllocation();
258+
}
259+
shaderData.copyFrom(shaderAllocs);
260+
sceneManager.mRenderLoop.set_gVertexShaders(shaderData);
257261
}
258-
shaderData.copyFrom(shaderAllocs);
259-
sceneManager.mRenderLoop.set_gVertexShaders(shaderData);
260-
261-
shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs), mFragmentShaders.size());
262-
shaderAllocs = new Allocation[mFragmentShaders.size()];
263-
for (int i = 0; i < mFragmentShaders.size(); i ++) {
264-
FragmentShader sI = mFragmentShaders.get(i);
265-
shaderAllocs[i] = sI.getRSData().getAllocation();
262+
263+
if (mFragmentShaders.size() > 0) {
264+
Allocation shaderData = Allocation.createSized(rs, Element.ALLOCATION(rs),
265+
mFragmentShaders.size());
266+
Allocation[] shaderAllocs = new Allocation[mFragmentShaders.size()];
267+
for (int i = 0; i < mFragmentShaders.size(); i ++) {
268+
FragmentShader sI = mFragmentShaders.get(i);
269+
shaderAllocs[i] = sI.getRSData().getAllocation();
270+
}
271+
shaderData.copyFrom(shaderAllocs);
272+
sceneManager.mRenderLoop.set_gFragmentShaders(shaderData);
266273
}
267-
shaderData.copyFrom(shaderAllocs);
268-
sceneManager.mRenderLoop.set_gFragmentShaders(shaderData);
269274
}
270275

271276
public void initRS() {

tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/SceneManager.java

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -342,7 +342,7 @@ public static FragmentShader getColorFS() {
342342
final String code = "\n" +
343343
"varying vec2 varTex0;\n" +
344344
"void main() {\n" +
345-
" lowp vec4 col = texture2D(UNI_Tex0, varTex0).rgba;\n" +
345+
" lowp vec4 col = UNI_color;\n" +
346346
" gl_FragColor = col;\n" +
347347
"}\n";
348348
FragmentShader.Builder fb = new FragmentShader.Builder(rs);
@@ -360,12 +360,14 @@ public static FragmentShader getTextureFS() {
360360
}
361361
if (sSceneManager.mTexture == null) {
362362
RenderScriptGL rs = getRS();
363+
363364
final String code = "\n" +
364365
"varying vec2 varTex0;\n" +
365366
"void main() {\n" +
366-
" lowp vec4 col = UNI_color;\n" +
367+
" lowp vec4 col = texture2D(UNI_Tex0, varTex0).rgba;\n" +
367368
" gl_FragColor = col;\n" +
368369
"}\n";
370+
369371
FragmentShader.Builder fb = new FragmentShader.Builder(rs);
370372
fb.setShader(code);
371373
fb.addTexture(Program.TextureType.TEXTURE_2D, "Tex0");
@@ -408,17 +410,10 @@ public Mesh getScreenAlignedQuad() {
408410
Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
409411
3, Mesh.TriangleMeshBuilder.TEXTURE_0);
410412

411-
tmb.setTexture(0.0f, 1.0f);
412-
tmb.addVertex(-1.0f, 1.0f, 1.0f);
413-
414-
tmb.setTexture(0.0f, 0.0f);
415-
tmb.addVertex(-1.0f, -1.0f, 1.0f);
416-
417-
tmb.setTexture(1.0f, 0.0f);
418-
tmb.addVertex(1.0f, -1.0f, 1.0f);
419-
420-
tmb.setTexture(1.0f, 1.0f);
421-
tmb.addVertex(1.0f, 1.0f, 1.0f);
413+
tmb.setTexture(0.0f, 1.0f).addVertex(-1.0f, 1.0f, 1.0f);
414+
tmb.setTexture(0.0f, 0.0f).addVertex(-1.0f, -1.0f, 1.0f);
415+
tmb.setTexture(1.0f, 0.0f).addVertex(1.0f, -1.0f, 1.0f);
416+
tmb.setTexture(1.0f, 1.0f).addVertex(1.0f, 1.0f, 1.0f);
422417

423418
tmb.addTriangle(0, 1, 2);
424419
tmb.addTriangle(2, 3, 0);

tests/RenderScriptTests/SceneGraph/src/com/android/scenegraph/render.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,10 +142,14 @@ static void drawAllObjects(rs_allocation allObj) {
142142
return;
143143
}
144144

145-
rsForEach(gVertexParamsScript, nullAlloc, gVertexShaders,
146-
gActiveCamera, sizeof(gActiveCamera));
147-
rsForEach(gFragmentParamsScript, nullAlloc, gFragmentShaders,
148-
gActiveCamera, sizeof(gActiveCamera));
145+
if (rsIsObject(gVertexShaders)) {
146+
rsForEach(gVertexParamsScript, nullAlloc, gVertexShaders,
147+
gActiveCamera, sizeof(gActiveCamera));
148+
}
149+
if (rsIsObject(gFragmentShaders)) {
150+
rsForEach(gFragmentParamsScript, nullAlloc, gFragmentShaders,
151+
gActiveCamera, sizeof(gActiveCamera));
152+
}
149153

150154
// Run the params and cull script
151155
rsForEach(gCullScript, nullAlloc, allObj, gActiveCamera, sizeof(gActiveCamera));
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
/*
2+
* Copyright (C) 2012 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.testapp;
18+
19+
import android.renderscript.RSSurfaceView;
20+
import android.renderscript.RenderScript;
21+
22+
import android.app.Activity;
23+
import android.os.Bundle;
24+
import android.util.Log;
25+
import android.view.View;
26+
import android.view.Window;
27+
import android.view.Window;
28+
import android.net.Uri;
29+
30+
import java.lang.Runtime;
31+
32+
public class SimpleApp extends Activity {
33+
34+
private SimpleAppView mView;
35+
36+
@Override
37+
public void onCreate(Bundle icicle) {
38+
super.onCreate(icicle);
39+
40+
// Create our Preview view and set it as the content of our
41+
// Activity
42+
mView = new SimpleAppView(this);
43+
setContentView(mView);
44+
}
45+
}
46+
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
/*
2+
* Copyright (C) 2012 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.testapp;
18+
19+
import java.util.ArrayList;
20+
import java.util.HashMap;
21+
import java.util.Map;
22+
import java.util.Vector;
23+
24+
import com.android.scenegraph.*;
25+
import com.android.scenegraph.SceneManager.SceneLoadedCallback;
26+
27+
import android.content.res.Resources;
28+
import android.graphics.Bitmap;
29+
import android.graphics.BitmapFactory;
30+
import android.os.AsyncTask;
31+
import android.renderscript.*;
32+
import android.renderscript.Program.TextureType;
33+
import android.util.Log;
34+
35+
// This is where the scenegraph and the rendered objects are initialized and used
36+
public class SimpleAppRS {
37+
38+
private static String TAG = "SimpleAppRS";
39+
40+
SceneManager mSceneManager;
41+
ArrayList<Renderable> geometry = new ArrayList<Renderable>();
42+
43+
Scene mScene;
44+
RenderScriptGL mRS;
45+
Resources mRes;
46+
47+
public void init(RenderScriptGL rs, Resources res, int width, int height) {
48+
mRS = rs;
49+
mRes = res;
50+
mSceneManager = SceneManager.getInstance();
51+
mSceneManager.initRS(mRS, mRes, width, height);
52+
53+
mScene = new Scene();
54+
55+
setupGeometry();
56+
setupCamera();
57+
setupRenderPass();
58+
setupShaders();
59+
60+
mSceneManager.setActiveScene(mScene);
61+
62+
mScene.initRS();
63+
mRS.bindRootScript(mSceneManager.getRenderLoop());
64+
}
65+
66+
private void setupShaders() {
67+
// Built-in shader that provides position, texcoord and normal
68+
VertexShader genericV = SceneManager.getDefaultVS();
69+
// Built-in shader that displays a color
70+
FragmentShader colorF = SceneManager.getColorFS();
71+
mScene.assignRenderState(new RenderState(genericV, colorF, null, null));
72+
}
73+
private void setupGeometry() {
74+
Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
75+
3, Mesh.TriangleMeshBuilder.TEXTURE_0);
76+
77+
tmb.setTexture(0.0f, 1.0f).addVertex(-1.0f, 1.0f, 0.0f);
78+
tmb.setTexture(0.0f, 0.0f).addVertex(-1.0f, -1.0f, 0.0f);
79+
tmb.setTexture(1.0f, 0.0f).addVertex(1.0f, -1.0f, 0.0f);
80+
tmb.setTexture(1.0f, 1.0f).addVertex(1.0f, 1.0f, 0.0f);
81+
82+
tmb.addTriangle(0, 1, 2);
83+
tmb.addTriangle(2, 3, 0);
84+
85+
Mesh mesh = tmb.create(true);
86+
87+
Renderable quad = new Renderable();
88+
quad.setMesh(mesh);
89+
quad.setTransform(new CompoundTransform());
90+
quad.appendSourceParams(new Float4Param("color", 0.2f, 0.3f, 0.4f));
91+
92+
mScene.appendRenderable(quad);
93+
geometry.add(quad);
94+
}
95+
96+
private void setupCamera() {
97+
Camera camera = new Camera();
98+
camera.setFar(200);
99+
camera.setNear(0.1f);
100+
camera.setFOV(60);
101+
CompoundTransform cameraTransform = new CompoundTransform();
102+
cameraTransform.addTranslate("camera", new Float3(0, 0, 10));
103+
mScene.appendTransform(cameraTransform);
104+
camera.setTransform(cameraTransform);
105+
mScene.appendCamera(camera);
106+
}
107+
108+
private void setupRenderPass() {
109+
RenderPass mainPass = new RenderPass();
110+
mainPass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
111+
mainPass.setShouldClearColor(true);
112+
mainPass.setClearDepth(1.0f);
113+
mainPass.setShouldClearDepth(true);
114+
mainPass.setCamera(mScene.getCameras().get(0));
115+
for (Renderable renderable : geometry) {
116+
mainPass.appendRenderable(renderable);
117+
}
118+
mScene.appendRenderPass(mainPass);
119+
}
120+
}

0 commit comments

Comments
 (0)