Ejemplo n.º 1
0
void MySample::UpdateMatrixBuffers()
{
    // Update GUI
    int rows = currentRowCount;
    int columns = currentColCount;
    int index = 0;
    float angle_value = 360.0 / columns;
    float radius = (columns / k2Pi);
    for (int i = 0; i < rows; ++i)
    {
        int add_value = 0;
        for (int j = 0; j < columns; ++j)
        {
            if( (i % 2) == 0 )
            {
                add_value = angle_value + (angle_value / 2.0);
            }
            world[index] = float4x4RotationY( kPi / 2.0f) *
                           float4x4Translation(float3(0.0f, 0.0f + (100.0f * i), 100.0f * radius)) *
                           float4x4RotationY( DegreesToRadians(add_value + (angle_value * j)));
            ++index;
        }
    }

    // Now update buffer
    const int numInstances = columns * rows;

    // Support shader
    CPUTMaterialEffectOGL *pMatEffect = (CPUTMaterialEffectOGL*) supportMaterial->GetMaterialEffects()[0];
    DEBUG_PRINT("pMatEffect: %p", pMatEffect);
    GLuint shaderProgID = pMatEffect->GetShaderID();
    DEBUG_PRINT("shaderProgID: %d", shaderProgID);
    GLuint worldMatrixBufferLoc = glGetUniformLocation( shaderProgID, "instancedWorld" );
    DEBUG_PRINT("worldMatrixBufferLoc: %d", worldMatrixBufferLoc);
    GL_CHECK(glUseProgram(shaderProgID));
    GL_CHECK(glUniformMatrix4fv( worldMatrixBufferLoc, numInstances, GL_FALSE, (const GLfloat *) &world[0] ));

    // Tech unit shader
    pMatEffect = (CPUTMaterialEffectOGL*) techMaterial->GetMaterialEffects()[0];
    assert(pMatEffect);
    shaderProgID = pMatEffect->GetShaderID();
    worldMatrixBufferLoc = glGetUniformLocation( shaderProgID, "instancedWorld" );
    GL_CHECK(glUseProgram(shaderProgID));
    GL_CHECK(glUniformMatrix4fv( worldMatrixBufferLoc, numInstances, GL_FALSE, (const GLfloat *) &world[0] ));

    GL_CHECK(glUseProgram(0));
}
Ejemplo n.º 2
0
void MySample::Update(double deltaSeconds)
{
	static double time = 0.0f;
	float rows = 0.0f;
	float columns = 0.0f;
	float angle_value = 0.0f;
	
	// Update cam
	lookY = cameraY / 4.0f;
	lookZ = lookY / 3.0f;
	
	time += (deltaSeconds);

	/* DEMO SECTION */
	if (time > 360.0f)
		time = 0.0f;
	float4 temp = float4(1.0f, 1.0f, 1.0f, 1.0f) * (float4x4RotationY( kPi / 2.0f) * 
		float4x4Translation(float3(0.0f, 0.0f, 50.0f * (9 / k2Pi))) *
							   float4x4RotationY( DegreesToRadians((40.0f * ( 0.5f * time)))));
	
	mpCamera->SetPosition( temp.x, cameraY, temp.z );
	mpCamera->LookAt( 1.0f, lookY, lookZ );
	/* END DEMO SECTION */

    mpCameraController->Update((float)deltaSeconds);
	currentTime = (float)deltaSeconds;
	fpsTime += (float) deltaSeconds;
	fpsCount++;
	fps = fpsCount / fpsTime;
	if( fpsTime >= 1.0f )
	{
		fpsTime = 0.0f;
		fpsCount = 0;
	}

	// Update GUI
	rows = (float) currentRowCount; // for slider
	columns = (float) currentColCount; // for slider
	angle_value = 360.0 / columns;
	stringstream textStream;
	const int numInstances = (int)columns * (int) rows;
	textStream << "FPS:"<< fps;
	pTextMethod->SetText(PrepareText(textStream), 0.5f);
}
Ejemplo n.º 3
0
//-----------------------------------------------------------------------------
CPUTEventHandledCode CPUTCameraControllerFPS::HandleMouseEvent(
    int x,
    int y,
    int wheel,
    CPUTMouseState state,
    CPUTEventID message
)
{
    if( !mpCamera )
    {
        return CPUT_EVENT_UNHANDLED;
    }
    if(state & CPUT_MOUSE_LEFT_DOWN)
    {
        float3 position = mpCamera->GetPosition();

        if(!(mPrevFrameState & CPUT_MOUSE_LEFT_DOWN)) // Mouse was just clicked
        {
            mnPrevFrameX = x;
            mnPrevFrameY = y;
        }

        float nDeltaX = (float)(x-mnPrevFrameX);
        float nDeltaY = (float)(y-mnPrevFrameY);

        //Compute animation as an offset from the current basis
        float degreeY = nDeltaX*mfLookSpeed;
        float degreeX = nDeltaY*mfLookSpeed;
        mpCamera->mRotation += float3(degreeX,degreeY,0);

        float4x4 rotationX = float4x4RotationX(degreeX);
        float4x4 rotationY = float4x4RotationY(degreeY);

        mpCamera->SetPosition(0.0f, 0.0f, 0.0f); // Rotate about camera center
        float4x4 parent      = *mpCamera->GetParentMatrix();
        float4x4 orientation = rotationX  *parent * rotationY;
        orientation.orthonormalize();
        mpCamera->SetParentMatrix( orientation );
        mpCamera->SetPosition( position.x, position.y, position.z ); // Move back to original position
        mpCamera->Update();

        mnPrevFrameX = x;
        mnPrevFrameY = y;
        mPrevFrameState = state;
        return CPUT_EVENT_HANDLED;
    } else
    {
        mPrevFrameState = state;
        return CPUT_EVENT_UNHANDLED;
    }
}
Ejemplo n.º 4
0
void CPUTCameraModelViewer::Update(float deltaSeconds)
{

	float prevDistance = mDistance;
	float lerp = floatClamp( deltaSeconds * 6, 0.0f, 1.0f);
	mDistance = floatLerp(mDistance, mDstDistance, lerp);

	float3 look = (float4x4RotationX(mViewAngles.x) * float4x4RotationY(mViewAngles.y)) * float3( 0, 0, 1 );

	float3 pos = mTarget - look * mDistance;

	mpCamera->SetPosition(pos);
	((CPUTCamera*)mpCamera)->LookAt(mTarget);
	mpCamera->Update(deltaSeconds);
}
Ejemplo n.º 5
0
//-----------------------------------------------------------------------------
CPUTEventHandledCode CPUTCameraControllerArcBall::HandleMouseEvent(
    int x,
    int y,
    int wheel,
    CPUTMouseState state, 
    CPUTEventID message
)
{
    // TODO: We want move-in-x to orbit light in view space, not object space.
    if( !mpCamera )
    {
        return CPUT_EVENT_UNHANDLED;
    }
    if(state & CPUT_MOUSE_RIGHT_DOWN) // TODO: How to make this flexible?  Want to choose which mouse button has effect.
    {
        float4x4  rotationX, rotationY;

        if(!(mPrevFrameState & CPUT_MOUSE_RIGHT_DOWN)) // Mouse was just clicked
        {
            mnPrevFrameX = x;
            mnPrevFrameY = y;
        }
        int nDeltaX = x-mnPrevFrameX;
        int nDeltaY = y-mnPrevFrameY;
		
        rotationY = float4x4RotationX(nDeltaY*mfLookSpeed);
        rotationX = float4x4RotationY(nDeltaX*mfLookSpeed);
        float4x4 orientation = *mpCamera->GetParentMatrix() * rotationY * rotationX;

        orientation.orthonormalize();
        mpCamera->SetParentMatrix( orientation );

        mnPrevFrameX = x;
        mnPrevFrameY = y;
        mPrevFrameState = state;
        return CPUT_EVENT_HANDLED;
    } else
    {
        mPrevFrameState = state;
        return CPUT_EVENT_UNHANDLED;
    }
}
Ejemplo n.º 6
0
//-----------------------------------------------------------------------------
void CPUTCameraControllerFPS::Update(float deltaSeconds)
{
    if( !mpCamera )
    {
        return;
    }
    float speed = mfMoveSpeed * deltaSeconds;
    if (keyPressed[KEY_SHIFT] == CPUT_KEY_DOWN || keyPressed[KEY_CTRL] == CPUT_KEY_DOWN) {
        speed *= 0.1f;
    }

    float4x4 *pParentMatrix = mpCamera->GetParentMatrix();

    float3 vRight(pParentMatrix->getXAxis());
    float3 vUp(pParentMatrix->getYAxis());
    float3 vLook(pParentMatrix->getZAxis());
    float3 vPositionDelta(0.0f);
    int    rotateX = 0;
    int    rotateY = 0;
    bool   bRotate = false;
    // Added the ability to toggle on/off rotation mode
    if (keyPressed[KEY_SPACE] == CPUT_KEY_DOWN) {
        bRotate = true;
    }
    if(keyPressed[KEY_W] == CPUT_KEY_DOWN) {
        vPositionDelta +=  vLook *  speed;
        rotateY = -1;
    }
    if(keyPressed[KEY_A] == CPUT_KEY_DOWN) {
        vPositionDelta += vRight * -speed;
        rotateX = -1;
    }
    if(keyPressed[KEY_S] == CPUT_KEY_DOWN) {
        vPositionDelta +=  vLook * -speed;
        rotateY = 1;
    }
    if(keyPressed[KEY_D] == CPUT_KEY_DOWN) {
        vPositionDelta += vRight *  speed;
        rotateX = 1;
    }
    if(keyPressed[KEY_E] == CPUT_KEY_DOWN) {
        vPositionDelta +=    vUp *  speed;
    }
    if(keyPressed[KEY_Q] == CPUT_KEY_DOWN) {
        vPositionDelta +=    vUp * -speed;
    }
    if (bRotate && (rotateX || rotateY))
    {
        // this lets you rotate the camera with the keyboard if you don't have a mouse. like if you only have one
        // usb slot available on a mobile.
        float nDeltaX = (float)(rotateX) * speed * 10.0f;
        float nDeltaY = (float)(rotateY) * speed * 10.0f;

        float4x4 rotationX = float4x4RotationX(nDeltaY*mfLookSpeed);
        float4x4 rotationY = float4x4RotationY(nDeltaX*mfLookSpeed);

        float3 position = mpCamera->GetPosition();
        mpCamera->SetPosition(0.0f, 0.0f, 0.0f); // Rotate about camera center
        float4x4 parent      = *mpCamera->GetParentMatrix();
        float4x4 orientation = rotationX  *parent * rotationY;
        orientation.orthonormalize();
        mpCamera->SetParentMatrix( orientation );
        mpCamera->SetPosition( position.x, position.y, position.z ); // Move back to original position
    }
    else
    {
        float x,y,z;
        mpCamera->GetPosition( &x, &y, &z );
        mpCamera->SetPosition( x+vPositionDelta.x, y+vPositionDelta.y, z+vPositionDelta.z );
    }
    mpCamera->Update();

    //Compute animation as an offset from the current position
    mpCamera->mPosition += float3( vPositionDelta.x, vPositionDelta.y, vPositionDelta.z );
    //END
    return;
}