void C_BspNode::DistributePointsAlongPartitionPlane(void) { C_Vertex min , max , tmp; min.x = min.y = min.z = GREATEST_FLOAT; max.x = max.y = max.z = SMALLEST_FLOAT; vector<C_Vertex> intersectionPoints = FindBBoxPlaneIntersections(&bbox , &partitionPlane); float maxU , maxV , minU , minV; float tmpU , tmpV; maxU = maxV = SMALLEST_FLOAT; minU = minV = GREATEST_FLOAT; // dist = SMALLEST_FLOAT; for(USHORT i = 0 ; i < intersectionPoints.size() ; i++) { CalculateUV(&partitionPlane , &intersectionPoints[i] , &tmpU , &tmpV); if(tmpU > maxU) { maxU = tmpU; } if(tmpV > maxV) { maxV = tmpV; } if(tmpU < minU) { minU = tmpU; } if(tmpV < minV) { minV = tmpV; } } float stepU = abs(maxU - minU) / NPOINTS_U; float stepV = abs(maxV - minV) / NPOINTS_V; C_Vector3 P; C_Vector3 A(&partitionPlane.points[0]); C_Vector3 B(&partitionPlane.points[1]); C_Vector3 C(&partitionPlane.points[2]); C_Vector3 v0 = C - A; C_Vector3 v1 = B - A; for(float uu = minU ; uu < maxU ; uu += stepU) { for(float vv = minV ; vv < maxV ; vv += stepV) { P = A + v0 * uu + v1 * vv; tmp.x = P.x; tmp.y = P.y; tmp.z = P.z; pointSet.push_back(tmp); } } }
btSoftBody* btSoftBodyHelpers::CreatePatchUV(btSoftBodyWorldInfo& worldInfo, const btVector3& corner00, const btVector3& corner10, const btVector3& corner01, const btVector3& corner11, int resx, int resy, int fixeds, bool gendiags, float* tex_coords) { /* * * corners: * * [0][0] corner00 ------- corner01 [resx][0] * | | * | | * [0][resy] corner10 -------- corner11 [resx][resy] * * * * * * * "fixedgs" map: * * corner00 --> +1 * corner01 --> +2 * corner10 --> +4 * corner11 --> +8 * upper middle --> +16 * left middle --> +32 * right middle --> +64 * lower middle --> +128 * center --> +256 * * * tex_coords size (resx-1)*(resy-1)*12 * * * * SINGLE QUAD INTERNALS * * 1) btSoftBody's nodes and links, * diagonal link is optional ("gendiags") * * * node00 ------ node01 * | . * | . * | . * | . * | . * node10 node11 * * * * 2) Faces: * two triangles, * UV Coordinates (hier example for single quad) * * (0,1) (0,1) (1,1) * 1 |\ 3 \-----| 2 * | \ \ | * | \ \ | * | \ \ | * | \ \ | * 2 |-----\ 3 \| 1 * (0,0) (1,0) (1,0) * * * * * * */ #define IDX(_x_,_y_) ((_y_)*rx+(_x_)) /* Create nodes */ if((resx<2)||(resy<2)) return(0); const int rx=resx; const int ry=resy; const int tot=rx*ry; btVector3* x=new btVector3[tot]; btScalar* m=new btScalar[tot]; int iy; for(iy=0;iy<ry;++iy) { const btScalar ty=iy/(btScalar)(ry-1); const btVector3 py0=lerp(corner00,corner01,ty); const btVector3 py1=lerp(corner10,corner11,ty); for(int ix=0;ix<rx;++ix) { const btScalar tx=ix/(btScalar)(rx-1); x[IDX(ix,iy)]=lerp(py0,py1,tx); m[IDX(ix,iy)]=1; } } btSoftBody* psb=new btSoftBody(&worldInfo,tot,x,m); if(fixeds&1) psb->setMass(IDX(0,0),0); if(fixeds&2) psb->setMass(IDX(rx-1,0),0); if(fixeds&4) psb->setMass(IDX(0,ry-1),0); if(fixeds&8) psb->setMass(IDX(rx-1,ry-1),0); if(fixeds&16) psb->setMass(IDX((rx-1)/2,0),0); if(fixeds&32) psb->setMass(IDX(0,(ry-1)/2),0); if(fixeds&64) psb->setMass(IDX(rx-1,(ry-1)/2),0); if(fixeds&128) psb->setMass(IDX((rx-1)/2,ry-1),0); if(fixeds&256) psb->setMass(IDX((rx-1)/2,(ry-1)/2),0); delete[] x; delete[] m; int z = 0; /* Create links and faces */ for(iy=0;iy<ry;++iy) { for(int ix=0;ix<rx;++ix) { const bool mdx=(ix+1)<rx; const bool mdy=(iy+1)<ry; int node00=IDX(ix,iy); int node01=IDX(ix+1,iy); int node10=IDX(ix,iy+1); int node11=IDX(ix+1,iy+1); if(mdx) psb->appendLink(node00,node01); if(mdy) psb->appendLink(node00,node10); if(mdx&&mdy) { psb->appendFace(node00,node10,node11); if (tex_coords) { tex_coords[z+0]=CalculateUV(resx,resy,ix,iy,0); tex_coords[z+1]=CalculateUV(resx,resy,ix,iy,1); tex_coords[z+2]=CalculateUV(resx,resy,ix,iy,0); tex_coords[z+3]=CalculateUV(resx,resy,ix,iy,2); tex_coords[z+4]=CalculateUV(resx,resy,ix,iy,3); tex_coords[z+5]=CalculateUV(resx,resy,ix,iy,2); } psb->appendFace(node11,node01,node00); if (tex_coords) { tex_coords[z+6 ]=CalculateUV(resx,resy,ix,iy,3); tex_coords[z+7 ]=CalculateUV(resx,resy,ix,iy,2); tex_coords[z+8 ]=CalculateUV(resx,resy,ix,iy,3); tex_coords[z+9 ]=CalculateUV(resx,resy,ix,iy,1); tex_coords[z+10]=CalculateUV(resx,resy,ix,iy,0); tex_coords[z+11]=CalculateUV(resx,resy,ix,iy,1); } if (gendiags) psb->appendLink(node00,node11); z += 12; } } } /* Finished */ #undef IDX return(psb); }
void GridScrollTest() { int done = 0, speed = 1, acc = 1, x = 0, y = 0, pause = 0, direction = 0; int angle = 0; u32 pressed; ImagePtr back, backsquares, backdiag; backdiag = LoadImage(DIAGONALIMG, 1); if(!backdiag) return; backsquares = LoadImage(CIRCLESGRIDIMG, 1); if(!backsquares) { FreeImage(&backdiag); return; } backsquares->x = -0.5*dW; backsquares->y = -0.5*dH; back = backsquares; while(!done && !EndProgram) { Mtx m; StartSceneMtx(&m); if(speed > 5) speed = 5; if(speed < 1) speed = 1; if(!pause) { if(direction) x += speed * acc; else y += speed * acc; } CalculateUV(x, y, dW*2, dH*2, back); DrawImageRotate(back, angle, &m); EndScene(); ControllerScan(); pressed = Controller_ButtonsDown(0); if (pressed & PAD_TRIGGER_R) { if(angle) angle = 0; else { angle = 45; back = backsquares; } } if (pressed & PAD_TRIGGER_L) { if(back == backsquares) { back = backdiag; if(angle) angle = 0; } else back = backsquares; } if (pressed & PAD_BUTTON_UP) speed ++; if (pressed & PAD_BUTTON_DOWN) speed --; if (pressed & PAD_BUTTON_B) done = 1; if (pressed & PAD_BUTTON_A) pause = !pause; if (pressed & PAD_BUTTON_X) acc *= -1; if (pressed & PAD_BUTTON_Y) direction = !direction; if ( pressed & PAD_BUTTON_START ) { DrawMenu = 1; HelpData = GRIDSCROLL; } } FreeImage(&backsquares); FreeImage(&backdiag); return; }
void ScrollTest() { int done = 0, speed = 1, acc = 1, x = 0, y = 0, pause = 0, vertical = 0; int oldvmode = vmode, i = 0, currentsonic = 0, currentframe = 0; u32 pressed; ImagePtr sonicback[4], overlay, kiki; sonicback[0] = LoadImage(SONICBACK1IMG, 0); if(!sonicback[0]) return; sonicback[1] = LoadImage(SONICBACK2IMG, 0); if(!sonicback[1]) return; sonicback[2] = LoadImage(SONICBACK3IMG, 0); if(!sonicback[2]) return; sonicback[3] = LoadImage(SONICBACK4IMG, 0); if(!sonicback[3]) return; overlay = LoadImage(SONICFLOORIMG, 0); if(!overlay) return; kiki = LoadImage(KIKIBACKIMG, 0); if(!kiki) return; for(i = 0; i < 4; i++) sonicback[i]->y = (dH - 240)/2; overlay->y = (dH - 240)/2; for(i = 0; i < 4; i++) IgnoreOffset(sonicback[i]); IgnoreOffset(overlay); kiki->x = (dW-256)/2; IgnoreOffset(kiki); while(!done && !EndProgram) { if(oldvmode != vmode) { for(i = 0; i < 4; i++) sonicback[i]->y = (dH - 240)/2; overlay->y = (dH - 240)/2; if(offsetY) // center in PAL modes { for(i = 0; i < 4; i++) sonicback[i]->y -= offsetY; overlay->y -= offsetY; } kiki->x = (dW-256)/2; oldvmode = vmode; } StartScene(); if(speed > 15) speed = 15; if(speed < 1) speed = 1; if(!pause) { if(!vertical) x += speed * acc; else y -= speed * acc; } if(!vertical) { if(x > overlay->tw) x = 1; if(x < -1*overlay->tw) x = -1; CalculateUV(x, 0, dW, 240, sonicback[currentsonic]); CalculateUV(x*2, 0, dW, 240, overlay); DrawImage(sonicback[currentsonic]); DrawImage(overlay); } else { if(y > kiki->th) y = 1; if(y < -1*kiki->th) y = -1; CalculateUV(0, y, 256, dH, kiki); DrawImage(kiki); } EndScene(); ControllerScan(); pressed = Controller_ButtonsDown(0); if (pressed & PAD_BUTTON_UP) speed ++; if (pressed & PAD_BUTTON_DOWN) speed --; if (pressed & PAD_BUTTON_B) done = 1; if (pressed & PAD_BUTTON_A) pause = !pause; if (pressed & PAD_BUTTON_X) acc *= -1; if (pressed & PAD_BUTTON_Y) vertical = !vertical; if ( pressed & PAD_BUTTON_START ) { DrawMenu = 1; HelpData = SCROLL; } if(!vertical) { currentframe ++; if(currentframe > 10) { currentsonic++; if(currentsonic > 3) currentsonic = 0; currentframe = 0; } } } for(i = 0; i < 4; i++) FreeImage(&sonicback[i]); FreeImage(&overlay); FreeImage(&kiki); }
void DropShadowTest() { char msg[50]; int done = 0, x = dW/2, y = dH/2, invert = 0, frame = 0, text = 0, selback = 0, sprite = 0; int oldvmode = vmode, i = 0, currentsonic = 0, currentframe = 0; u32 pressed, held, reload = 0; ImagePtr back[4], sonicback[4], ssprite, shadow, buzz, buzzshadow, overlay; sonicback[0] = LoadImage(SONICBACK1IMG, 0); if(!sonicback[0]) return; sonicback[1] = LoadImage(SONICBACK2IMG, 0); if(!sonicback[1]) return; sonicback[2] = LoadImage(SONICBACK3IMG, 0); if(!sonicback[2]) return; sonicback[3] = LoadImage(SONICBACK4IMG, 0); if(!sonicback[3]) return; for(i = 0; i < 4; i++) back[i] = NULL; back[1] = sonicback[0]; if(!back[1]) return; overlay = LoadImage(SONICFLOORIMG, 0); if(!overlay) return; reload = 1; ssprite = LoadImage(SHADOWIMG, 0); if(!ssprite) return; buzz = LoadImage(BUZZBOMBERIMG, 0); if(!buzz) return; buzzshadow = LoadImage(BUZZBOMBERSHADOWIMG, 0); if(!buzzshadow) return; srand((int)(time(0))); sprite = rand() % 2; if(sprite == 0) shadow = ssprite; else shadow = buzzshadow; while(!done && !EndProgram) { if(reload || oldvmode != vmode) { FreeImage(&back[0]); FreeImage(&back[2]); FreeImage(&back[3]); back[2] = LoadImage(CHECKPOSIMG, 1); if(!back[2]) return; back[3] = LoadImage(STRIPESPOSIMG, 1); if(!back[3]) return; if(vmode != VIDEO_480P && vmode != VIDEO_480I && vmode != VIDEO_576I) { back[0] = LoadImage(MOTOKOIMG, 0); if(!back[0]) return; for(i = 0; i < 4; i++) sonicback[i]->scale = 1; back[0]->scale = 1; overlay->scale = 1; for(i = 0; i < 4; i++) sonicback[i]->y = 0; overlay->y = 0; } else { back[0] = LoadImage(MOTOKO480IMG, 0); if(!back[0]) return; back[0]->scale = 0; overlay->scale = 0; for(i = 0; i < 4; i++) { sonicback[i]->scale = 0; sonicback[i]->y = (dH - 240)/2; } overlay->y = (dH - 240)/2; if(offsetY) // center in PAL modes { for(i = 0; i < 4; i++) sonicback[i]->y -= offsetY; overlay->y -= offsetY; } } reload = 0; oldvmode = vmode; } if(selback == 1) { CalculateUV(x, 0, dW, 240, back[selback]); CalculateUV(x*2, 0, dW, 240, overlay); } StartScene(); DrawImage(back[selback]); if(selback == 1) DrawImage(overlay); if(text) { if(vmode != VIDEO_480P) DrawStringB(140, 30, 0, 0xff, 0, msg); else DrawStringB(450, 40, 0, 0xff, 0, msg); text --; } if(frame == invert) { shadow->x = x; shadow->y = y; DrawImage(shadow); frame = !frame; } else frame = !frame; if(sprite == 1) { buzz->x = x - 20; buzz->y = y - 20; DrawImage(buzz); } EndScene(); ControllerScan(); held = Controller_ButtonsHeld(0); if (held & PAD_BUTTON_UP) y --; if (held & PAD_BUTTON_DOWN) y ++; if (held & PAD_BUTTON_LEFT) { x --; FlipH(buzz, 0); FlipH(buzzshadow, 0); } if (held & PAD_BUTTON_RIGHT) { x ++; FlipH(buzz, 1); FlipH(buzzshadow, 1); } pressed = Controller_ButtonsDown(0); if (pressed & PAD_BUTTON_B) done = 1; if (pressed & PAD_BUTTON_X) { invert = !invert; if(invert) sprintf(msg, "Shadow on odd frames"); else sprintf(msg, "Shadow on even frames"); text = 60; } if (pressed & PAD_BUTTON_A) { if(selback < 3) selback ++; else selback = 0; } if (pressed & PAD_BUTTON_Y) { if(sprite == 0) { shadow = buzzshadow; sprite = 1; } else { shadow = ssprite; sprite = 0; } } if ( pressed & PAD_BUTTON_START ) { DrawMenu = 1; HelpData = DROPSHADOW; } if(x < back[selback]->x) x = back[selback]->x; if(y < back[selback]->y) y = back[selback]->y; if(x > back[selback]->w + back[selback]->x - shadow->w) x = back[selback]->w + back[selback]->x - shadow->w; if(y > back[selback]->h + back[selback]->y - shadow->h) y = back[selback]->h + back[selback]->y - shadow->h; currentframe ++; if(currentframe > 10) { currentsonic++; if(currentsonic > 3) currentsonic = 0; currentframe = 0; back[1] = sonicback[currentsonic]; } } FreeImage(&back[0]); for(i = 0; i < 4; i++) FreeImage(&sonicback[i]); FreeImage(&back[2]); FreeImage(&back[3]); FreeImage(&overlay); FreeImage(&ssprite); FreeImage(&buzz); FreeImage(&buzzshadow); }
void StripedSpriteTest() { int done = 0, x = dW/2, y = dH/2, selback = 0; int oldvmode = vmode, currentsonic = 0, currentframe = 0, i; u32 pressed, held, reload = 0; ImagePtr back[4], sonicback[4], striped, overlay; sonicback[0] = LoadImage(SONICBACK1IMG, 0); if(!sonicback[0]) return; sonicback[1] = LoadImage(SONICBACK2IMG, 0); if(!sonicback[1]) return; sonicback[2] = LoadImage(SONICBACK3IMG, 0); if(!sonicback[2]) return; sonicback[3] = LoadImage(SONICBACK4IMG, 0); if(!sonicback[3]) return; for(i = 0; i < 4; i++) back[i] = NULL; back[1] = sonicback[0]; if(!back[1]) return; overlay = LoadImage(SONICFLOORIMG, 0); if(!overlay) return; reload = 1; striped = LoadImage(STRIPEDIMG, 0); if(!striped) return; while(!done && !EndProgram) { if(reload || oldvmode != vmode) { FreeImage(&back[0]); FreeImage(&back[2]); FreeImage(&back[3]); back[2] = LoadImage(CHECKPOSIMG, 1); if(!back[2]) return; back[3] = LoadImage(STRIPESPOSIMG, 1); if(!back[3]) return; if(vmode != VIDEO_480P && vmode != VIDEO_480I && vmode != VIDEO_576I) { back[0] = LoadImage(MOTOKOIMG, 0); if(!back[0]) return; for(i = 0; i < 4; i++) sonicback[i]->scale = 1; back[0]->scale = 1; overlay->scale = 1; for(i = 0; i < 4; i++) sonicback[i]->y = 0; overlay->y = 0; } else { back[0] = LoadImage(MOTOKO480IMG, 0); if(!back[0]) return; back[0]->scale = 0; overlay->scale = 0; for(i = 0; i < 4; i++) { sonicback[i]->scale = 0; sonicback[i]->y = (dH - 240)/2; } overlay->y = (dH - 240)/2; if(offsetY) // center in PAL modes { for(i = 0; i < 4; i++) sonicback[i]->y -= offsetY; overlay->y -= offsetY; } } reload = 0; oldvmode = vmode; } StartScene(); if(selback == 1) { CalculateUV(x, 0, dW, 240, back[selback]); CalculateUV(x*2, 0, dW, 240, overlay); } DrawImage(back[selback]); if(selback == 1) DrawImage(overlay); striped->x = x; striped->y = y; DrawImage(striped); EndScene(); ControllerScan(); held = Controller_ButtonsHeld(0); if (held & PAD_BUTTON_UP) y --; if (held & PAD_BUTTON_DOWN) y ++; if (held & PAD_BUTTON_LEFT) x --; if (held & PAD_BUTTON_RIGHT) x ++; pressed = Controller_ButtonsDown(0); if (pressed & PAD_BUTTON_B) done = 1; if (pressed & PAD_BUTTON_A) { if(selback > 0) selback --; else selback = 3; } if ( pressed & PAD_BUTTON_START ) { DrawMenu = 1; HelpData = STRIPED; } if(x < back[selback]->x) x = back[selback]->x; if(y < back[selback]->y) y = back[selback]->y; if(x > back[selback]->w + back[selback]->x - striped->w) x = back[selback]->w + back[selback]->x - striped->w; if(y > back[selback]->h + back[selback]->y - striped->h) y = back[selback]->h + back[selback]->y - striped->h; currentframe ++; if(currentframe > 10) { currentsonic++; if(currentsonic > 3) currentsonic = 0; currentframe = 0; back[1] = sonicback[currentsonic]; } } FreeImage(&back[0]); for(i = 0; i < 4; i++) FreeImage(&sonicback[i]); FreeImage(&back[2]); FreeImage(&back[3]); FreeImage(&overlay); FreeImage(&striped); }
void Alternate240p480i() { int frames = 0, seconds = 0, minutes = 0, hours = 0, done = 0, current = 0, res = 0, status = 0; timecode times[20]; u32 pressed, oldvmode = vmode; char buffer[20]; ImagePtr back; if(IsPAL) { if(vmode != VIDEO_288P) { SetVideoMode(VIDEO_288P); SetupGX(); } } else { if(vmode != VIDEO_240P) { SetVideoMode(VIDEO_240P); SetupGX(); } } back = LoadImage(WHITEIMG, 1); if(!back) return; back->r = 0x00; back->g = 0x00; back->b = 0x00; CalculateUV(0, 0, dW, dH, back); ChangeVideoEnabled = 0; while(!done && !EndProgram) { frames ++; if(IsPAL) { if(frames > 49) { frames = 0; seconds ++; } } else { if(frames > 59) { frames = 0; seconds ++; } } if(seconds > 59) { seconds = 0; minutes ++; } if(minutes > 59) { minutes = 0; hours ++; } if(hours > 99) hours = 0; StartScene(); DrawImage(back); DrawString(32, 8, 0, 0xff, 0, "Current Resolution:"); DrawString(140, 8, 0, 0xff, 0, res == 0 ? (IsPAL ? "288p" : "240p") : (IsPAL ? "576i" : "480i")); sprintf(buffer, "%02d:%02d:%02d:%02d", hours, minutes, seconds, frames); DrawString(32, 32, 0xff, 0xff, 0xff, "Elapsed Timer:"); DrawString(140, 32, 0xff, 0xff, 0xff, buffer); if(current) { int i = 0; for(i = 0; i < current; i++) { if(times[i].type == 0) { DrawString(32, 40+i*8, 0xff, 0xff, 0.0, "Switched to"); DrawString(32+12*5, 40+i*8, 0xff, 0xff, 0.0, times[i].res == 0 ? (IsPAL ? "288p" : "240p") : (IsPAL ? "576i" : "480i")); DrawString(32+16*5, 40+i*8, 0xff, 0xff, 0.0, " at:"); } else DrawString(32, 40+i*8, 0.0, 0xff, 0.0, "Viewed at:"); sprintf(buffer, "%02d:%02d:%02d:%02d", times[i].hours, times[i].minutes, times[i].seconds, times[i].frames); DrawString(140, 40+i*8, 0xff, 0xff, 0xff, buffer); if(times[i].type != 0 && i >= 1 && i <= 19) { u16 framesA = 0, framesB = 0, res = 0; timecode len; framesB = ConvertToFrames(×[i]); framesA = ConvertToFrames(×[i - 1]); res = framesB - framesA; ConvertFromFrames(&len, res); sprintf(buffer, "%02d:%02d:%02d:%02d", len.hours, len.minutes, len.seconds, len.frames); DrawString(200, 40+i*8, 0xff, 0.0, 0.0, buffer); } } } EndScene(); ControllerScan(); pressed = Controller_ButtonsDown(0); if ( pressed & PAD_BUTTON_START ) { DrawMenu = 1; HelpData = ALTERNATE; } if (pressed & PAD_BUTTON_B) done = 1; if (pressed & PAD_BUTTON_A) { if(current <= 19) current ++; else current = 1; times[current - 1].frames = frames; times[current - 1].minutes = minutes; times[current - 1].seconds = seconds; times[current - 1].hours = hours; status ++; if(status == 1) { times[current - 1].type = 0; res = !res; times[current - 1].res = res; if(!res) SetVideoMode(IsPAL ? VIDEO_288P : VIDEO_240P); else SetVideoMode(IsPAL ? VIDEO_576I_A264 : VIDEO_480I_A240); CalculateUV(0, 0, dW, dH, back); SetupGX(); } if(status == 2) { times[current - 1].type = 1; times[current - 1].res = res; status = 0; } } } ChangeVideoEnabled = 1; SetVideoMode(oldvmode); SetupGX(); FreeImage(&back); }