blob: cee6e22577923cb7c9b231f2257f65228db7e5df [file] [log] [blame]
// Fountain test script
main(con, ft, launchID) {
int count, touch, x, y, rate, maxLife, lifeShift;
int life;
int ct, ct2;
int newPart;
int drawCount;
int dx, dy, idx;
int partPtr;
int vertPtr;
int posx,posy;
int c;
count = loadI32(con, 0, 1);
touch = loadI32(con, 0, 2);
x = loadI32(con, 0, 3);
y = loadI32(con, 0, 4);
rate = 4;
maxLife = (count / rate) - 1;
lifeShift = 0;
{
life = maxLife;
while (life > 255) {
life = life >> 1;
lifeShift ++;
}
}
contextBindProgramFragment(con, loadI32(con, 0, 7));
drawRect(con, 0, 256, 0, 512);
contextBindProgramFragment(con, loadI32(con, 0, 6));
if (touch) {
newPart = loadI32(con, 2, 0);
for (ct2=0; ct2<rate; ct2++) {
dx = scriptRand(con, 0x10000) - 0x8000;
dy = scriptRand(con, 0x10000) - 0x8000;
idx = newPart * 5 + 1;
storeI32(con, 2, idx, dx);
storeI32(con, 2, idx + 1, dy);
storeI32(con, 2, idx + 2, maxLife);
storeI32(con, 2, idx + 3, x << 16);
storeI32(con, 2, idx + 4, y << 16);
newPart++;
if (newPart >= count) {
newPart = 0;
}
}
storeI32(con, 2, 0, newPart);
}
// Emulate intrinsic perf...
partPtr = loadVp(con, 2, 4);
vertPtr = loadVp(con, 1, 0);
drawCount = 0;
for (ct=0; ct < count; ct++) {
//int srcIdx = ct * 5 + 1;
//int dstIdx = ct * 3 * 3;
dx = * (int* )(partPtr + 0); //loadEnvI32(con, 2, srcIdx);
dy = * (int* )(partPtr + 4); //loadEnvI32(con, 2, srcIdx + 1);
life = * (int* )(partPtr + 8); //loadEnvI32(con, 2, srcIdx + 2);
posx = * (int* )(partPtr + 12); //loadEnvI32(con, 2, srcIdx + 3);
posy = * (int* )(partPtr + 16); //loadEnvI32(con, 2, srcIdx + 4);
if (life) {
if (posy < (480 << 16)) {
c = 0xffafcf | ((life >> lifeShift) << 24);
* (int* )(vertPtr) = c; //storeEnvU32(con, 1, dstIdx, c);
* (int* )(vertPtr + 4) = posx; //storeEnvI32(con, 1, dstIdx + 1, posx);
* (int* )(vertPtr + 8) = posy; //storeEnvI32(con, 1, dstIdx + 2, posy);
* (int* )(vertPtr + 12) = c; //storeEnvU32(con, 1, dstIdx + 3, c);
* (int* )(vertPtr + 16) = posx + 0x10000; //storeEnvI32(con, 1, dstIdx + 4, posx + 0x10000);
* (int* )(vertPtr + 20) = posy + dy * 4; //storeEnvI32(con, 1, dstIdx + 5, posy);
* (int* )(vertPtr + 24) = c; //storeEnvU32(con, 1, dstIdx + 6, c);
* (int* )(vertPtr + 28) = posx - 0x10000; //storeEnvI32(con, 1, dstIdx + 7, posx + 0x0800);
* (int* )(vertPtr + 32) = posy + dy * 4; //storeEnvI32(con, 1, dstIdx + 8, posy + 0x10000);
vertPtr = vertPtr + 36;
drawCount ++;
} else {
if (dy > 0) {
dy = (-dy) >> 1;
}
}
posx = posx + dx;
posy = posy + dy;
dy = dy + 0x400;
life --;
* (int* )(partPtr + 0) = dx; //storeEnvI32(con, 2, srcIdx, dx);
* (int* )(partPtr + 4) = dy; //storeEnvI32(con, 2, srcIdx + 1, dy);
* (int* )(partPtr + 8) = life; //storeEnvI32(con, 2, srcIdx + 2, life);
* (int* )(partPtr + 12) = posx; //storeEnvI32(con, 2, srcIdx + 3, posx);
* (int* )(partPtr + 16) = posy; //storeEnvI32(con, 2, srcIdx + 4, posy);
}
partPtr = partPtr + 20;
}
drawTriangleArray(con, loadI32(con, 0, 5), drawCount);
}