Use rs support for object loading.

This commit is contained in:
Jason Sams
2009-09-15 13:06:59 -07:00
parent 1291a8c236
commit 78aebd8601
2 changed files with 82 additions and 98 deletions
+27 -60
View File
@@ -5,40 +5,15 @@
#define PI 3.14159f
// Variables from java ======
// Parameters ======
#define PARAM_BUBBLE_WIDTH 0
#define PARAM_BUBBLE_HEIGHT 1
#define PARAM_BUBBLE_BITMAP_WIDTH 2
#define PARAM_BUBBLE_BITMAP_HEIGHT 3
#define PARAM_SCROLL_HANDLE_ID 4
#define PARAM_SCROLL_HANDLE_TEX_WIDTH 5
#define PARAM_SCROLL_HANDLE_TEX_HEIGHT 6
// State ======
#define STATE_ICON_COUNT 0
#define STATE_SCROLL_X 1
#define STATE_FLING_TIME 2
#define STATE_FLING_VELOCITY_X 3
#define STATE_ADJUSTED_DECELERATION 4
/* with fling offset applied */
#define STATE_CURRENT_SCROLL_X 5
#define STATE_FLING_DURATION 6
#define STATE_FLING_END_POS 7
#define STATE_START_SCROLL_X 8
#define STATE_SELECTED_ICON_INDEX 9
#define STATE_SELECTED_ICON_TEXTURE 10
#define STATE_VISIBLE 11
#define STATE_ZOOM 12
float deceleration;
// Drawing constants, should be parameters ======
#define VIEW_ANGLE 1.28700222f
void init() {
deceleration = 0;
}
int g_lastFrameTime = 0;
void print_frame_rate()
{
@@ -78,7 +53,7 @@ draw_page(int icon, int lastIcon, float centerAngle)
int row;
int col;
float scale = 1.0f - loadI32(ALLOC_STATE, STATE_ZOOM)/100000.0f;
float scale = 1.0f - state->zoom;
float iconTextureWidth = ICON_WIDTH_PX / (float)ICON_TEXTURE_WIDTH_PX;
float iconTextureHeight = ICON_HEIGHT_PX / (float)ICON_TEXTURE_HEIGHT_PX;
@@ -91,16 +66,11 @@ draw_page(int icon, int lastIcon, float centerAngle)
float farIconTextureSize = far_size(2 * ICON_TEXTURE_WIDTH_PX / (float)SCREEN_WIDTH_PX);
float labelWidthPx = loadI32(ALLOC_PARAMS, PARAM_BUBBLE_WIDTH);
float labelHeightPx = loadI32(ALLOC_PARAMS, PARAM_BUBBLE_HEIGHT);
float normalizedLabelWidth = 2 * labelWidthPx / (float)SCREEN_WIDTH_PX;
float normalizedLabelWidth = 2 * params->bubbleWidth / (float)SCREEN_WIDTH_PX;
float farLabelWidth = far_size(normalizedLabelWidth);
float farLabelHeight = far_size(labelHeightPx * (normalizedLabelWidth / labelWidthPx));
float labelTextureWidth = labelWidthPx / loadI32(ALLOC_PARAMS, PARAM_BUBBLE_BITMAP_WIDTH);
float labelTextureHeight = labelHeightPx / loadI32(ALLOC_PARAMS, PARAM_BUBBLE_BITMAP_HEIGHT);
int selectedIconIndex = loadI32(ALLOC_STATE, STATE_SELECTED_ICON_INDEX);
float farLabelHeight = far_size(params->bubbleHeight * (normalizedLabelWidth / params->bubbleWidth));
float labelTextureWidth = (float)params->bubbleWidth / params->bubbleBitmapWidth;
float labelTextureHeight = (float)params->bubbleHeight / params->bubbleBitmapHeight;
for (row=0; row<ROWS_PER_PAGE && icon<=lastIcon; row++) {
float angle = centerAngle;
@@ -131,8 +101,8 @@ draw_page(int icon, int lastIcon, float centerAngle)
float iconLeftZ = centerZ + (sine * farIconTextureSize * .5);
float iconRightZ = centerZ - (sine * farIconTextureSize * .5);
if (selectedIconIndex == icon) {
bindTexture(NAMED_PF, 0, loadI32(ALLOC_STATE, STATE_SELECTED_ICON_TEXTURE));
if (state->selectedIconIndex == icon) {
bindTexture(NAMED_PF, 0, state->selectedIconTexture);
drawQuadTexCoords(
iconLeftX, iconTextureTop, iconLeftZ, 0.0f, 0.0f,
iconRightX, iconTextureTop, iconRightZ, 1.0f, 0.0f,
@@ -173,15 +143,15 @@ main(int launchID)
pfClearColor(0.0f, 0.0f, 0.0f, 0.0f);
// If we're not supposed to be showing, don't do anything.
if (!loadI32(ALLOC_STATE, STATE_VISIBLE)) {
if (!state->visible) {
return 0;
}
// icons & labels
int iconCount = loadI32(ALLOC_STATE, STATE_ICON_COUNT);
int iconCount = state->iconCount;
int pageCount = count_pages(iconCount);
float scrollXPx = loadI32(ALLOC_STATE, STATE_SCROLL_X);
float scrollXPx = state->scrollX;
float maxScrollXPx = -(pageCount-1) * SCREEN_WIDTH_PX;
int done = 0;
@@ -194,11 +164,10 @@ main(int launchID)
}
// If we've been given a velocity, start a fling
float flingVelocityPxMs = loadI32(ALLOC_STATE, STATE_FLING_VELOCITY_X);
float flingVelocityPxMs = state->flingVelocityX;
if (flingVelocityPxMs != 0) {
// how many screens will this velocity do? TODO: use long
// G * ppi * friction // why G? // friction = 0.015
float deceleration = loadF(ALLOC_STATE, STATE_ADJUSTED_DECELERATION);
float flingDurationMs;
if (deceleration == 0) {
// On the first frame, calculate which animation we're going to do. If it's
@@ -264,18 +233,16 @@ main(int launchID)
endPos = scrollXPx + (flingVelocityPxMs*flingDurationMs)
+ ((deceleration*flingDurationMs*flingDurationMs)/2);
storeF(ALLOC_STATE, STATE_ADJUSTED_DECELERATION, deceleration);
storeF(ALLOC_STATE, STATE_FLING_DURATION, flingDurationMs);
storeF(ALLOC_STATE, STATE_FLING_END_POS, endPos);
state->flingDuration = flingDurationMs;
state->flingEndPos = endPos;
} else {
flingDurationMs = loadF(ALLOC_STATE, STATE_FLING_DURATION);
flingDurationMs = state->flingDuration;
}
// adjust the deceleration so we always hit a page boundary
int flingTime = loadI32(ALLOC_STATE, STATE_FLING_TIME);
int now = uptimeMillis();
float elapsedTime = (now - flingTime) / 1000.0f;
float elapsedTime = (now - state->flingTimeMs) / 1000.0f;
int animEndTime = -flingVelocityPxMs / deceleration;
int flingOffsetPx = (flingVelocityPxMs * elapsedTime)
@@ -283,7 +250,7 @@ main(int launchID)
scrollXPx += flingOffsetPx;
if (elapsedTime > flingDurationMs) {
scrollXPx = loadF(ALLOC_STATE, STATE_FLING_END_POS);
scrollXPx = state->flingEndPos;
done = 1;
}
} else {
@@ -297,12 +264,12 @@ main(int launchID)
if (scrollXPx < maxScrollXPx) {
scrollXPx = maxScrollXPx;
}
storeI32(ALLOC_STATE, STATE_CURRENT_SCROLL_X, scrollXPx);
state->currentScrollX = scrollXPx;
if (done) {
storeI32(ALLOC_STATE, STATE_SCROLL_X, scrollXPx);
storeI32(ALLOC_STATE, STATE_FLING_VELOCITY_X, 0);
storeF(ALLOC_STATE, STATE_ADJUSTED_DECELERATION, 0);
state->scrollX = scrollXPx;
state->flingVelocityX = 0;
deceleration = 0.f;
}
// Draw the icons ========================================
@@ -324,7 +291,7 @@ main(int launchID)
draw_page(icon, lastIcon, -VIEW_ANGLE*currentPagePosition);
draw_page(icon+iconsPerPage, lastIcon, (-VIEW_ANGLE*currentPagePosition)+VIEW_ANGLE);
// Draw the border lines for debugging ========================================
/*
bindProgramVertex(NAMED_PVOrtho);
+55 -38
View File
@@ -28,6 +28,7 @@ import android.renderscript.RenderScript;
import android.renderscript.ProgramVertex;
import android.renderscript.Element;
import android.renderscript.Allocation;
import android.renderscript.Type;
import android.renderscript.Script;
import android.renderscript.ScriptC;
import android.renderscript.ProgramFragment;
@@ -104,7 +105,7 @@ public class AllAppsView extends RSSurfaceView
public static final int COLUMNS_PER_PAGE = 4;
public static final int ROWS_PER_PAGE = 4;
public static final float RADIUS = 4.0f;
public static final int SCREEN_WIDTH_PX = 480;
@@ -199,7 +200,6 @@ public class AllAppsView extends RSSurfaceView
(-mRollo.mState.startScrollX / Defines.SCREEN_WIDTH_PX));
}
mRollo.mState.flingVelocityX = 0;
mRollo.mState.adjustedDeceleration = 0;
mRollo.mState.save();
mVelocity = VelocityTracker.obtain();
mVelocity.addMovement(ev);
@@ -282,15 +282,13 @@ public class AllAppsView extends RSSurfaceView
public void onDropCompleted(View target, boolean success) {
}
private static final int SCALE_SCALE = 100000;
public void setScale(float amount) {
cancelLongPress();
mRollo.mState.read();
mRollo.clearSelectedIcon();
if (amount > 0.001f) {
mRollo.mState.visible = 1;
mRollo.mState.zoom = (int)(SCALE_SCALE*amount);
mRollo.mState.zoom = amount;
} else {
mRollo.mState.visible = 0;
mRollo.mState.zoom = 0;
@@ -390,36 +388,53 @@ public class AllAppsView extends RSSurfaceView
Params mParams;
State mState;
class Params extends IntAllocation {
Params(RenderScript rs) {
super(rs);
class BaseAlloc {
Allocation mAlloc;
Type mType;
void save() {
mAlloc.data(this);
}
void read() {
mAlloc.read(this);
}
@AllocationIndex(0) public int bubbleWidth;
@AllocationIndex(1) public int bubbleHeight;
@AllocationIndex(2) public int bubbleBitmapWidth;
@AllocationIndex(3) public int bubbleBitmapHeight;
@AllocationIndex(4) public int scrollHandleId;
@AllocationIndex(5) public int scrollHandleTextureWidth;
@AllocationIndex(6) public int scrollHandleTextureHeight;
}
class State extends IntAllocation {
State(RenderScript rs) {
super(rs);
class Params extends BaseAlloc {
Params() {
mType = Type.createFromClass(mRS, Params.class, 1, "ParamsClass");
mAlloc = Allocation.createTyped(mRS, mType);
save();
}
public int bubbleWidth;
public int bubbleHeight;
public int bubbleBitmapWidth;
public int bubbleBitmapHeight;
public int scrollHandleId;
public int scrollHandleTextureWidth;
public int scrollHandleTextureHeight;
}
class State extends BaseAlloc {
public int iconCount;
public int scrollX;
public int flingTimeMs;
public float flingVelocityX;
public int currentScrollX;
public int flingDuration;
public int flingEndPos;
public int startScrollX;
public int selectedIconIndex = -1;
public int selectedIconTexture;
public int visible;
public float zoom;
State() {
mType = Type.createFromClass(mRS, State.class, 1, "StateClass");
mAlloc = Allocation.createTyped(mRS, mType);
save();
}
@AllocationIndex(0) public int iconCount;
@AllocationIndex(1) public int scrollX;
@AllocationIndex(2) public int flingTimeMs;
@AllocationIndex(3) public int flingVelocityX;
@AllocationIndex(4) public int adjustedDeceleration;
@AllocationIndex(5) public int currentScrollX;
@AllocationIndex(6) public int flingDuration;
@AllocationIndex(7) public int flingEndPos;
@AllocationIndex(8) public int startScrollX;
@AllocationIndex(9) public int selectedIconIndex = -1;
@AllocationIndex(10) public int selectedIconTexture;
@AllocationIndex(11) public int visible;
@AllocationIndex(12) public int zoom;
}
public RolloRS() {
@@ -510,10 +525,10 @@ public class AllAppsView extends RSSurfaceView
Log.e("rs", "Done loading named");
}
private void initData() {
mParams = new Params(mRS);
mState = new State(mRS);
mParams = new Params();
mState = new State();
final Utilities.BubbleText bubble = new Utilities.BubbleText(getContext());
@@ -547,11 +562,13 @@ public class AllAppsView extends RSSurfaceView
sb.setScript(mRes, R.raw.rollo);
sb.setRoot(true);
sb.addDefines(Defines.class);
sb.setType(mParams.mType, "params", Defines.ALLOC_PARAMS);
sb.setType(mState.mType, "state", Defines.ALLOC_STATE);
mScript = sb.create();
mScript.setClearColor(0.0f, 0.0f, 0.0f, 0.0f);
mScript.bindAllocation(mParams.getAllocation(), Defines.ALLOC_PARAMS);
mScript.bindAllocation(mState.getAllocation(), Defines.ALLOC_STATE);
mScript.bindAllocation(mParams.mAlloc, Defines.ALLOC_PARAMS);
mScript.bindAllocation(mState.mAlloc, Defines.ALLOC_STATE);
mScript.bindAllocation(mAllocIconID, Defines.ALLOC_ICON_IDS);
mScript.bindAllocation(mAllocLabelID, Defines.ALLOC_LABEL_IDS);
mScript.bindAllocation(mAllocTouchXBorders, Defines.ALLOC_X_BORDERS);
@@ -628,7 +645,7 @@ public class AllAppsView extends RSSurfaceView
mTouchYBorders[4] = centerY + (int)(2.4f * cellHeight);
mAllocTouchYBorders.data(mTouchYBorders);
int centerX = (width / 2);
mTouchXBorders[0] = centerX - (2 * cellWidth);
mTouchXBorders[1] = centerX - (int)(0.83f * cellWidth);;
@@ -660,7 +677,7 @@ public class AllAppsView extends RSSurfaceView
return -1;
}
return (currentPage * Defines.ROWS_PER_PAGE * Defines.COLUMNS_PER_PAGE)
return (currentPage * Defines.ROWS_PER_PAGE * Defines.COLUMNS_PER_PAGE)
+ (row * Defines.ROWS_PER_PAGE) + col;
}