stk-code_catmod/src/moving_texture.cpp
cosmosninja eb482c7d4b Updated the GPL version to GPLv3.
git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/trunk/supertuxkart@2128 178a84e3-b1eb-0310-8ba1-8eac791a3b58
2008-06-13 00:53:52 +00:00

140 lines
4.3 KiB
C++

// $Id: moving_texture.cpp 796 2006-09-27 07:06:34Z hiker $
//
// SuperTuxKart - a fun racing game with go-kart
// Copyright (C) 2006 Joerg Henrichs
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License
// as published by the Free Software Foundation; either version 3
// of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "constants.hpp"
#include "moving_texture.hpp"
#include "string_utils.hpp"
#include "world.hpp"
#include "translation.hpp"
MovingTexture::MovingTexture(char *data, ssgBranch *branch)
{
m_branch = branch;
branch->setUserData(new ssgBase());
branch->setName("MovingTexture");
m_branch->ref();
m_phase = 0.0f;
m_mode = MODE_FORWARD;
m_cycle = 30.0f;
sgSetCoord(&m_now, 0, 0, 0, 0, 0, 0 ) ;
sgSetCoord(&m_delta, 0, 0, 0, 0, 0, 0 ) ;
parseData(data);
} // MovingTexture
//-----------------------------------------------------------------------------
MovingTexture::~MovingTexture()
{
ssgDeRefDelete(m_branch);
} // ~MovingTexture
//-----------------------------------------------------------------------------
void MovingTexture::parseData(char *data)
{
char *s = data;
// convert to uppercase
while(*s!='\0')
{
if( *s>='a' && *s<='z' ) *s = *s - 'a' + 'A' ;
s++;
}
s = data;
while ( s != NULL && *s != '\0' )
{
while ( *s > ' ' ) s++ ; /* Skip previous token */
while ( *s <= ' ' && *s != '\0' ) s++ ; /* Skip spaces */
if ( *s == '\0' ) break ;
float f ;
if ( sscanf ( s, "H=%f", & f ) == 1 ) m_delta.hpr[0] = f ; else
if ( sscanf ( s, "P=%f", & f ) == 1 ) m_delta.hpr[1] = f ; else
if ( sscanf ( s, "R=%f", & f ) == 1 ) m_delta.hpr[2] = f ; else
if ( sscanf ( s, "X=%f", & f ) == 1 ) m_delta.xyz[0] = f ; else
if ( sscanf ( s, "Y=%f", & f ) == 1 ) m_delta.xyz[1] = f ; else
if ( sscanf ( s, "Z=%f", & f ) == 1 ) m_delta.xyz[2] = f ; else
if ( sscanf ( s, "C=%f", & f ) == 1 ) m_cycle = f ; else
if ( sscanf ( s, "M=%f", & f ) == 1 ) m_mode = (int) f ; else
if ( sscanf ( s, "O=%f", & f ) == 1 ) m_phase = f ; else
fprintf ( stderr, "Unrecognised @autodcs string: '%s'\n", data );
} // while s!=NULL&&s!='\0'
} // parseData
//-----------------------------------------------------------------------------
void MovingTexture::update(float dt)
{
sgCoord add;
float timer = world->getTime() + m_phase ;
if ( m_cycle != 0.0 && m_mode != MODE_FORWARD )
{
if ( m_mode == MODE_SHUTTLE )
{
const float CTIMER = fmod ( timer, m_cycle ) ;
if ( CTIMER > m_cycle / 2.0f )
timer = m_cycle - CTIMER ;
else
timer = CTIMER ;
}
else
{
if ( m_mode == MODE_SINESHUTTLE )
timer = sin ( timer * 2.0f * M_PI / m_cycle ) * m_cycle / 2.0f ;
else
timer = fmod ( timer, m_cycle ) ;
}
} // m_mode!=MODE_FORWARD
sgCopyCoord(&add, &m_delta );
sgScaleVec3(add.xyz, dt);
sgScaleVec3(add.hpr, dt);
sgAddVec3(m_now.xyz, add.xyz);
sgAddVec3(m_now.hpr, add.hpr);
/*
To avoid roundoff problems with very large values
accumulated after long runs all rotations
can be modulo-360 degrees.
*/
m_now.hpr[0] = fmod ( m_now.hpr[0], 360.0f);
m_now.hpr[1] = fmod ( m_now.hpr[1], 360.0f);
m_now.hpr[2] = fmod ( m_now.hpr[2], 360.0f);
if ( m_branch->isAKindOf(ssgTypeTexTrans()) )
{
m_now.xyz[0] = fmod( m_now.xyz[0], 1.0f);
m_now.xyz[1] = fmod( m_now.xyz[1], 1.0f);
m_now.xyz[2] = fmod( m_now.xyz[2], 1.0f);
}
((ssgBaseTransform *) m_branch) -> setTransform(&m_now);
} // update