Show kblock.cpp syntax highlighted
/*
Copyright (C) 2003, 2004, 2005 by Luca Cappa
Written by Luca Cappa groton@users.sourceforge.net
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library 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
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include "cssysdef.h"
#include "csutil/sysfunc.h"
#include "iutil/vfs.h"
#include "csutil/cscolor.h"
#include "cstool/csview.h"
#include "cstool/initapp.h"
#include "iutil/eventq.h"
#include "iutil/event.h"
#include "iutil/objreg.h"
#include "iutil/csinput.h"
#include "iutil/virtclk.h"
#include "iengine/sector.h"
#include "iengine/engine.h"
#include "iengine/camera.h"
#include "iengine/light.h"
#include "iengine/texture.h"
#include "iengine/mesh.h"
#include "iengine/movable.h"
#include "iengine/material.h"
#include "iengine/portal.h"
#include "iengine/portalcontainer.h"
#include "iengine/movable.h"
//???#include "imesh/thing/polygon.h"
//????#include "imesh/thing/thing.h"
#include "imesh/object.h"
#include "ivideo/graph3d.h"
#include "ivideo/graph2d.h"
#include "ivideo/natwin.h"
#include "ivideo/txtmgr.h"
#include "ivideo/texture.h"
#include "ivideo/material.h"
#include "ivideo/fontserv.h"
#include "igraphic/imageio.h"
#include "imap/loader.h"
#include "ivaria/reporter.h"
#include "ivaria/stdrep.h"
#include "ivaria/conout.h"
#include "csutil/cmdhelp.h"
#include "csutil/cspmeter.h"
#include "csutil/csstring.h"
#include "csgeom/quaterni.h"
#include "csgeom/transfrm.h"
#include "csgeom/poly3d.h"
#include "imesh/sprite3d.h"
#include "iutil/object.h"
#include "iutil/plugin.h"
#include "ivaria/collider.h"
#include "ivaria/view.h"
#include "csgeom/csrect.h"
#include "csutil/scfstr.h"
#include "cstool/keyval.h"
#include "cstool/collider.h"
#include "cstool/cspixmap.h"
#include "ivaria/collider.h"
#include "iutil/objreg.h"
#include "iutil/plugin.h"
#include "cstool/collider.h"
#include "imesh/thing.h"
#include "imesh/sprite3d.h"
#include "imesh/object.h"
#include "ivideo/graph3d.h"
#include "ivideo/graph2d.h"
#include "ivideo/txtmgr.h"
#include "ivideo/texture.h"
#include "ivideo/material.h"
#include "ivideo/fontserv.h"
#include "igraphic/imageio.h"
#include "imap/loader.h"
#include "ivaria/reporter.h"
#include "ivaria/stdrep.h"
#include "ivaria/collider.h"
#include "igeom/polymesh.h"
#include "cstool/collider.h"
#include "csutil/cmdhelp.h"
#include "iaws/aws.h"
#include "iaws/awscnvs.h"
#include "iaws/awsparm.h"
#include "isense/iisensetracker.h"
#include "ske.h"
#include "korientation.h"
#include "kflags.h"
#include "kblockid.h"
#include "kblock.h"
SCF_IMPLEMENT_IBASE_EXT (KBlock)
SCF_IMPLEMENTS_INTERFACE (KBlock)
SCF_IMPLEMENT_IBASE_EXT_END
//new
KBlock::KBlock ()
{
m_engine = CS_QUERY_REGISTRY (g_objReg, iEngine);
m_g3d = CS_QUERY_REGISTRY (g_objReg, iGraphics3D);
m_flag = new KFlags();
}
KBlock::~KBlock()
{
delete m_flag;
if (m_engine)
{
iMeshList* l_mL =m_engine->GetMeshes ();
l_mL->Remove(GetMeshWrapper());
}//if
}
//?????
//rewrite this method to allow the creation of additional polygons.
void KBlock::Create (KBlockId const& p_bId, iMaterialWrapper& p_matWall,
iMaterialWrapper& p_matGround)
{
m_meshW = m_engine->CreateThingMesh (NULL, m_name ? m_name->GetData () : "");
csRef<iThingState> l_wall_state = SCF_QUERY_INTERFACE
(m_meshW->GetMeshObject (), iThingState);
m_blockId = p_bId;//store the id of the KBlock.
// +--++--+
// | || |
// | || |
// | || |
// +--++--+
if (p_bId == KBlockId::I1)
{
//create the floor.
CreateQuadXZ (l_wall_state->GetFactory (), &p_matGround, csVector3 (-0.5f, 0.0f, 0.5f),
csVector3 (0.5f, 0.0f, -0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (), &p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
CreateQuadXY (l_wall_state->GetFactory (), &p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3 (0.5f,-0.1f,-0.5f));//front
CreateQuadXY (l_wall_state->GetFactory (), &p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ (l_wall_state->GetFactory (), &p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ (l_wall_state->GetFactory (), &p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
//create the north of the wall.
CreateQuadXY (l_wall_state->GetFactory (), &p_matWall,csVector3(0.05f,2.2f,0.5f),
csVector3(-0.05f,0.0f,0.5f));
//create the south of the wall.
CreateQuadXY(l_wall_state->GetFactory (), &p_matWall,csVector3(-0.05f,2.2f,-0.5f),
csVector3(0.05f,0.0f,-0.5f));
//create the left of the wall.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,0.5f),
csVector3(-0.05f,0.0f,-0.5f));
//create the right of the wall.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.05f,2.2f,-0.5f),
csVector3(0.05f,0.0f,0.5f));
//create top of the wall.
CreateQuadXZ(l_wall_state->GetFactory (), &p_matWall,csVector3(-0.05f,2.2f,0.5f),
csVector3(0.05f,2.2f,-0.5f));
//create bottom of the wall.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,0.0f,0.5f),
csVector3(0.05f,0.0f,-0.5f));
//set the flags
m_flag->Set(KFlags::s_nC);
m_flag->Set(KFlags::s_sC);
}//else
// +-+----+
// | | |
// | | |
// | | |
// +-+----+
else if(p_bId==KBlockId::I2)
{
//create the north side.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.4f,2.2f,0.5f),
csVector3(-0.5f,0.0f,0.5));
//create the east side.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.4f,2.2f,-0.5f),
csVector3(-0.4f,0.0f,0.5));
//create the south side.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,-0.5f),
csVector3(-0.4f,0.0f,-0.5f));
//create the west side.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.5f),
csVector3(-0.5f,0.0f,-0.5f));
//create the floor.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
//BUG: if i create a polygon without vertices, it crashes.
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
//create the top.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.5f),
csVector3(-0.4f,2.2f,-0.5f));
//create the botton.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.4f,0.0f,-0.5f));
//set the flags
m_flag->Set(KFlags::s_nOS);
m_flag->Set(KFlags::s_sS);
}//else if
// +------+
// | |
// | |
// | |
// +------+
else if(p_bId==KBlockId::F)
{
//create the floor.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
//BUG: if i create a polygon without vertices, it crashes.
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
}//else if
// +------+
// +--++--+
// | || |
// | || |
// +--++--+
else if(p_bId==KBlockId::T1)
{
//create north sides.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,2.2f,0.5f),
csVector3(-0.5f,0.0f,0.5f));
//create the east sides.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,2.2f,0.4f),
csVector3(0.5f,0.0f,0.5f));
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.05f,2.2f,-0.5f),
csVector3(0.05f,0.0f,0.4f));
//create the south sides.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.05f,2.2f,0.4f),
csVector3(0.5f,0.0f,0.4f));
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,-0.5f),
csVector3(0.05f,0.0f,-0.5f));
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.4f),
csVector3(-0.05f,0.0f,0.4f));
//create the west sides.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,0.4f),
csVector3(-0.05f,0.0f,-0.5f));
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.5f),
csVector3(-0.5f,0.0f,0.4f));
//create the floor.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
//BUG: if i create a polygon without vertices, it crashes.
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
//create the top.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.5f),
csVector3(0.5f,2.2f,0.4f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,0.4f),
csVector3(0.05f,2.2f,-0.5f));
//the bottom of the wall.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,0.4f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,0.0f,0.4f),
csVector3(0.05f,0.0f,-0.5f));
//set the flags
m_flag->Set(KFlags::s_eOS);
m_flag->Set(KFlags::s_wS);
m_flag->Set(KFlags::s_sC);
}//else if
// +------+
// +------+
// +--++--+
// | || |
// +--++--+
else if(p_bId==KBlockId::T2)
{
//create north sides.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,2.2f,0.05f),
csVector3(-0.5f,0.0f,0.05f));
//create the east sides.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,2.2f,-0.05f),
csVector3(0.5f,0.0f,0.05f));
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.05f,2.2f,-0.5f),
csVector3(0.05f,0.0f,-0.05f));
//create the south sides.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.05f,2.2f,-0.05f),
csVector3(0.5f,0.0f,-0.05f));
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,-0.5f),
csVector3(0.05f,0.0f,-0.5f));
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,-0.05f),
csVector3(-0.05f,0.0f,-0.05f));
//create the west sides.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,-0.05f),
csVector3(-0.05f,0.0f,-0.5f));
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.05f),
csVector3(-0.5f,0.0f,-0.05f));
//create the floor.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
//BUG: if i create a polygon without vertices, it crashes.
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
//create the top.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.05f),
csVector3(0.5f,2.2f,-0.05f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,-0.05f),
csVector3(0.05f,2.2f,-0.5f));
//create the bottom.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,0.0f,0.05f),
csVector3(0.5f,0.0f,-0.05f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,0.0f,-0.05f),
csVector3(0.05f,0.0f,-0.5f));
//set the flags
m_flag->Set(KFlags::s_eC);
m_flag->Set(KFlags::s_wC);
m_flag->Set(KFlags::s_sC);
}//else if
// +------+
// +----+ |
// | | |
// | | |
// +----+-+
else if(p_bId==KBlockId::L1)
{
//create north side.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,2.2f,0.5f),
csVector3(-0.5f,0.0f,0.5f));
//create the east side.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,2.2f,-0.5f),
csVector3(0.5f,0.0f,0.5f));
//create the south sides.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.4f,2.2f,-0.5f),
csVector3(0.5f,0.0f,-0.5f));
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.4f),
csVector3(0.4f,0.0f,0.4f));
//create the east sides.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.4f,2.2f,0.4f),
csVector3(0.4f,0.0f,-0.5f));
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.5f),
csVector3(-0.5f,0.0f,0.4f));
//create the floor.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
//BUG: if i create a polygon without vertices, it crashes.
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
//create the top.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.5f),
csVector3(0.5f,2.2f,0.4f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.4f,2.2f,0.4f),
csVector3(0.5f,2.2f,-0.5f));
//create the bottom.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,0.0f,0.4f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,0.0f,0.4f),
csVector3(0.4f,0.0f,-0.5f));
//set the flags
m_flag->Set(KFlags::s_wS);
m_flag->Set(KFlags::s_sOS);
}//else if
// +------+
// +------+
// +----+ |
// | | |
// +----+-+
else if(p_bId==KBlockId::L2)
{
//create north side.
CreateQuadXY (l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,2.2f,0.05f),
csVector3(-0.5f,0.0f,0.05f));
//create the west sides.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.05f),
csVector3(-0.5f,0.0f,-0.05f));
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.4f,2.2f,-0.05f),
csVector3(0.4f,0.0f,-0.5f));
//create the south sides.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.4f,0.0f,-0.05f),
csVector3(-0.5f,2.2f,-0.05f));
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.4f,2.2f,-0.5f));
//create the east side.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,2.2f,-0.5f),
csVector3(0.5f,0.0f,0.05f));
//create the floor.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
//BUG: if i create a polygon without vertices, it crashes.
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
//create the top.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.05f),
csVector3(0.5f,2.2f,-0.05f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.4f,2.2f,-0.05f),
csVector3(0.5f,2.2f,-0.5f));
//create the bottom.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,0.0f,0.05f),
csVector3(0.5f,0.0f,-0.05f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.4f,0.0f,-0.05f),
csVector3(0.5f,0.0f,-0.5f));
//set the flags
m_flag->Set(KFlags::s_wC);
m_flag->Set(KFlags::s_sOS);
}//else if
// +------+
// +------+
// | +----+
// | | |
// +-+----+
else if(p_bId==KBlockId::L3)
{
//create north side.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,2.2f,0.05f),
csVector3(-0.5f,0.0f,0.05f));
//create the east sides.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.5f,2.2f,-0.05f),
csVector3(0.5f,0.0f,0.05f));
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.4f,2.2f,-0.5f),
csVector3(-0.4f,0.0f,-0.05f));
//create the south sides.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.4f,2.2f,-0.05f),
csVector3(0.5f,0.0f,-0.05f));
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,-0.5f),
csVector3(-0.4f,0.0f,-0.5f));
//create the est side.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.05f),
csVector3(-0.5f,0.0f,-0.5f));
//create the floor.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
//BUG: if i create a polygon without vertices, it crashes.
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
//create the top.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.05f),
csVector3(0.5f,2.2f,-0.05f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,-0.05f),
csVector3(-0.4f,2.2f,-0.5f));
//create the bottom.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,0.0f,0.05f),
csVector3(0.5f,0.0f,-0.05f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,0.0f,-0.05f),
csVector3(-0.4f,0.0f,-0.5f));
//set the flags
m_flag->Set(KFlags::s_eC);
m_flag->Set(KFlags::s_sS);
}//else if
// +------+
// +---+ +
// +--++ +
// | || |
// +--++--+
else if(p_bId==KBlockId::L4)
{
//create north side.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.05f,2.2f,0.05f),
csVector3(-0.5f,0.0f,0.05f));
//create the east side.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.05f,2.2f,-0.5f),
csVector3(0.05f,0.0f,0.05f));
//create the south sides.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,-0.5f),
csVector3(0.05f,0.0f,-0.5f));
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,-0.05f),
csVector3(-0.05f,0.0f,-0.05f));
//create the west sides.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,-0.05f),
csVector3(-0.05f,0.0f,-0.5f));
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.05f),
csVector3(-0.5f,0.0f,-0.05f));
//create the floor.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
//BUG: if i create a polygon without vertices, it crashes.
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
//create the top.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,2.2f,0.05f),
csVector3(0.05f,2.2f,-0.05f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,-0.05f),
csVector3(0.05f,2.2f,-0.5f));
//create the bottom.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.5f,0.0f,0.05f),
csVector3(0.05f,0.0f,-0.05f));
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,0.0f,-0.05f),
csVector3(0.05f,0.0f,-0.5f));
//set the flags
m_flag->Set(KFlags::s_wC);
m_flag->Set(KFlags::s_sC);
}//else if
// +--++--+
// + ++ +
// + +
// | |
// +------+
else if(p_bId==KBlockId::C)
{
//create north side.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(0.05f,2.2f,0.5f),
csVector3(-0.05f,0.0f,0.5));
//create the east sides.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(0.05f,2.2f,0.4f),
csVector3(0.05f,0.0f,0.5f));
//create the south sides.
CreateQuadXY(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,0.4f),
csVector3(0.05f,0.0f,0.4f));
//create the west sides.
CreateQuadYZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,0.5f),
csVector3(-0.05f,0.0f,0.4f));
//create the floor.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
//BUG: if i create a polygon without vertices, it crashes.
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
//create the top.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,2.2f,0.5f),
csVector3(0.05f,2.2f,0.4f));
//create the bottom.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matWall,csVector3(-0.05f,0.0f,0.5f),
csVector3(0.05f,0.0f,0.4f));
//set the flags
m_flag->Set(KFlags::s_nC);
}//else if
// +--++--+
// | // |
// =/ |
// | |
// +------+
else if(p_bId==KBlockId::D1)
{
//create north side.
CreateQuadXY (l_wall_state->GetFactory (), &p_matWall,
csVector3 (0.05f,2.2f,0.5f), csVector3 (-0.05f,0.0f,0.5));
//create the east side.
#ifdef USE_MIRROR
csPoly3D l_poly;
l_poly.AddVertex (csVector3 (-0.5f, 2.2f, -0.05f));
l_poly.AddVertex (csVector3 (0.05f, 2.2f, 0.5f));
l_poly.AddVertex (csVector3 (0.05f, 0.0f, 0.5f));
l_poly.AddVertex (csVector3 (-0.5f, 0.0f, -0.05f));
iPortal* l_portal;
csRef<iMeshWrapper> l_portalMesh = m_engine->CreatePortal (
"mirror", m_meshW, g_ske->m_world,
l_poly.GetVertices (), l_poly.GetVertexCount (),
l_portal);
//set a mirror on the east side.
l_portal->SetSector (g_ske->m_world);//??
csTransform l_tr (csTransform::GetReflect (
csPoly3D::ComputePlane (l_poly.GetVertices (), l_poly.GetVertexCount ())));
l_portal->SetWarp (l_tr);
l_portal->GetFlags ().Set (CS_PORTAL_FLOAT | CS_PORTAL_CLIPDEST |
CS_PORTAL_ZFILL);
#else // USE_MIRROR
CreateQuadAny (l_wall_state->GetFactory (), &p_matWall,
csVector3 (-0.5f, 2.2f, -0.05f),
csVector3 (0.05f, 2.2f, 0.5f),
csVector3 (0.05f, 0.0f, 0.5f),
csVector3 (-0.5f, 0.0f, -0.05f));
#endif
//create the west sides.
CreateQuadYZ (l_wall_state->GetFactory (), &p_matWall,
csVector3 (-0.5f,2.2f,0.05f), csVector3 (-0.5f,0.0f,-0.05f));
CreateQuadAny (l_wall_state->GetFactory (), &p_matWall,
csVector3 (-0.05f,2.2f,0.5f), csVector3 (-0.5f,0.0f,0.05f));
//create the floor.
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,-0.1f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//bottom
//BUG: if i create a polygon without vertices, it crashes.
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(-0.5f,0.0f,0.5f),
csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ(l_wall_state->GetFactory (),&p_matGround,csVector3(0.5f,0.0f,-0.5f),
csVector3(0.5f,-0.1f,0.5f));//right
//create the top.
CreateQuadAny (l_wall_state->GetFactory (), &p_matWall,
csVector3 (-0.5f,2.2f,0.05f), csVector3 (-0.05f,2.2f,0.5f),
csVector3 (0.05f,2.2f,0.5f), csVector3 (-0.5f,2.2f,-0.05f));
//create the bottom.
CreateQuadAny (l_wall_state->GetFactory (), &p_matWall,
csVector3 (-0.5f,0.0f,0.05f), csVector3 (0.05f,0.0f,0.5f),
csVector3 (-0.5f,0.0f,-0.05f), csVector3 (-0.05f,0.0f,0.5f));
//set the flags
m_flag->Set(KFlags::s_nC);
m_flag->Set(KFlags::s_wC);
}//else if
// +------+
// | / / |
// |/ / |
// =/ |
// +------+
else if(p_bId==KBlockId::D2)
{
//create north side.
CreateQuadXY (l_wall_state->GetFactory (), &p_matWall,
csVector3 (0.5f,2.2f,0.5f), csVector3 (0.40f,0.0f,0.5));
//create the east side.
CreateQuadAny (l_wall_state->GetFactory (), &p_matWall,
csVector3 (-0.5f,2.2f,-0.5f), csVector3 (0.5f,0.0f,0.5f));
//
//create the west sides.
CreateQuadYZ (l_wall_state->GetFactory (), &p_matWall,
csVector3 (-0.5f,2.2f,-0.40f), csVector3 (-0.5f,0.0f,-0.5f));
CreateQuadAny (l_wall_state->GetFactory (), &p_matWall,
csVector3 (0.40f,2.2f,0.5f), csVector3 (-0.5f,0.0f,-0.40f));
//create the floor.
CreateQuadXZ (l_wall_state->GetFactory (),&p_matGround,
csVector3(-0.5f,0.0f,0.5f), csVector3(0.5f,0.0f,-0.5f));//up
CreateQuadXZ (l_wall_state->GetFactory (),&p_matGround,
csVector3(-0.5f,-0.1f,-0.5f), csVector3(0.5f,-0.1f,0.5f));//bottom
CreateQuadXY (l_wall_state->GetFactory (),&p_matGround,
csVector3(-0.5f,0.0f,-0.5f), csVector3(0.5f,-0.1f,-0.5f));//front
CreateQuadXY (l_wall_state->GetFactory (),&p_matGround,
csVector3(0.5f,0.0f,0.5f), csVector3(-0.5f,-0.1f,0.5f));//back
CreateQuadYZ (l_wall_state->GetFactory (),&p_matGround,
csVector3(-0.5f,0.0f,0.5f), csVector3(-0.5f,-0.1f,-0.5f));//left
CreateQuadYZ (l_wall_state->GetFactory (),&p_matGround,
csVector3(0.5f,0.0f,-0.5f), csVector3(0.5f,-0.1f,0.5f));//right
//create the top.
CreateQuadAny (l_wall_state->GetFactory (), &p_matWall,
csVector3 (0.5f,2.2f,0.5f), csVector3 (-0.5f,2.2f,-0.5f),
csVector3 (-0.5f,2.2f,-0.40f), csVector3 (0.40f,2.2f,0.5f));
//create the bottom.
CreateQuadAny (l_wall_state->GetFactory (), &p_matWall,
csVector3 (0.40f,0.0f,0.5f), csVector3 (-0.5f,0.0f,-0.40f),
csVector3 (-0.5f,0.0f,-0.5f), csVector3 (0.5f,0.0f,0.5f));
//set the flags
m_flag->Set (KFlags::s_nS);
m_flag->Set (KFlags::s_wOS);
}//else
}
void KBlock::HardTransform (const csTransform& p_tr)
{
m_meshW->HardTransform (p_tr);
}
iMeshWrapper* KBlock::GetMeshWrapper ()
{
return m_meshW;
}
const char* KBlock::GetName ()
{
return m_name->GetData ();
}
void KBlock::SetName (const char* p_name)
{
m_name.AttachNew (new scfString (p_name));
}
//
//p_v1, p_v2, p_v3 p_v4 are the vertices of the polygon to be drawn.
bool KBlock::CreateQuadAny (iThingFactoryState* p_tS, iMaterialWrapper* p_material,
const csVector3 &p_v1, const csVector3 &p_v2, const csVector3 &p_v3,
const csVector3 &p_v4)
{
p_tS->AddQuad (p_v1, p_v2, p_v3, p_v4);
if (p_material != NULL)
p_tS->SetPolygonMaterial (CS_POLYRANGE_LAST, p_material);
p_tS->SetPolygonTextureMapping
(CS_POLYRANGE_LAST, 1);
return true;
}
//
//p_v1 is on the topleft, p_v2 bottomright: that will determine the facing of the polygon.
bool KBlock::CreateQuadAny (iThingFactoryState* p_tS,
iMaterialWrapper* p_material,const csVector3 &p_v1, const csVector3 &p_v2)
{
p_tS->AddQuad (csVector3 (p_v1.x,p_v1.y,p_v1.z), csVector3 (p_v2.x,p_v1.y,p_v2.z),
csVector3 (p_v2.x,p_v2.y,p_v2.z), csVector3 (p_v1.x,p_v2.y,p_v1.z));
if (p_material != NULL)
p_tS->SetPolygonMaterial (CS_POLYRANGE_LAST, p_material);
p_tS->SetPolygonTextureMapping
(CS_POLYRANGE_LAST, 1);
return true;
}
//
//p_v1 and p_v2 must have the same y.
//p_v1 is on the topleft, p_v2 bottomright: that will determine the facing of the polygon.
bool KBlock::CreateQuadXZ (iThingFactoryState* p_tS, iMaterialWrapper* p_material,
const csVector3 &p_v1, const csVector3 &p_v2)
{
if (p_v1.y != p_v2.y)
{
SKE::Report (CS_REPORTER_SEVERITY_WARNING,
"CreateQuadXZ error!");
return false;
}//if
else
{
p_tS->AddQuad (csVector3(p_v1.x,p_v1.y,p_v1.z),
csVector3(p_v2.x,p_v1.y,p_v1.z),
csVector3(p_v2.x,p_v1.y,p_v2.z),
csVector3(p_v1.x,p_v1.y,p_v2.z));
}//else
if (p_material != NULL)
p_tS->SetPolygonMaterial (CS_POLYRANGE_LAST, p_material);
p_tS->SetPolygonTextureMapping
(CS_POLYRANGE_LAST, 1);
return true;
}
//
//p_v1 and p_v2 must have the same z.
//p_v1 is on the topleft, p_v2 bottomright: that will determine the facing of the polygon.
bool KBlock::CreateQuadXY (iThingFactoryState* p_tS, iMaterialWrapper* p_material,const csVector3 &p_v1,
const csVector3 &p_v2)
{
if (p_v1.z != p_v2.z)
{
SKE::Report (CS_REPORTER_SEVERITY_WARNING,
"CreateQuadXY error!");
return false;
}//if
else
{
p_tS->AddQuad (csVector3(p_v1.x,p_v1.y,p_v1.z),
csVector3(p_v2.x,p_v1.y,p_v1.z),
csVector3(p_v2.x,p_v2.y,p_v1.z),
csVector3(p_v1.x,p_v2.y,p_v1.z));
}//else
if (p_material != NULL)
p_tS->SetPolygonMaterial (CS_POLYRANGE_LAST, p_material);
p_tS->SetPolygonTextureMapping
(CS_POLYRANGE_LAST, 1);
return true;
}
//
//p_v1 and p_v2 must have the same x.
//p_v1 is on the topleft, p_v2 bottomright: that will determine the facing of the polygon.
bool KBlock::CreateQuadYZ (iThingFactoryState* p_tS,iMaterialWrapper* p_material,
const csVector3 &p_v1, const csVector3 &p_v2)
{
if (p_v1.x != p_v2.x)
{
SKE::Report (CS_REPORTER_SEVERITY_WARNING,
"CreateQuadYZ error!");
return false;
}//if
else
{
p_tS->AddQuad (csVector3(p_v1.x,p_v1.y,p_v1.z),
csVector3(p_v1.x,p_v1.y,p_v2.z),
csVector3(p_v1.x,p_v2.y,p_v2.z),
csVector3(p_v1.x,p_v2.y,p_v1.z));
}//else
if (p_material != NULL)
p_tS->SetPolygonMaterial (CS_POLYRANGE_LAST, p_material);
p_tS->SetPolygonTextureMapping
(CS_POLYRANGE_LAST, 1);
return true;
}
See more files for this project here