tge/engine/gui/utility/guiTransitionCtrl.cc
2017-04-17 06:17:10 -06:00

144 lines
4.7 KiB
C++
Executable File

//------------------------------------------------------------------------------
// Gui Vector Field Render control
//------------------------------------------------------------------------------
#include "gui/utility/guiTransitionCtrl.h"
#include "gui/core/guiCanvas.h"
#include "dgl/dgl.h"
#include "util/safeDelete.h"
IMPLEMENT_CONOBJECT( GuiVectorFieldCtrl );
//------------------------------------------------------------------------------
// A init function for vector field to provide some distortion
void FN_CDECL testInitFn( const int x, const int y, const Point2I &resolution,
const F32 maxX, const F32 maxY, Point2F *outVec )
{
outVec->x *= mCos( ( x + y - resolution.x ) / 50.f * M_PI );
outVec->y *= mCos( ( x + y ) / 100.f * M_PI );
}
void FN_CDECL spiralInitFn( const int x, const int y, const Point2I &resolution,
const F32 maxX, const F32 maxY, Point2F *outVec )
{
outVec->x -= 0.5f;
outVec->y -= 0.5f;
F32 d = mSqrt( ( x - resolution.x /2.f ) * ( x - resolution.x / 2.f ) +
( y - resolution.y / 2.f ) * ( y - resolution.y / 2.f ) );
F32 c = mCos( d * M_PI / 64.f );
F32 s = mSin( (d) * M_PI / 64.f );
outVec->x = c * outVec->x - s * outVec->y;
outVec->y = s * outVec->x + c * outVec->y;
outVec->x += 0.5f;
outVec->y += 0.5f;
/*outVec->x += 1.f / resolution.x;
outVec->y += 1.f / resolution.y;*/
}
//------------------------------------------------------------------------------
GuiVectorFieldCtrl::GuiVectorFieldCtrl()
{
// Just clear things out, don't allocate.
// SimObjects may not do anything significant in their constructor.
mVectorField = NULL;
mTestTexture = NULL;
}
//------------------------------------------------------------------------------
GuiVectorFieldCtrl::~GuiVectorFieldCtrl()
{
// duplicate with onRemove, just in case we're somehow deleted w/out remove
SAFE_DELETE( mVectorField );
SAFE_DELETE( mTestTexture );
}
//------------------------------------------------------------------------------
bool GuiVectorFieldCtrl::onAdd()
{
if(!Parent::onAdd())
return false;
mVectorField = new VectorField(Point2I(16,21));
mTestTexture = new TextureHandle("common/TestMap", BitmapTexture);
mFeedbackTexture.setUpdateRect(mBounds);
mClearColor.set(1.0f, 0.0f, 0.0f, 1.0f);
return true;
}
//------------------------------------------------------------------------------
void GuiVectorFieldCtrl::onRemove()
{
SAFE_DELETE( mVectorField );
SAFE_DELETE( mTestTexture );
Parent::onRemove();
}
//------------------------------------------------------------------------------
void GuiVectorFieldCtrl::onRender( Point2I offset, const RectI &updateRect )
{
RectI ctrlRect( offset, mBounds.extent );
glDisable(GL_LIGHTING);
//glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
//glBindTexture(GL_TEXTURE_2D, mTestTexture->getGLName() );
//glBindTexture(GL_TEXTURE_2D, mFeedbackTexture.getTextureHandle().getGLName() );
// CTE = 0x812F
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameterfv( GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, (F32 *)&mClearColor );
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
// Blend stuff
glBlendEquationEXT( GL_FUNC_ADD_EXT );
glBlendColorEXT( 0.1f, 0.1f, 0.1f, 0.f );
glBlendFunc( GL_CONSTANT_COLOR_EXT, GL_ONE );
// Render the current field
//mVectorField->renderField( true );
//dglDrawRectFill( ctrlRect, mClearColor );
glColor4ub( 0, 128, 0, 255 );
glRecti( (S32)ctrlRect.point.x, (S32)ctrlRect.point.y,
(S32)ctrlRect.point.x + ctrlRect.extent.x,
(S32)ctrlRect.point.y + ctrlRect.extent.y );
glDisable(GL_TEXTURE_2D);
glDisable(GL_BLEND);
//mVectorField->visualizeField();
}
//------------------------------------------------------------------------------
void GuiVectorFieldCtrl::resize(const Point2I &newPosition, const Point2I &newExtent)
{
Parent::resize( newPosition, newExtent );
mFeedbackTexture.setUpdateRect( RectI( newPosition, newExtent ) );
TextureObject *obj = (TextureObject *)*mTestTexture;
//TextureObject *obj = (TextureObject *)mFeedbackTexture.getTextureHandle();
F32 maxX = F32(obj->bitmapWidth) / F32(obj->texWidth);
F32 maxY = F32(obj->bitmapHeight) / F32(obj->texHeight);
mVectorField->initVectorField( maxX, maxY, VectorField::Flip_None, &spiralInitFn );
}
//------------------------------------------------------------------------------
void GuiVectorFieldCtrl::processTick()
{
mFeedbackTexture.updateAtEndOfFrame();
}