190 lines
5.7 KiB
C++
190 lines
5.7 KiB
C++
//-----------------------------------------------------------------------------
|
|
// File: nstate.cpp
|
|
//
|
|
// Desc: NORMAL_STATE
|
|
//
|
|
// Copyright (c) 1994-2000 Microsoft Corporation
|
|
//-----------------------------------------------------------------------------
|
|
#include "stdafx.h"
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: NORMAL_STATE constructor
|
|
// Desc:
|
|
//-----------------------------------------------------------------------------
|
|
NORMAL_STATE::NORMAL_STATE( STATE *pState )
|
|
{
|
|
m_pd3dDevice = pState->m_pd3dDevice;
|
|
|
|
// init joint types from dialog settings
|
|
m_bCycleJointStyles = 0;
|
|
|
|
switch( pState->m_pConfig->nJointType )
|
|
{
|
|
case JOINT_ELBOW:
|
|
m_jointStyle = ELBOWS;
|
|
break;
|
|
|
|
case JOINT_BALL:
|
|
m_jointStyle = BALLS;
|
|
break;
|
|
|
|
case JOINT_MIXED:
|
|
m_jointStyle = EITHER;
|
|
break;
|
|
|
|
case JOINT_CYCLE:
|
|
m_bCycleJointStyles = 1;
|
|
m_jointStyle = EITHER;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
|
|
// Build the objects
|
|
BuildObjects( pState->m_radius, pState->m_view.m_divSize, pState->m_nSlices,
|
|
pState->m_bUseTexture, &pState->m_texRep[0] );
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: NORMAL_STATE destructor
|
|
// Desc: Some of the objects are always created, so don't have to check if they
|
|
// exist. Others may be NULL.
|
|
//-----------------------------------------------------------------------------
|
|
NORMAL_STATE::~NORMAL_STATE()
|
|
{
|
|
SAFE_DELETE( m_pShortPipe );
|
|
SAFE_DELETE( m_pLongPipe );
|
|
SAFE_DELETE( m_pBallCap );
|
|
SAFE_DELETE( m_pBigBall );
|
|
|
|
for( int i = 0; i < 4; i ++ )
|
|
{
|
|
SAFE_DELETE( m_pElbows[i] );
|
|
SAFE_DELETE( m_pBallJoints[i] );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: BuildObjects
|
|
// Desc: - Build all the pipe primitives
|
|
// - Different prims are built based on bTexture flag
|
|
//-----------------------------------------------------------------------------
|
|
void NORMAL_STATE::BuildObjects( float radius, float divSize, int nSlices,
|
|
BOOL bTexture, IPOINT2D *texRep )
|
|
{
|
|
OBJECT_BUILD_INFO buildInfo;
|
|
buildInfo.m_radius = radius;
|
|
buildInfo.m_divSize = divSize;
|
|
buildInfo.m_nSlices = nSlices;
|
|
buildInfo.m_bTexture = bTexture;
|
|
buildInfo.m_texRep = NULL;
|
|
|
|
if( bTexture )
|
|
{
|
|
buildInfo.m_texRep = texRep;
|
|
|
|
// Calc s texture intersection values
|
|
float s_max = (float) texRep->y;
|
|
float s_trans = s_max * 2.0f * radius / divSize;
|
|
|
|
// Build short and long pipes
|
|
m_pShortPipe = new PIPE_OBJECT( m_pd3dDevice, &buildInfo, divSize - 2*radius,
|
|
s_trans, s_max );
|
|
m_pLongPipe = new PIPE_OBJECT( m_pd3dDevice, &buildInfo, divSize, 0.0f, s_max );
|
|
|
|
// Build elbow and ball joints
|
|
for( int i = 0; i < 4; i ++ )
|
|
{
|
|
m_pElbows[i] = new ELBOW_OBJECT( m_pd3dDevice, &buildInfo, i, 0.0f, s_trans );
|
|
m_pBallJoints[i] = new BALLJOINT_OBJECT( m_pd3dDevice, &buildInfo, i, 0.0f, s_trans );
|
|
}
|
|
|
|
m_pBigBall = NULL;
|
|
|
|
// Build end cap
|
|
float s_start = - texRep->x * (ROOT_TWO - 1.0f) * radius / divSize;
|
|
float s_end = texRep->x * (2.0f + (ROOT_TWO - 1.0f)) * radius / divSize;
|
|
|
|
// calc compensation value, to prevent negative s coords
|
|
float comp_s = (int) ( - s_start ) + 1.0f;
|
|
s_start += comp_s;
|
|
s_end += comp_s;
|
|
m_pBallCap = new SPHERE_OBJECT( m_pd3dDevice, &buildInfo, ROOT_TWO*radius, s_start, s_end );
|
|
}
|
|
else
|
|
{
|
|
// Build pipes, elbows
|
|
m_pShortPipe = new PIPE_OBJECT( m_pd3dDevice, &buildInfo, divSize - 2*radius );
|
|
m_pLongPipe = new PIPE_OBJECT( m_pd3dDevice, &buildInfo, divSize );
|
|
for( int i = 0; i < 4; i ++ )
|
|
{
|
|
m_pElbows[i] = new ELBOW_OBJECT( m_pd3dDevice, &buildInfo, i );
|
|
m_pBallJoints[i] = NULL;
|
|
}
|
|
|
|
// Build just one ball joint when not texturing. It is slightly
|
|
// larger than standard ball joint, to prevent any pipe edges from
|
|
// 'sticking' out of the ball.
|
|
m_pBigBall = new SPHERE_OBJECT( m_pd3dDevice, &buildInfo,
|
|
ROOT_TWO*radius / ((float) cos(PI/nSlices)) );
|
|
|
|
// build end cap
|
|
m_pBallCap = new SPHERE_OBJECT( m_pd3dDevice, &buildInfo, ROOT_TWO*radius );
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: Reset
|
|
// Desc: Reset frame attributes for normal pipes.
|
|
//-----------------------------------------------------------------------------
|
|
void NORMAL_STATE::Reset()
|
|
{
|
|
// Set the joint style
|
|
if( m_bCycleJointStyles )
|
|
{
|
|
if( ++(m_jointStyle) >= NUM_JOINT_STYLES )
|
|
m_jointStyle = 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
//-----------------------------------------------------------------------------
|
|
// Name: ChooseJointType
|
|
// Desc: - Decides which type of joint to draw
|
|
//-----------------------------------------------------------------------------
|
|
int NORMAL_STATE::ChooseJointType()
|
|
{
|
|
switch( m_jointStyle )
|
|
{
|
|
case ELBOWS:
|
|
return ELBOW_JOINT;
|
|
|
|
case BALLS:
|
|
return BALL_JOINT;
|
|
|
|
case EITHER:
|
|
default:
|
|
// otherwise an elbow or a ball (1/3 ball)
|
|
if( !CPipesScreensaver::iRand(3) )
|
|
return BALL_JOINT;
|
|
else
|
|
return ELBOW_JOINT;
|
|
}
|
|
}
|
|
|