void steering_Wandering( Vector2* pos, Vector2* vel, Vector2* currWanderTarget, float radius, float offset, float displacement, Vector2* newWanderTargetOut, Vector2* desiredVelocityOut ) { assert( pos != NULL ); assert( vel != NULL ); assert( desiredVelocityOut != NULL ); assert( currWanderTarget != NULL ); assert( newWanderTargetOut != NULL ); assert( radius > 0.0f ); // we'll use the circle method, we'll need a target that is stored as an offset from the current position // find circle center Vector2 circleCenter = ( *vel ); vec2_Normalize( &circleCenter ); vec2_Scale( &circleCenter, offset, &circleCenter ); // create displaced target (*newWanderTargetOut) = vec2( rand_GetToleranceFloat( NULL, 0.0f, displacement ), rand_GetToleranceFloat( NULL, 0.0f, displacement ) ); vec2_Add( currWanderTarget, newWanderTargetOut, newWanderTargetOut ); // project displaced target onto circle Vector2 diff; vec2_Subtract( newWanderTargetOut, &circleCenter, &diff ); vec2_Normalize( &diff ); vec2_AddScaled( &circleCenter, &diff, radius, newWanderTargetOut ); ( *desiredVelocityOut ) = ( *newWanderTargetOut ); vec2_Normalize( desiredVelocityOut ); }
void computeBoundingBox(game_level *l) { int i; box2_Init(& l->boundingBox); for(i = 0; i < l->nBoundaries; i++) { vec2 vEnd; vec2_Add(&vEnd, & l->boundaries[i].vStart, & l->boundaries[i].vDirection); box2_Extend(& l->boundingBox, & l->boundaries[i].vStart); box2_Extend(& l->boundingBox, & vEnd); } }
void draw2D( nebu_Rect *pRect ) { // TODO: modify for nebu_rect // get rid of the viewport requirement // assume rasonly is set, push/pop matrices int i; float grid_width = box2_Width(& game2->level->boundingBox); float grid_height = box2_Height(& game2->level->boundingBox); glPushMatrix(); glTranslatef( (float)pRect->x, (float)pRect->y, 0); glScalef(pRect->width / grid_width, pRect->height / grid_height, 1); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor3f(1, 1, 1); glBegin(GL_LINES); for(i = 0; i < game2->level->nBoundaries; i++) { vec2 v; segment2 *s = game2->level->boundaries + i; vec2_Add(&v, & s->vStart, & s->vDirection); glVertex2fv(s->vStart.v); glVertex2fv(v.v); } glEnd(); for(i = 0; i < game->players; i++) { Player *p = &game->player[i]; PlayerVisual *pV = gPlayerVisuals + i; segment2* trail; float x, y; getPositionFromData(&x, &y, p->data); // fixme: check if trails vanish if (p->data->trail_height <= 0) { continue; } if (p->data->trail_height < TRAIL_HEIGHT) { /* if player crashed but the trail hasn't disappeared yet, fade the trail on the 2d map as it disappears. */ glBlendFunc(GL_SRC_ALPHA, GL_ONE); glColor4f(pV->pColorAlpha[0], pV->pColorAlpha[1], pV->pColorAlpha[2], p->data->trail_height / TRAIL_HEIGHT); } else { glBlendFunc(GL_ONE, GL_ONE); glColor3fv(pV->pColorAlpha); } glPointSize(2); glBegin(GL_POINTS); glVertex2f( x, y ); glEnd(); glBegin(GL_LINES); for(trail = p->data->trails; trail != p->data->trails + p->data->trailOffset; trail++) { glVertex2f(trail->vStart.v[0], trail->vStart.v[1] ); glVertex2f(trail->vStart.v[0] + trail->vDirection.v[0], trail->vStart.v[1] + trail->vDirection.v[1] ); } if(trail != p->data->trails) { trail--; glVertex2f(trail->vStart.v[0] + trail->vDirection.v[0], trail->vStart.v[1] + trail->vDirection.v[1] ); glVertex2f( floorf(x), floorf(y)); } else { glVertex2f(trail->vStart.v[0], trail->vStart.v[1] ); glVertex2f( floorf(x), floorf(y)); } #if 0 // draw AI debug lines glColor3f(1,1,1); glVertex2f(p->ai->front.vStart.v[0], p->ai->front.vStart.v[1]); glVertex2f(p->ai->front.vStart.v[0] + p->ai->front.vDirection.v[0], p->ai->front.vStart.v[1] + p->ai->front.vDirection.v[1]); glColor3f(0,1,0); glVertex2f(p->ai->left.vStart.v[0], p->ai->left.vStart.v[1]); glVertex2f(p->ai->left.vStart.v[0] + p->ai->left.vDirection.v[0], p->ai->left.vStart.v[1] + p->ai->left.vDirection.v[1]); glColor3f(0,0,1); glVertex2f(p->ai->right.vStart.v[0], p->ai->right.vStart.v[1]); glVertex2f(p->ai->right.vStart.v[0] + p->ai->right.vDirection.v[0], p->ai->right.vStart.v[1] + p->ai->right.vDirection.v[1]); glColor3f(0,1,1); glVertex2f(p->ai->backleft.vStart.v[0], p->ai->backleft.vStart.v[1]); glVertex2f(p->ai->backleft.vStart.v[0] + p->ai->backleft.vDirection.v[0], p->ai->backleft.vStart.v[1] + p->ai->backleft.vDirection.v[1]); #endif glEnd(); } glDisable(GL_BLEND); glPopMatrix(); }
void trailGeometry(Player *pPlayer, PlayerVisual* pV, TrailMesh *pMesh, int *pvOffset, int *piOffset) { Data *pData = pPlayer->data; int curVertex = *pvOffset, curIndex = *piOffset; int i; float fTotalLength = 0; float fSegLength; for(i = 0; i < pData->trailOffset; i++) { fSegLength = segment2_Length(pData->trails + i); if(i == 0 || cmpdir(pData->trails + i - 1, pData->trails + i)) { storeVertex(pMesh, curVertex, pData->trails + i, 0, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_TRAIL); curVertex += 2; } storeVertex(pMesh, curVertex, pData->trails + i, 1, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_TRAIL); curVertex += 2; storeIndices(pMesh, curIndex, curVertex - 4); curIndex += 6; fTotalLength += fSegLength; } { segment2 s; vec2_Copy(&s.vStart, & pData->trails[pData->trailOffset].vStart); s.vDirection.v[0] = getSegmentEndX( pData, 1 ) - s.vStart.v[0]; s.vDirection.v[1] = getSegmentEndY( pData, 1 ) - s.vStart.v[1]; fSegLength = segment2_Length(&s); storeVertex(pMesh, curVertex, &s, 0, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_TRAIL); curVertex += 2; storeVertex(pMesh, curVertex, &s, 1, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_TRAIL); curVertex += 2; storeIndices(pMesh, curIndex, curVertex - 4); curIndex += 6; fTotalLength += fSegLength; vec2_Add(&s.vStart, &s.vStart, &s.vDirection); s.vDirection.v[0] = getSegmentEndX( pData, 0 ) - s.vStart.v[0]; s.vDirection.v[1] = getSegmentEndY( pData, 0 ) - s.vStart.v[1]; fSegLength = segment2_Length(&s); storeVertex(pMesh, curVertex, &s, 0, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_TRAIL); curVertex += 2; storeVertex(pMesh, curVertex, &s, 1, 0, pData->trail_height, fSegLength, fTotalLength); storeColor(pMesh, curVertex, pV, COLOR_BRIGHT); curVertex += 2; storeIndices(pMesh, curIndex, curVertex - 4); curIndex += 6; } pMesh->iUsed += curIndex - *piOffset; *piOffset = curIndex; *pvOffset = curVertex; }
void draw2D( nebu_Rect *pRect ) { // TODO: modify for nebu_rect // get rid of the viewport requirement // assume rasonly is set, push/pop matrices int i; float grid_width = box2_Width(& game2->level->boundingBox); float grid_height = box2_Height(& game2->level->boundingBox); glPushMatrix(); glTranslatef( (float)pRect->x, (float)pRect->y, 0); glScalef(pRect->width / grid_width, pRect->height / grid_height, 1); glTranslatef( -game2->level->boundingBox.vMin.v[0], -game2->level->boundingBox.vMin.v[1], 0); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1, 1, 1, 1.0f); { int nVertices = game2->level->nBoundaries * 2; float *pVertices = (float*) malloc(3 * nVertices * sizeof(float)); for(i = 0; i < game2->level->nBoundaries; i++) { vec2 v; segment2 *s = game2->level->boundaries + i; vec2_Add(&v, & s->vStart, & s->vDirection); pVertices[6 * i + 0] = s->vStart.v[0]; pVertices[6 * i + 1] = s->vStart.v[1]; pVertices[6 * i + 2] = 0; pVertices[6 * i + 3] = v.v[0]; pVertices[6 * i + 4] = v.v[1]; pVertices[6 * i + 5] = 0; } glVertexPointer(3, GL_FLOAT, 0, pVertices); glEnableClientState(GL_VERTEX_ARRAY); glDrawArrays(GL_LINES, 0, nVertices); glDisableClientState(GL_VERTEX_ARRAY); free(pVertices); } // find out number of trails to draw into the 2d map // create vertex & color arrays // fill in data // draw everything in one go { int nVertices = 0; for(i = 0; i < game->players; i++) { Player *p = &game->player[i]; if (p->data.trail_height <= 0) { continue; } // TODO: get vertex count nVertices += 2 * p->data.nTrails; } } for(i = 0; i < game->players; i++) { Player *p = &game->player[i]; int i; float x, y; if (p->data.trail_height <= 0) { continue; } if (p->data.trail_height < TRAIL_HEIGHT) { /* if player crashed but the trail hasn't disappeared yet, fade the trail on the 2d map as it disappears. */ glBlendFunc(GL_SRC_ALPHA, GL_ONE); glColor4f(p->profile.pColorAlpha[0], p->profile.pColorAlpha[1], p->profile.pColorAlpha[2], p->data.trail_height / TRAIL_HEIGHT); } else { glBlendFunc(GL_ONE, GL_ONE); glColor4f(p->profile.pColorAlpha[0], p->profile.pColorAlpha[1], p->profile.pColorAlpha[2], p->profile.pColorAlpha[3]); } getPositionFromData(&x, &y, &p->data); glPointSize(2); glBegin(GL_POINTS); glVertex2f( x, y ); glEnd(); glBegin(GL_LINES); for(i = 0; i < p->data.nTrails; i++) { segment2* trail = p->data.trails + i; glVertex2f(trail->vStart.v[0], trail->vStart.v[1] ); glVertex2f(trail->vStart.v[0] + trail->vDirection.v[0], trail->vStart.v[1] + trail->vDirection.v[1] ); } // I have no idea what the following was necessary for // TODO: figure it out and rewrite or remove /* if(trail != p->data.trails) { trail--; glVertex2f(trail->vStart.v[0] + trail->vDirection.v[0], trail->vStart.v[1] + trail->vDirection.v[1] ); glVertex2f( floorf(x), floorf(y)); } else { glVertex2f(trail->vStart.v[0], trail->vStart.v[1] ); glVertex2f( floorf(x), floorf(y)); } */ #if 0 // draw AI debug lines glColor4f(1,1,1, 1.0f); glVertex2f(p->ai.front.vStart.v[0], p->ai.front.vStart.v[1]); glVertex2f(p->ai.front.vStart.v[0] + p->ai.front.vDirection.v[0], p->ai.front.vStart.v[1] + p->ai.front.vDirection.v[1]); glColor4f(0,1,0, 1.0f); glVertex2f(p->ai.left.vStart.v[0], p->ai.left.vStart.v[1]); glVertex2f(p->ai.left.vStart.v[0] + p->ai.left.vDirection.v[0], p->ai.left.vStart.v[1] + p->ai.left.vDirection.v[1]); glColor4f(0,0,1, 1.0f); glVertex2f(p->ai.right.vStart.v[0], p->ai.right.vStart.v[1]); glVertex2f(p->ai.right.vStart.v[0] + p->ai.right.vDirection.v[0], p->ai.right.vStart.v[1] + p->ai.right.vDirection.v[1]); glColor4f(0,1,1, 1.0f); glVertex2f(p->ai.backleft.vStart.v[0], p->ai.backleft.vStart.v[1]); glVertex2f(p->ai.backleft.vStart.v[0] + p->ai.backleft.vDirection.v[0], p->ai.backleft.vStart.v[1] + p->ai.backleft.vDirection.v[1]); #endif glEnd(); } glDisable(GL_BLEND); glPopMatrix(); }