Merge change 22014 into eclair

* changes:
  Improved performance in Galaxy and Fall
This commit is contained in:
Android (Google) Code Review
2009-08-19 17:16:42 -07:00
5 changed files with 97 additions and 91 deletions

View File

@@ -240,7 +240,7 @@ void generateRipples() {
n2y = v3y - v1y; n2y = v3y - v1y;
n2z = v3z - v1z; n2z = v3z - v1z;
// Avegare of previous normal and N1 x N2 // Average of previous normal and N1 x N2
n3x = n3x / 2.0f + (n1y * n2z - n1z * n2y) / 2.0f; n3x = n3x / 2.0f + (n1y * n2z - n1z * n2y) / 2.0f;
n3y = n3y / 2.0f + (n1z * n2x - n1x * n2z) / 2.0f; n3y = n3y / 2.0f + (n1z * n2x - n1x * n2z) / 2.0f;
n3z = n3z / 2.0f + (n1x * n2y - n1y * n2x) / 2.0f; n3z = n3z / 2.0f + (n1x * n2y - n1y * n2x) / 2.0f;
@@ -264,10 +264,10 @@ void generateRipples() {
float averageZ(float x1, float x2, float y1, float y2, float* vertices, float averageZ(float x1, float x2, float y1, float y2, float* vertices,
int meshWidth, int meshHeight, float glWidth, float glHeight) { int meshWidth, int meshHeight, float glWidth, float glHeight) {
x1 = ((x1 + glWidth / 2.0f) / glWidth) * meshWidth; x1 = ((x1 + glWidth * 0.5f) / glWidth) * meshWidth;
x2 = ((x2 + glWidth / 2.0f) / glWidth) * meshWidth; x2 = ((x2 + glWidth * 0.5f) / glWidth) * meshWidth;
y1 = ((y1 + glHeight / 2.0f) / glHeight) * meshHeight; y1 = ((y1 + glHeight * 0.5f) / glHeight) * meshHeight;
y2 = ((y2 + glHeight / 2.0f) / glHeight) * meshHeight; y2 = ((y2 + glHeight * 0.5f) / glHeight) * meshHeight;
int quadX1 = clamp(x1, 0, meshWidth); int quadX1 = clamp(x1, 0, meshWidth);
int quadX2 = clamp(x2, 0, meshWidth); int quadX2 = clamp(x2, 0, meshWidth);
@@ -319,10 +319,10 @@ void drawLeaf(int index, float* vertices, int meshWidth, int meshHeight,
if (a > 0.0f) { if (a > 0.0f) {
tz = -a; tz = -a;
} else { } else {
z1 = averageZ(x1, x, y1, y, vertices, meshWidth, meshHeight, glWidth, glHeight); // z1 = averageZ(x1, x, y1, y, vertices, meshWidth, meshHeight, glWidth, glHeight);
z2 = averageZ(x, x2, y1, y, vertices, meshWidth, meshHeight, glWidth, glHeight); // z2 = averageZ(x, x2, y1, y, vertices, meshWidth, meshHeight, glWidth, glHeight);
z3 = averageZ(x, x2, y, y2, vertices, meshWidth, meshHeight, glWidth, glHeight); // z3 = averageZ(x, x2, y, y2, vertices, meshWidth, meshHeight, glWidth, glHeight);
z4 = averageZ(x1, x, y, y2, vertices, meshWidth, meshHeight, glWidth, glHeight); // z4 = averageZ(x1, x, y, y2, vertices, meshWidth, meshHeight, glWidth, glHeight);
} }
x1 -= x; x1 -= x;
@@ -454,6 +454,34 @@ void drawLighting() {
drawTriangleMesh(NAMED_WaterMesh); drawTriangleMesh(NAMED_WaterMesh);
} }
void drawNormals() {
int width = State_meshWidth;
int height = State_meshHeight;
float *vertices = loadTriangleMeshVerticesF(NAMED_WaterMesh);
bindProgramVertex(NAMED_PVSky);
bindProgramFragment(NAMED_PFLighting);
color(1.0f, 0.0f, 0.0f, 1.0f);
int y = 0;
for ( ; y < height; y++) {
int yOffset = y * width;
int x = 0;
for ( ; x < width; x++) {
int offset = (yOffset + x) * 8;
float vx = vertices[offset + 5];
float vy = vertices[offset + 6];
float vz = vertices[offset + 7];
float nx = vertices[offset + 0];
float ny = vertices[offset + 1];
float nz = vertices[offset + 2];
drawLine(vx, vy, vz, vx + nx / 10.0f, vy + ny / 10.0f, vz + nz / 10.0f);
}
}
}
int main(int index) { int main(int index) {
int dropX = Drop_dropX; int dropX = Drop_dropX;
if (dropX != -1) { if (dropX != -1) {
@@ -471,6 +499,7 @@ int main(int index) {
drawSky(); drawSky();
drawLighting(); drawLighting();
drawLeaves(); drawLeaves();
//drawNormals();
return 1; return 1;
} }

View File

@@ -177,22 +177,37 @@ class FallRS {
hResolution += 2; hResolution += 2;
for (int y = 0; y <= hResolution; y++) { for (int y = 0; y <= hResolution; y++) {
final boolean shift = (y & 0x1) == 0;
final float yOffset = y * quadHeight - glHeight / 2.0f - quadHeight; final float yOffset = y * quadHeight - glHeight / 2.0f - quadHeight;
final float t = 1.0f - y / (float) hResolution; final float t = 1.0f - y / (float) hResolution;
for (int x = 0; x <= wResolution; x++) { for (int x = 0; x <= wResolution; x++) {
rs.triangleMeshAddVertex_XYZ_ST_NORM( if (shift) {
-1.0f + x * quadWidth - quadWidth, yOffset, 0.0f, rs.triangleMeshAddVertex_XYZ_ST_NORM(
x / (float) wResolution, t, -1.0f + x * quadWidth - quadWidth, yOffset, 0.0f,
0.0f, 0.0f, -1.0f); x / (float) wResolution, t,
0.0f, 0.0f, -1.0f);
} else {
rs.triangleMeshAddVertex_XYZ_ST_NORM(
-1.0f + x * quadWidth - quadWidth * 0.5f, yOffset, 0.0f,
x / (float) wResolution, t,
0.0f, 0.0f, -1.0f);
}
} }
} }
for (int y = 0; y < hResolution; y++) { for (int y = 0; y < hResolution; y++) {
final boolean shift = (y & 0x1) == 0;
final int yOffset = y * (wResolution + 1);
for (int x = 0; x < wResolution; x++) { for (int x = 0; x < wResolution; x++) {
final int index = y * (wResolution + 1) + x; final int index = yOffset + x;
final int iWR1 = index + wResolution + 1; final int iWR1 = index + wResolution + 1;
rs.triangleMeshAddTriangle(index, index + 1, iWR1); if (shift) {
rs.triangleMeshAddTriangle(index + 1, iWR1, iWR1 + 1); rs.triangleMeshAddTriangle(index, index + 1, iWR1);
rs.triangleMeshAddTriangle(index + 1, iWR1 + 1, iWR1);
} else {
rs.triangleMeshAddTriangle(index, iWR1 + 1, iWR1);
rs.triangleMeshAddTriangle(index, index + 1, iWR1 + 1);
}
} }
} }

View File

@@ -19,11 +19,13 @@
#define RSID_PARTICLES 1 #define RSID_PARTICLES 1
#define PARTICLE_STRUCT_FIELDS_COUNT 4 #define PARTICLE_STRUCT_FIELDS_COUNT 6
#define PARTICLE_STRUCT_ANGLE 0 #define PARTICLE_STRUCT_ANGLE 0
#define PARTICLE_STRUCT_DISTANCE 1 #define PARTICLE_STRUCT_DISTANCE 1
#define PARTICLE_STRUCT_SPEED 2 #define PARTICLE_STRUCT_SPEED 2
#define PARTICLE_STRUCT_RADIUS 3 #define PARTICLE_STRUCT_RADIUS 3
#define PARTICLE_STRUCT_S 4
#define PARTICLE_STRUCT_T 5
#define RSID_PARTICLES_BUFFER 2 #define RSID_PARTICLES_BUFFER 2
#define PARTICLE_BUFFER_COMPONENTS_COUNT 5 #define PARTICLE_BUFFER_COMPONENTS_COUNT 5
@@ -31,19 +33,14 @@
#define PARTICLES_TEXTURES_COUNT 2 #define PARTICLES_TEXTURES_COUNT 2
#define ELLIPSE_RATIO 0.892f #define ELLIPSE_RATIO 0.892f
#define ELLIPSE_TWIST 0.02333333333f
void drawSpace(int width, int height) { void drawSpace(int width, int height) {
bindTexture(NAMED_PFBackground, 0, NAMED_TSpace); bindTexture(NAMED_PFBackground, 0, NAMED_TSpace);
drawQuadTexCoords( drawQuadTexCoords(
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, width, 0.0f, 0.0f, 2.0f, 1.0f,
width, 0.0f, 0.0f, width, height, 0.0f, 2.0f, 0.0f,
2.0f, 1.0f, 0.0f, height, 0.0f, 0.0f, 0.0f);
width, height, 0.0f,
2.0f, 0.0f,
0.0f, height, 0.0f,
0.0f, 0.0f);
} }
void drawLights(int width, int height) { void drawLights(int width, int height) {
@@ -61,39 +58,34 @@ void drawLights(int width, int height) {
x + 512.0f * 1.1f, y + 512.0f, 0.0f); x + 512.0f * 1.1f, y + 512.0f, 0.0f);
} }
void drawParticle(float *particle, int index, float *particleBuffer, int bufferIndex, void drawParticle(float *particle, float *particleBuffer, float w, float h) {
float w, float h) { float distance = particle[PARTICLE_STRUCT_DISTANCE];
float angle = particle[PARTICLE_STRUCT_ANGLE];
float distance = particle[index + PARTICLE_STRUCT_DISTANCE]; float speed = particle[PARTICLE_STRUCT_SPEED];
float angle = particle[index + PARTICLE_STRUCT_ANGLE]; float r = particle[PARTICLE_STRUCT_RADIUS];
float speed = particle[index + PARTICLE_STRUCT_SPEED];
float r = particle[index + PARTICLE_STRUCT_RADIUS];
float a = angle + speed; float a = angle + speed;
float x = distance * sinf_fast(a); float x = distance * sinf_fast(a);
float y = distance * cosf_fast(a) * ELLIPSE_RATIO; float y = distance * cosf_fast(a) * ELLIPSE_RATIO;
float z = distance * ELLIPSE_TWIST; float s = particle[PARTICLE_STRUCT_S];
float s = cosf_fast(z); float t = particle[PARTICLE_STRUCT_T];
float t = sinf_fast(z);
float sX = t * x + s * y + w; float sX = t * x + s * y + w;
float sY = s * x - t * y + h; float sY = s * x - t * y + h;
// lower left vertex of the particle's triangle // lower left vertex of the particle's triangle
particleBuffer[bufferIndex + 1] = sX - r; // X particleBuffer[1] = sX - r; // X
particleBuffer[bufferIndex + 2] = sY + r; // Y particleBuffer[2] = sY + r; // Y
// lower right vertex of the particle's triangle // lower right vertex of the particle's triangle
bufferIndex += PARTICLE_BUFFER_COMPONENTS_COUNT; particleBuffer[6] = sX + r; // X
particleBuffer[bufferIndex + 1] = sX + r; // X particleBuffer[7] = sY + r; // Y
particleBuffer[bufferIndex + 2] = sY + r; // Y
// upper middle vertex of the particle's triangle // upper middle vertex of the particle's triangle
bufferIndex += PARTICLE_BUFFER_COMPONENTS_COUNT; particleBuffer[11] = sX; // X
particleBuffer[bufferIndex + 1] = sX; // X particleBuffer[12] = sY - r; // Y
particleBuffer[bufferIndex + 2] = sY - r; // Y
particle[index + PARTICLE_STRUCT_ANGLE] = a; particle[PARTICLE_STRUCT_ANGLE] = a;
} }
void drawParticles(int width, int height) { void drawParticles(int width, int height) {
@@ -103,7 +95,6 @@ void drawParticles(int width, int height) {
int radius = State_galaxyRadius; int radius = State_galaxyRadius;
int particlesCount = State_particlesCount; int particlesCount = State_particlesCount;
int count = particlesCount * PARTICLE_STRUCT_FIELDS_COUNT;
float *particle = loadArrayF(RSID_PARTICLES, 0); float *particle = loadArrayF(RSID_PARTICLES, 0);
float *particleBuffer = loadArrayF(RSID_PARTICLES_BUFFER, 0); float *particleBuffer = loadArrayF(RSID_PARTICLES_BUFFER, 0);
@@ -112,11 +103,11 @@ void drawParticles(int width, int height) {
float h = height * 0.5f; float h = height * 0.5f;
int i = 0; int i = 0;
int bufferIndex = 0; for ( ; i < particlesCount; i++) {
for ( ; i < count; i += PARTICLE_STRUCT_FIELDS_COUNT) { drawParticle(particle, particleBuffer, w, h);
drawParticle(particle, i, particleBuffer, bufferIndex, w, h); particle += PARTICLE_STRUCT_FIELDS_COUNT;
// each particle is a triangle (3 vertices) of 6 properties (ABGR, X, Y, Z, S, T) // each particle is a triangle (3 vertices) of 5 properties (ABGR, X, Y, S, T)
bufferIndex += 3 * PARTICLE_BUFFER_COMPONENTS_COUNT; particleBuffer += 3 * PARTICLE_BUFFER_COMPONENTS_COUNT;
} }
uploadToBufferObject(NAMED_ParticlesBuffer); uploadToBufferObject(NAMED_ParticlesBuffer);

View File

@@ -42,9 +42,11 @@ import static android.util.MathUtils.*;
import java.util.TimeZone; import java.util.TimeZone;
@SuppressWarnings({"FieldCanBeLocal"})
class GalaxyRS { class GalaxyRS {
private static final int GALAXY_RADIUS = 300; private static final int GALAXY_RADIUS = 300;
private static final int PARTICLES_COUNT = 12000; private static final int PARTICLES_COUNT = 12000;
private static final float ELLIPSE_TWIST = 0.023333333f;
private static final int RSID_STATE = 0; private static final int RSID_STATE = 0;
@@ -54,11 +56,13 @@ class GalaxyRS {
private static final int RSID_TEXTURE_FLARES = 2; private static final int RSID_TEXTURE_FLARES = 2;
private static final int RSID_PARTICLES = 1; private static final int RSID_PARTICLES = 1;
private static final int PARTICLE_STRUCT_FIELDS_COUNT = 4; private static final int PARTICLE_STRUCT_FIELDS_COUNT = 6;
private static final int PARTICLE_STRUCT_ANGLE = 0; private static final int PARTICLE_STRUCT_ANGLE = 0;
private static final int PARTICLE_STRUCT_DISTANCE = 1; private static final int PARTICLE_STRUCT_DISTANCE = 1;
private static final int PARTICLE_STRUCT_SPEED = 2; private static final int PARTICLE_STRUCT_SPEED = 2;
private static final int PARTICLE_STRUCT_RADIUS = 3; private static final int PARTICLE_STRUCT_RADIUS = 3;
private static final int PARTICLE_STRUCT_S = 4;
private static final int PARTICLE_STRUCT_T = 5;
private static final int RSID_PARTICLES_BUFFER = 2; private static final int RSID_PARTICLES_BUFFER = 2;
@@ -103,35 +107,6 @@ class GalaxyRS {
initRS(); initRS();
} }
public void destroy() {
mScript.destroy();
mSampler.destroy();
mLightSampler.destroy();
mPfBackground.destroy();
mPfsBackground.destroy();
mPvBackground.destroy();
mPvOrthoAlloc.mAlloc.destroy();
for (Allocation a : mTextures) {
a.destroy();
}
mState.destroy();
mPfLighting.destroy();
mParticles.destroy();
mPfsLights.destroy();
mParticlesMesh.destroy();
mParticlesBuffer.destroy();
mStateType.destroy();
}
@Override
protected void finalize() throws Throwable {
try {
destroy();
} finally {
super.finalize();
}
}
private void initRS() { private void initRS() {
createProgramVertex(); createProgramVertex();
createProgramFragmentStore(); createProgramFragmentStore();
@@ -218,12 +193,15 @@ class GalaxyRS {
float d = abs(randomGauss()) * GALAXY_RADIUS / 2.0f + random(-4.0f, 4.0f); float d = abs(randomGauss()) * GALAXY_RADIUS / 2.0f + random(-4.0f, 4.0f);
float z = randomGauss() * 0.5f * 0.8f * ((GALAXY_RADIUS - d) / (float) GALAXY_RADIUS); float z = randomGauss() * 0.5f * 0.8f * ((GALAXY_RADIUS - d) / (float) GALAXY_RADIUS);
z += 1.0f; z += 1.0f;
float p = d * ELLIPSE_TWIST;
particles[index + PARTICLE_STRUCT_ANGLE] = random(0.0f, (float) (Math.PI * 2.0)); particles[index + PARTICLE_STRUCT_ANGLE] = random(0.0f, (float) (Math.PI * 2.0));
particles[index + PARTICLE_STRUCT_DISTANCE] = d; particles[index + PARTICLE_STRUCT_DISTANCE] = d;
particles[index + PARTICLE_STRUCT_SPEED] = random(0.0015f, 0.0025f) * particles[index + PARTICLE_STRUCT_SPEED] = random(0.0015f, 0.0025f) *
(0.5f + (0.5f * (float) GALAXY_RADIUS / d)) * 0.7f; (0.5f + (0.5f * (float) GALAXY_RADIUS / d)) * 0.7f;
particles[index + PARTICLE_STRUCT_RADIUS] = z * random(1.2f, 2.1f); particles[index + PARTICLE_STRUCT_RADIUS] = z * random(1.2f, 2.1f);
particles[index + PARTICLE_STRUCT_S] = (float) Math.cos(p);
particles[index + PARTICLE_STRUCT_T] = (float) Math.sin(p);
int red, green, blue; int red, green, blue;
if (d < GALAXY_RADIUS / 3.0f) { if (d < GALAXY_RADIUS / 3.0f) {

View File

@@ -22,8 +22,6 @@ import android.renderscript.RenderScript;
import android.renderscript.RSSurfaceView; import android.renderscript.RSSurfaceView;
class GalaxyView extends RSSurfaceView { class GalaxyView extends RSSurfaceView {
private GalaxyRS mRender;
public GalaxyView(Context context) { public GalaxyView(Context context) {
super(context); super(context);
setFocusable(true); setFocusable(true);
@@ -34,12 +32,7 @@ class GalaxyView extends RSSurfaceView {
super.surfaceChanged(holder, format, w, h); super.surfaceChanged(holder, format, w, h);
RenderScript RS = createRenderScript(); RenderScript RS = createRenderScript();
mRender = new GalaxyRS(w, h); GalaxyRS render = new GalaxyRS(w, h);
mRender.init(RS, getResources()); render.init(RS, getResources());
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mRender != null) mRender.destroy();
} }
} }