// Fountain test script #pragma version(1) #pragma stateVertex(PVBackground) #pragma stateFragment(PFBackground) #pragma stateStore(PSBackground) #define STATE_TRIANGLE_OFFSET_COUNT 0 #define STATE_LAST_FOCUS 1 // The script enviroment has 3 env allocations. // bank0: (r) The enviroment structure // bank1: (r) The position information // bank2: (rw) The temporary texture state int lastFocus; int main(int index) { float mat1[16]; float trans = Pos->translate; float rot = Pos->rotate; matrixLoadScale(mat1, 2.f, 2.f, 2.f); matrixTranslate(mat1, 0.f, 0.f, trans); matrixRotate(mat1, 90.f, 0.f, 0.f, 1.f); matrixRotate(mat1, rot, 1.f, 0.f, 0.f); vpLoadModelMatrix(mat1); // Draw the lighting effect in the strip and fill the Z buffer. drawSimpleMesh(NAMED_mesh); // Start of images. bindProgramStore(NAMED_PSImages); bindProgramFragment(NAMED_PFImages); bindProgramVertex(NAMED_PVImages); float focusPos = Pos->focus; int focusID = 0; int lastFocusID = loadI32(2, STATE_LAST_FOCUS); int imgCount = 13; if (trans > (-.3f)) { focusID = -1.0f - focusPos; if (focusID >= imgCount) { focusID = -1; } } else { focusID = -1; } /* if (focusID != lastFocusID) { if (lastFocusID >= 0) { uploadToTexture(con, env->tex[lastFocusID], 1); } if (focusID >= 0) { uploadToTexture(con, env->tex[focusID], 0); } } */ lastFocus = focusID; int triangleOffsetsCount = Pos->triangleOffsetCount; int imgId = 0; for (imgId=1; imgId <= imgCount; imgId++) { float pos = focusPos + imgId + 0.4f; int offset = (int)floorf(pos * 2.f); pos = pos - 0.75f; offset = offset + triangleOffsetsCount / 2; if (!((offset < 0) || (offset >= triangleOffsetsCount))) { int start = offset -2; int end = offset + 2; if (start < 0) { start = 0; } if (end >= triangleOffsetsCount) { end = triangleOffsetsCount-1; } bindTexture(NAMED_PFImages, 0, loadI32(0, imgId - 1)); matrixLoadTranslate(mat1, -pos - loadF(5, triangleOffsetsCount / 2), 0, 0); vpLoadTextureMatrix(mat1); drawSimpleMeshRange(NAMED_mesh, loadI32(4, start), (loadI32(4, end) - loadI32(4, start))); } } return 0; }