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 );
}
Exemple #2
0
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();
}