/** * @brief Creates a new weapon. * * @param outfit Outfit which spawns the weapon. * @param dir Direction of the shooter. * @param pos Position of the shooter. * @param vel Velocity of the shooter. * @param parent Pilot ID of the shooter. * @param target Target ID that is getting shot. */ void weapon_add( const Outfit* outfit, const double dir, const Vector2d* pos, const Vector2d* vel, unsigned int parent, unsigned int target ) { WeaponLayer layer; Weapon *w; Weapon **curLayer; int *mLayer, *nLayer; GLsizei size; if (!outfit_isBolt(outfit) && !outfit_isAmmo(outfit)) { ERR("Trying to create a Weapon from a non-Weapon type Outfit"); return; } layer = (parent==PLAYER_ID) ? WEAPON_LAYER_FG : WEAPON_LAYER_BG; w = weapon_create( outfit, dir, pos, vel, parent, target ); /* set the proper layer */ switch (layer) { case WEAPON_LAYER_BG: curLayer = wbackLayer; nLayer = &nwbackLayer; mLayer = &mwbacklayer; break; case WEAPON_LAYER_FG: curLayer = wfrontLayer; nLayer = &nwfrontLayer; mLayer = &mwfrontLayer; break; default: WARN("Unknown weapon layer!"); } if (*mLayer > *nLayer) /* more memory alloced than needed */ curLayer[(*nLayer)++] = w; else { /* need to allocate more memory */ switch (layer) { case WEAPON_LAYER_BG: (*mLayer) += WEAPON_CHUNK; curLayer = wbackLayer = realloc(curLayer, (*mLayer)*sizeof(Weapon*)); break; case WEAPON_LAYER_FG: (*mLayer) += WEAPON_CHUNK; curLayer = wfrontLayer = realloc(curLayer, (*mLayer)*sizeof(Weapon*)); break; } curLayer[(*nLayer)++] = w; /* Grow the vertex stuff. */ weapon_vboSize = mwfrontLayer + mwbacklayer; size = sizeof(GLfloat) * (2+4) * weapon_vboSize; weapon_vboData = realloc( weapon_vboData, size ); if (weapon_vbo == NULL) weapon_vbo = gl_vboCreateStream( size, NULL ); } }
/** * @brief Initializes the OpenGL rendering routines. * * @return 0 on success. */ int gl_initRender (void) { /* Initialize the VBO. */ gl_renderVBO = gl_vboCreateStream( sizeof(GLfloat) * OPENGL_RENDER_VBO_SIZE*(2 + 2 + 4), NULL ); gl_renderVBOtexOffset = sizeof(GLfloat) * OPENGL_RENDER_VBO_SIZE*2; gl_renderVBOcolOffset = sizeof(GLfloat) * OPENGL_RENDER_VBO_SIZE*(2+2); /* Initialize the circles. */ gl_circle = gl_genCircle( 128 ); return 0; }
/** * @brief Initializes the toolkit. * * @return 0 on success. */ int toolkit_init (void) { GLsizei size; /* Create the VBO. */ toolkit_vboColourOffset = sizeof(GLint) * 2 * 31; size = (sizeof(GLint)*2 + sizeof(GLfloat)*4) * 31; toolkit_vbo = gl_vboCreateStream( size, NULL ); /* DIsable the cursor. */ SDL_ShowCursor(SDL_DISABLE); return 0; }
/** * @brief Initilaizes background stars. * * @param n Number of stars to add (stars per 800x640 screen). */ void background_initStars( int n ) { unsigned int i; GLfloat w, h, hw, hh; double size; /* Calculate size. */ size = SCREEN_W*SCREEN_H+STAR_BUF*STAR_BUF; size /= pow2(conf.zoom_far); /* Calculate star buffer. */ w = (SCREEN_W + 2.*STAR_BUF); w += conf.zoom_stars * (w / conf.zoom_far - 1.); h = (SCREEN_H + 2.*STAR_BUF); h += conf.zoom_stars * (h / conf.zoom_far - 1.); hw = w / 2.; hh = h / 2.; /* Calculate stars. */ size *= n; nstars = (unsigned int)(size/(800.*600.)); if (mstars < nstars) { /* Create data. */ star_vertex = realloc( star_vertex, nstars * sizeof(GLfloat) * 4 ); star_colour = realloc( star_colour, nstars * sizeof(GLfloat) * 8 ); mstars = nstars; } for (i=0; i < nstars; i++) { /* Set the position. */ star_vertex[4*i+0] = RNGF()*w - hw; star_vertex[4*i+1] = RNGF()*h - hh; star_vertex[4*i+2] = 0.; star_vertex[4*i+3] = 0.; /* Set the colour. */ star_colour[8*i+0] = 1.; star_colour[8*i+1] = 1.; star_colour[8*i+2] = 1.; star_colour[8*i+3] = RNGF()*0.6 + 0.2; star_colour[8*i+4] = 1.; star_colour[8*i+5] = 1.; star_colour[8*i+6] = 1.; star_colour[8*i+7] = 0.; } /* Destroy old VBO. */ if (star_vertexVBO != NULL) { gl_vboDestroy( star_vertexVBO ); star_vertexVBO = NULL; } if (star_colourVBO != NULL) { gl_vboDestroy( star_colourVBO ); star_colourVBO = NULL; } /* Create now VBO. */ star_vertexVBO = gl_vboCreateStream( nstars * sizeof(GLfloat) * 4, star_vertex ); star_colourVBO = gl_vboCreateStatic( nstars * sizeof(GLfloat) * 8, star_colour ); }
/** * @brief Initializes the map subsystem. * * @return 0 on success. */ int map_init (void) { /* Create the VBO. */ map_vbo = gl_vboCreateStream( sizeof(GLfloat) * 3*(2+4), NULL ); return 0; }
/** * @brief Starts a beam weaapon. * * @param outfit Outfit which spawns the weapon. * @param dir Direction of the shooter. * @param pos Position of the shooter. * @param vel Velocity of the shooter. * @param parent Pilot ID of the shooter. * @param target Target ID that is getting shot. * @param mount Mount on the ship. * @return The identifier of the beam weapon. * * @sa beam_end */ int beam_start( const Outfit* outfit, const double dir, const Vector2d* pos, const Vector2d* vel, const unsigned int parent, const unsigned int target, const PilotOutfitSlot *mount ) { WeaponLayer layer; Weapon *w; Weapon **curLayer; int *mLayer, *nLayer; GLsizei size; if (!outfit_isBeam(outfit)) { ERR("Trying to create a Beam Weapon from a non-beam outfit."); return -1; } layer = (parent==PLAYER_ID) ? WEAPON_LAYER_FG : WEAPON_LAYER_BG; w = weapon_create( outfit, dir, pos, vel, parent, target ); w->ID = ++beam_idgen; w->mount = mount; /* set the proper layer */ switch (layer) { case WEAPON_LAYER_BG: curLayer = wbackLayer; nLayer = &nwbackLayer; mLayer = &mwbacklayer; break; case WEAPON_LAYER_FG: curLayer = wfrontLayer; nLayer = &nwfrontLayer; mLayer = &mwfrontLayer; break; default: ERR("Invalid WEAPON_LAYER specified"); return -1; } if (*mLayer > *nLayer) /* more memory alloced than needed */ curLayer[(*nLayer)++] = w; else { /* need to allocate more memory */ switch (layer) { case WEAPON_LAYER_BG: (*mLayer) += WEAPON_CHUNK; curLayer = wbackLayer = realloc(curLayer, (*mLayer)*sizeof(Weapon*)); break; case WEAPON_LAYER_FG: (*mLayer) += WEAPON_CHUNK; curLayer = wfrontLayer = realloc(curLayer, (*mLayer)*sizeof(Weapon*)); break; } curLayer[(*nLayer)++] = w; /* Grow the vertex stuff. */ weapon_vboSize = mwfrontLayer + mwbacklayer; size = sizeof(GLfloat) * (2+4) * weapon_vboSize; weapon_vboData = realloc( weapon_vboData, size ); if (weapon_vbo == NULL) weapon_vbo = gl_vboCreateStream( size, NULL ); } return w->ID; }