Use rs support for object loading.
This commit is contained in:
+27
-60
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user