Merge "Simplifying programmatic creation."

This commit is contained in:
Alex Sakhartchouk
2012-02-22 14:10:58 -08:00
committed by Android (Google) Code Review
8 changed files with 154 additions and 52 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

View File

@@ -22,6 +22,7 @@ import java.util.HashMap;
import java.util.Iterator;
import com.android.scenegraph.Float4Param;
import com.android.scenegraph.MatrixTransform;
import com.android.scenegraph.SceneManager;
import com.android.scenegraph.ShaderParam;
import com.android.scenegraph.TransformParam;
@@ -89,6 +90,10 @@ public class Renderable extends RenderableBase {
mMaterialName = name;
}
public Transform getTransform() {
return mTransform;
}
public void setTransform(Transform t) {
mTransform = t;
if (mField != null) {
@@ -199,12 +204,14 @@ public class Renderable extends RenderableBase {
if (mRenderState == null) {
mRenderState = SceneManager.getDefaultState();
}
if (mTransform == null) {
mTransform = SceneManager.getDefaultTransform();
}
updateVertexConstants(rs);
updateFragmentConstants(rs);
if (mTransform != null) {
mData.transformMatrix = mTransform.getRSData().getAllocation();
}
mData.transformMatrix = mTransform.getRSData().getAllocation();
mData.name = getNameAlloc(rs);
mData.render_state = mRenderState.getRSData().getAllocation();
mData.bVolInitialized = 0;

View File

@@ -22,6 +22,10 @@ import java.util.HashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import com.android.scenegraph.Camera;
import com.android.scenegraph.CompoundTransform;
import com.android.scenegraph.RenderPass;
import com.android.scenegraph.Renderable;
import com.android.scenegraph.SceneManager;
import com.android.scenegraph.TextureBase;
@@ -81,6 +85,18 @@ public class Scene extends SceneGraphBase {
mRootTransforms.appendChild(t);
}
public CompoundTransform appendNewCompoundTransform() {
CompoundTransform t = new CompoundTransform();
appendTransform(t);
return t;
}
public MatrixTransform appendNewMatrixTransform() {
MatrixTransform t = new MatrixTransform();
appendTransform(t);
return t;
}
// temporary
public void addToTransformMap(Transform t) {
mTransformMap.put(t.getName(), t);
@@ -97,6 +113,12 @@ public class Scene extends SceneGraphBase {
mRenderPasses.add(p);
}
public RenderPass appendNewRenderPass() {
RenderPass p = new RenderPass();
appendRenderPass(p);
return p;
}
public void clearRenderPasses() {
mRenderPasses.clear();
}
@@ -115,6 +137,12 @@ public class Scene extends SceneGraphBase {
mCameras.add(c);
}
public Camera appendNewCamera() {
Camera c = new Camera();
appendCamera(c);
return c;
}
public void appendShader(FragmentShader f) {
if (f == null) {
throw new RuntimeException("Adding null object");
@@ -142,7 +170,15 @@ public class Scene extends SceneGraphBase {
throw new RuntimeException("Adding null object");
}
mRenderables.add(d);
mRenderableMap.put(d.getName(), d);
if (d.getName() != null) {
mRenderableMap.put(d.getName(), d);
}
}
public Renderable appendNewRenderable() {
Renderable r = new Renderable();
appendRenderable(r);
return r;
}
public ArrayList<RenderableBase> getRenderables() {

View File

@@ -80,6 +80,7 @@ public class SceneManager extends SceneGraphBase {
private VertexShader mDefaultVertex;
private RenderState mDefaultState;
private Transform mDefaultTransform;
private static Allocation getDefault(boolean isCube) {
final int dimension = 4;
@@ -161,24 +162,32 @@ public class SceneManager extends SceneGraphBase {
return b;
}
public static Allocation loadCubemap(String name, RenderScriptGL rs, Resources res) {
Bitmap b = loadBitmap(name, res);
static Allocation createFromBitmap(Bitmap b, RenderScriptGL rs, boolean isCube) {
if (b == null) {
return null;
}
return Allocation.createCubemapFromBitmap(rs, b,
MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
Allocation.USAGE_GRAPHICS_TEXTURE);
MipmapControl mip = MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE;
int usage = Allocation.USAGE_GRAPHICS_TEXTURE;
if (isCube) {
return Allocation.createCubemapFromBitmap(rs, b, mip, usage);
}
return Allocation.createFromBitmap(rs, b, mip, usage);
}
public static Allocation loadCubemap(String name, RenderScriptGL rs, Resources res) {
return createFromBitmap(loadBitmap(name, res), rs, true);
}
public static Allocation loadCubemap(int id, RenderScriptGL rs, Resources res) {
return createFromBitmap(BitmapFactory.decodeResource(res, id), rs, true);
}
public static Allocation loadTexture2D(String name, RenderScriptGL rs, Resources res) {
Bitmap b = loadBitmap(name, res);
if (b == null) {
return null;
}
return Allocation.createFromBitmap(rs, b,
Allocation.MipmapControl.MIPMAP_ON_SYNC_TO_TEXTURE,
Allocation.USAGE_GRAPHICS_TEXTURE);
return createFromBitmap(loadBitmap(name, res), rs, false);
}
public static Allocation loadTexture2D(int id, RenderScriptGL rs, Resources res) {
return createFromBitmap(BitmapFactory.decodeResource(res, id), rs, false);
}
public static ProgramStore BLEND_ADD_DEPTH_NONE(RenderScript rs) {
@@ -261,6 +270,7 @@ public class SceneManager extends SceneGraphBase {
}
mActiveScene.appendShader(getDefaultVS());
mActiveScene.appendTransform(getDefaultTransform());
}
static RenderScriptGL getRS() {
@@ -364,14 +374,15 @@ public class SceneManager extends SceneGraphBase {
final String code = "\n" +
"varying vec2 varTex0;\n" +
"void main() {\n" +
" lowp vec4 col = texture2D(UNI_Tex0, varTex0).rgba;\n" +
" lowp vec4 col = texture2D(UNI_color, varTex0).rgba;\n" +
" gl_FragColor = col;\n" +
"}\n";
FragmentShader.Builder fb = new FragmentShader.Builder(rs);
fb.setShader(code);
fb.addTexture(Program.TextureType.TEXTURE_2D, "Tex0");
fb.addTexture(Program.TextureType.TEXTURE_2D, "color");
sSceneManager.mTexture = fb.create();
sSceneManager.mTexture.mProgram.bindSampler(Sampler.CLAMP_LINEAR_MIP_LINEAR(rs), 0);
}
return sSceneManager.mTexture;
@@ -383,10 +394,22 @@ public class SceneManager extends SceneGraphBase {
}
if (sSceneManager.mDefaultState == null) {
sSceneManager.mDefaultState = new RenderState(getDefaultVS(), getColorFS(), null, null);
sSceneManager.mDefaultState.setName("__DefaultState");
}
return sSceneManager.mDefaultState;
}
static Transform getDefaultTransform() {
if (sSceneManager == null) {
return null;
}
if (sSceneManager.mDefaultTransform == null) {
sSceneManager.mDefaultTransform = new MatrixTransform();
sSceneManager.mDefaultTransform.setName("__DefaultTransform");
}
return sSceneManager.mDefaultTransform;
}
public static SceneManager getInstance() {
if (sSceneManager == null) {
sSceneManager = new SceneManager();
@@ -444,6 +467,7 @@ public class SceneManager extends SceneGraphBase {
mColor = null;
mTexture = null;
mDefaultState = null;
mDefaultTransform = null;
mExportScript = new ScriptC_export(rs, res, R.raw.export);

View File

@@ -30,6 +30,7 @@ import android.util.Log;
public class Texture2D extends TextureBase {
String mFileName;
String mFileDir;
int mResourceID;
public Texture2D() {
super(ScriptC_export.const_TextureType_TEXTURE_2D);
@@ -40,6 +41,17 @@ public class Texture2D extends TextureBase {
setTexture(tex);
}
public Texture2D(String dir, String file) {
super(ScriptC_export.const_TextureType_TEXTURE_CUBE);
setFileDir(dir);
setFileName(file);
}
public Texture2D(int resourceID) {
super(ScriptC_export.const_TextureType_TEXTURE_2D);
mResourceID = resourceID;
}
public void setFileDir(String dir) {
mFileDir = dir;
}
@@ -62,8 +74,12 @@ public class Texture2D extends TextureBase {
void load() {
RenderScriptGL rs = SceneManager.getRS();
Resources res = SceneManager.getRes();
String shortName = mFileName.substring(mFileName.lastIndexOf('/') + 1);
setTexture(SceneManager.loadTexture2D(mFileDir + shortName, rs, res));
if (mFileName != null && mFileName.length() > 0) {
String shortName = mFileName.substring(mFileName.lastIndexOf('/') + 1);
setTexture(SceneManager.loadTexture2D(mFileDir + shortName, rs, res));
} else if (mResourceID != 0) {
setTexture(SceneManager.loadTexture2D(mResourceID, rs, res));
}
}
ScriptField_Texture_s getRsData(boolean loadNow) {

View File

@@ -31,6 +31,7 @@ import android.util.Log;
public class TextureCube extends TextureBase {
String mFileName;
String mFileDir;
int mResourceID;
public TextureCube() {
super(ScriptC_export.const_TextureType_TEXTURE_CUBE);
@@ -47,6 +48,11 @@ public class TextureCube extends TextureBase {
setFileName(file);
}
public TextureCube(int resourceID) {
super(ScriptC_export.const_TextureType_TEXTURE_2D);
mResourceID = resourceID;
}
public void setFileDir(String dir) {
mFileDir = dir;
}
@@ -69,8 +75,12 @@ public class TextureCube extends TextureBase {
void load() {
RenderScriptGL rs = SceneManager.getRS();
Resources res = SceneManager.getRes();
String shortName = mFileName.substring(mFileName.lastIndexOf('/') + 1);
setTexture(SceneManager.loadCubemap(mFileDir + shortName, rs, res));
if (mFileName != null && mFileName.length() > 0) {
String shortName = mFileName.substring(mFileName.lastIndexOf('/') + 1);
setTexture(SceneManager.loadCubemap(mFileDir + shortName, rs, res));
} else if (mResourceID != 0) {
setTexture(SceneManager.loadCubemap(mResourceID , rs, res));
}
}
ScriptField_Texture_s getRsData(boolean loadNow) {

View File

@@ -38,12 +38,13 @@ public class SimpleAppRS {
private static String TAG = "SimpleAppRS";
SceneManager mSceneManager;
ArrayList<Renderable> geometry = new ArrayList<Renderable>();
Scene mScene;
RenderScriptGL mRS;
Resources mRes;
Scene mScene;
Mesh mSimpleMesh;
public void init(RenderScriptGL rs, Resources res, int width, int height) {
mRS = rs;
mRes = res;
@@ -53,9 +54,9 @@ public class SimpleAppRS {
mScene = new Scene();
setupGeometry();
setupRenderables();
setupCamera();
setupRenderPass();
setupShaders();
mSceneManager.setActiveScene(mScene);
@@ -63,16 +64,9 @@ public class SimpleAppRS {
mRS.bindRootScript(mSceneManager.getRenderLoop());
}
private void setupShaders() {
// Built-in shader that provides position, texcoord and normal
VertexShader genericV = SceneManager.getDefaultVS();
// Built-in shader that displays a color
FragmentShader colorF = SceneManager.getColorFS();
mScene.assignRenderState(new RenderState(genericV, colorF, null, null));
}
private void setupGeometry() {
Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS,
3, Mesh.TriangleMeshBuilder.TEXTURE_0);
Mesh.TriangleMeshBuilder tmb = new Mesh.TriangleMeshBuilder(mRS, 3,
Mesh.TriangleMeshBuilder.TEXTURE_0);
tmb.setTexture(0.0f, 1.0f).addVertex(-1.0f, 1.0f, 0.0f);
tmb.setTexture(0.0f, 0.0f).addVertex(-1.0f, -1.0f, 0.0f);
@@ -81,40 +75,57 @@ public class SimpleAppRS {
tmb.addTriangle(0, 1, 2);
tmb.addTriangle(2, 3, 0);
mSimpleMesh = tmb.create(true);
}
Mesh mesh = tmb.create(true);
private void setupRenderables() {
// Built-in shader that provides position, texcoord and normal
VertexShader genericV = SceneManager.getDefaultVS();
// Built-in shader that displays a color
FragmentShader colorF = SceneManager.getColorFS();
// Built-in shader that displays a texture
FragmentShader textureF = SceneManager.getTextureFS();
RenderState colorRS = new RenderState(genericV, colorF, null, null);
ProgramStore alphaBlend = ProgramStore.BLEND_ALPHA_DEPTH_TEST(mRS);
RenderState texRS = new RenderState(genericV, textureF, alphaBlend, null);
Renderable quad = new Renderable();
quad.setMesh(mesh);
quad.setTransform(new CompoundTransform());
// Draw a simple colored quad
Renderable quad = mScene.appendNewRenderable();
quad.setMesh(mSimpleMesh);
quad.appendSourceParams(new Float4Param("color", 0.2f, 0.3f, 0.4f));
quad.setRenderState(colorRS);
mScene.appendRenderable(quad);
geometry.add(quad);
// Draw a textured quad
quad = mScene.appendNewRenderable();
quad.setMesh(mSimpleMesh);
// Make a transform to position the quad
CompoundTransform t = mScene.appendNewCompoundTransform();
t.addTranslate("position", new Float3(2, 2, 0));
quad.setTransform(t);
quad.appendSourceParams(new TextureParam("color", new Texture2D(R.drawable.icon)));
quad.setRenderState(texRS);
}
private void setupCamera() {
Camera camera = new Camera();
Camera camera = mScene.appendNewCamera();
camera.setFar(200);
camera.setNear(0.1f);
camera.setFOV(60);
CompoundTransform cameraTransform = new CompoundTransform();
CompoundTransform cameraTransform = mScene.appendNewCompoundTransform();
cameraTransform.addTranslate("camera", new Float3(0, 0, 10));
mScene.appendTransform(cameraTransform);
camera.setTransform(cameraTransform);
mScene.appendCamera(camera);
}
private void setupRenderPass() {
RenderPass mainPass = new RenderPass();
RenderPass mainPass = mScene.appendNewRenderPass();
mainPass.setClearColor(new Float4(1.0f, 1.0f, 1.0f, 1.0f));
mainPass.setShouldClearColor(true);
mainPass.setClearDepth(1.0f);
mainPass.setShouldClearDepth(true);
mainPass.setCamera(mScene.getCameras().get(0));
for (Renderable renderable : geometry) {
mainPass.appendRenderable(renderable);
ArrayList<RenderableBase> allRender = mScene.getRenderables();
for (RenderableBase renderable : allRender) {
mainPass.appendRenderable((Renderable)renderable);
}
mScene.appendRenderPass(mainPass);
}
}

View File

@@ -48,7 +48,7 @@ public class TouchHandler {
mPosValue = new Float3(0, 4, 0);
// Make a camera transform we can manipulate
mCameraRig = new CompoundTransform();
mCameraRig = scene.appendNewCompoundTransform();
mCameraRig.setName("CameraRig");
mPosition = mCameraRig.addTranslate("Position", mPosValue);
@@ -56,10 +56,8 @@ public class TouchHandler {
mRotateX = mCameraRig.addRotate("RotateX", new Float3(1, 0, 0), mRotateXValue);
mDist = mCameraRig.addTranslate("Distance", mDistValue);
scene.appendTransform(mCameraRig);
mCamera = new Camera();
mCamera = scene.appendNewCamera();
mCamera.setTransform(mCameraRig);
scene.appendCamera(mCamera);
}
public Camera getCamera() {