/** Displays trail */ static void orxBounce_DisplayTrail(const orxBITMAP *_pstBitmap) { #define STORE_VERTEX(INDEX, X, Y, U, V, RGBA) astVertexList[INDEX].fX = X; astVertexList[INDEX].fY = Y; astVertexList[INDEX].fU = U; astVertexList[INDEX].fV = V; astVertexList[INDEX].stRGBA = RGBA; orxDISPLAY_VERTEX astVertexList[TRAIL_POINT_NUMBER * 2]; orxVECTOR vOffset; orxU32 i; /* For all points */ for(i = 0; i < TRAIL_POINT_NUMBER; i++) { orxVECTOR vVertex1, vVertex2; orxU32 u32Index, u32NextIndex; /* Gets barrel indices */ u32Index = (i + su32TrailIndex) % TRAIL_POINT_NUMBER; u32NextIndex = (i + 1 + su32TrailIndex) % TRAIL_POINT_NUMBER; /* Not at the end? */ if(i < TRAIL_POINT_NUMBER - 1) { /* Gets offset vector */ orxVector_Mulf(&vOffset, orxVector_Normalize(&vOffset, orxVector_2DRotate(&vOffset, orxVector_Sub(&vOffset, &savTrailPointList[u32NextIndex], &savTrailPointList[u32Index]), orxMATH_KF_PI_BY_2)), orx2F(40.0f) / orxMath_Pow(orxS2F(i), orx2F(0.6f))); } /* Computes vertices positions */ orxVector_Add(&vVertex1, &savTrailPointList[u32Index], &vOffset); orxVector_Sub(&vVertex2, &savTrailPointList[u32Index], &vOffset); /* Stores vertices */ STORE_VERTEX(i * 2, vVertex1.fX, vVertex1.fY, orxFLOAT_0, orxU2F(i) / orxU2F(TRAIL_POINT_NUMBER - 1), orx2RGBA(0xFF, 0xFF, 0xFF, 0xFF * i / (TRAIL_POINT_NUMBER + 50))); STORE_VERTEX(i * 2 + 1, vVertex2.fX, vVertex2.fY, orxFLOAT_1, orxU2F(i) / orxU2F(TRAIL_POINT_NUMBER - 1), orx2RGBA(0xFF, 0xFF, 0xFF, 0xFF * i / (TRAIL_POINT_NUMBER + 50))); } /* Draws trail */ orxDisplay_DrawMesh(_pstBitmap, orxDISPLAY_SMOOTHING_ON, orxDISPLAY_BLEND_MODE_ALPHA, TRAIL_POINT_NUMBER * 2, astVertexList); }
/** Gets a random orxU32 value * @param[in] _u32Min Minimum boundary * @param[in] _u32Max Maximum boundary * @return Random value */ orxU32 orxFASTCALL orxMath_GetRandomU32(orxU32 _u32Min, orxU32 _u32Max) { orxU32 u32Rand; /* Gets raw random number */ u32Rand = rand(); /* Done! */ return (u32Rand == RAND_MAX) ? _u32Max : (orxF2U((orx2F(u32Rand) * (orx2F(1.0f / RAND_MAX)) * (orxU2F(_u32Max) + 1 - orxU2F(_u32Min))) + orxS2F(_u32Min))); }
orxSTATUS orxFASTCALL orxDisplay_SDL_Init() { orxSTATUS eResult; /* Was not already initialized? */ if(!(sstDisplay.u32Flags & orxDISPLAY_KU32_STATIC_FLAG_READY)) { /* Cleans static controller */ orxMemory_Zero(&sstDisplay, sizeof(orxDISPLAY_STATIC)); /* Is SDL partly initialized? */ if(SDL_WasInit(SDL_INIT_EVERYTHING) != 0) { /* Inits the video subsystem */ eResult = (SDL_InitSubSystem(SDL_INIT_VIDEO) == 0) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; } else { /* Inits SDL with video */ eResult = (SDL_Init(SDL_INIT_VIDEO) == 0) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; } /* Valid? */ if(eResult != orxSTATUS_FAILURE) { #ifdef __orxGP2X__ /* Inits display using config values? */ sstDisplay.pstScreen = SDL_SetVideoMode(orxDISPLAY_KU32_SCREEN_WIDTH, orxDISPLAY_KU32_SCREEN_HEIGHT, orxDISPLAY_KU32_SCREEN_DEPTH, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT); /* Stores values */ sstDisplay.fScreenWidth = orxU2F(orxDISPLAY_KU32_SCREEN_WIDTH); sstDisplay.fScreenHeight = orxU2F(orxDISPLAY_KU32_SCREEN_HEIGHT); #else /* __orxGP2X__ */ { orxU32 u32ConfigWidth, u32ConfigHeight, u32ConfigDepth, u32Flags; /* Gets resolution from config */ orxConfig_PushSection(orxDISPLAY_KZ_CONFIG_SECTION); u32ConfigWidth = orxConfig_GetU32(orxDISPLAY_KZ_CONFIG_WIDTH); u32ConfigHeight = orxConfig_GetU32(orxDISPLAY_KZ_CONFIG_HEIGHT); u32ConfigDepth = orxConfig_GetU32(orxDISPLAY_KZ_CONFIG_DEPTH); /* Full screen? */ if(orxConfig_GetBool(orxDISPLAY_KZ_CONFIG_FULLSCREEN) != orxFALSE) { /* Updates flags */ u32Flags = SDL_FULLSCREEN | SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT; } else { /* Updates flags */ u32Flags = SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT; } /* Inits display using config values? */ if((sstDisplay.pstScreen = SDL_SetVideoMode(u32ConfigWidth, u32ConfigHeight, u32ConfigDepth, u32Flags)) == orxNULL) { /* Inits display using default parameters */ sstDisplay.pstScreen = SDL_SetVideoMode(orxDISPLAY_KU32_SCREEN_WIDTH, orxDISPLAY_KU32_SCREEN_HEIGHT, orxDISPLAY_KU32_SCREEN_DEPTH, SDL_HWSURFACE | SDL_DOUBLEBUF | SDL_ANYFORMAT); /* Stores values */ sstDisplay.fScreenWidth = orxU2F(orxDISPLAY_KU32_SCREEN_WIDTH); sstDisplay.fScreenHeight = orxU2F(orxDISPLAY_KU32_SCREEN_HEIGHT); } else { /* Stores values */ sstDisplay.fScreenWidth = orxU2F(u32ConfigWidth); sstDisplay.fScreenHeight = orxU2F(u32ConfigHeight); } /* Pops config section */ orxConfig_PopSection(); } #endif /* __orxGP2X__ */ /* Updates result ? */ eResult = (sstDisplay.pstScreen != NULL) ? orxSTATUS_SUCCESS : orxSTATUS_FAILURE; /* Valid? */ if(eResult != orxSTATUS_FAILURE) { orxCLOCK *pstClock; /* Gets clock */ pstClock = orxClock_FindFirst(orx2F(-1.0f), orxCLOCK_TYPE_CORE); /* Valid? */ if(pstClock != orxNULL) { /* Registers event update function */ eResult = orxClock_Register(pstClock, orxDisplay_SDL_EventUpdate, orxNULL, orxMODULE_ID_DISPLAY, orxCLOCK_PRIORITY_HIGHEST); } /* Decoration? */ if((orxConfig_HasValue(orxDISPLAY_KZ_CONFIG_DECORATION) == orxFALSE) || (orxConfig_GetBool(orxDISPLAY_KZ_CONFIG_DECORATION) != orxFALSE)) { /* Logs message */ orxLOG("This plugin can't remove window decorations."); } /* Has VSync value? */ if(orxConfig_HasValue(orxDISPLAY_KZ_CONFIG_VSYNC) != orxFALSE) { /* Logs message */ orxLOG("This plugin can't handle vsync."); } /* Updates its title */ SDL_WM_SetCaption(orxConfig_GetString(orxDISPLAY_KZ_CONFIG_TITLE), orxNULL); /* Sets module as ready */ sstDisplay.u32Flags = orxDISPLAY_KU32_STATIC_FLAG_READY; } } } /* Done! */ return eResult; }