void XfmReset(struct Transform *transform)
{
	MatIdentity(transform->matrix);
	MatIdentity(transform->inverse);

	transform->transform_order = ORDER_SRT;
	transform->rotate_order = ORDER_XYZ;

	VEC3_SET(transform->translate, 0, 0, 0);
	VEC3_SET(transform->rotate, 0, 0, 0);
	VEC3_SET(transform->scale, 1, 1, 1);
}
static void make_transform_matrix(
		int transform_order, int rotate_order,
		double tx, double ty, double tz,
		double rx, double ry, double rz,
		double sx, double sy, double sz,
		double *transform)
{
	int i;
	double T[16], R[16], S[16], RX[16], RY[16], RZ[16];
	double *queue[3];

	MatTranslate(T, tx, ty, tz);
	MatRotateX(RX, rx);
	MatRotateY(RY, ry);
	MatRotateZ(RZ, rz);
	MatScale(S, sx, sy, sz);

	switch (rotate_order) {
	case ORDER_XYZ: VEC3_SET(queue, RX, RY, RZ); break;
	case ORDER_XZY: VEC3_SET(queue, RX, RZ, RY); break;
	case ORDER_YXZ: VEC3_SET(queue, RY, RX, RZ); break;
	case ORDER_YZX: VEC3_SET(queue, RY, RZ, RX); break;
	case ORDER_ZXY: VEC3_SET(queue, RZ, RX, RY); break;
	case ORDER_ZYX: VEC3_SET(queue, RZ, RY, RX); break;
	default:
		assert(!"invalid rotate order");
		break;
	}

	MatIdentity(R);
	for (i = 0; i < 3; i++)
		MatMultiply(R, queue[i], R);

	switch (transform_order) {
	case ORDER_SRT: VEC3_SET(queue, S, R, T); break;
	case ORDER_STR: VEC3_SET(queue, S, T, R); break;
	case ORDER_RST: VEC3_SET(queue, R, S, T); break;
	case ORDER_RTS: VEC3_SET(queue, R, T, S); break;
	case ORDER_TRS: VEC3_SET(queue, T, R, S); break;
	case ORDER_TSR: VEC3_SET(queue, T, S, R); break;
	default:
		assert(!"invalid transform order order");
		break;
	}

	MatIdentity(transform);
	for (i = 0; i < 3; i++)
		MatMultiply(transform, queue[i], transform);
}
Beispiel #3
0
shared_ptr<IActor> BLOCO_API PhysicObjectParams::VCreate( BaseGameLogic *logic )
{
	m_Mat = MatIdentity();
	shared_ptr<IActor> pModelObjectParams(DEBUG_CLIENTBLOCK BaseActor( m_Mat, AT_Model, shared_ptr<PhysicObjectParams>(DEBUG_CLIENTBLOCK PhysicObjectParams(*this))));
	logic->VAddActor(pModelObjectParams, this);

	return pModelObjectParams;
}
Beispiel #4
0
CameraObjectParams::CameraObjectParams( int actorID )
{
	m_Id = actorID;
	m_Type=AT_Camera; 
	m_Col= Vec(0.5f,0.5f,0.5f,0.5f); 
	m_Mat= MatIdentity();
	m_Size=sizeof(CameraObjectParams);
	strcpy( m_sName, "" );
	m_IsModified = false;
}
Beispiel #5
0
BLOCO_API PhysicObjectParams::PhysicObjectParams( int actorID )
{
	m_Mat = MatIdentity();
	m_Id = actorID;
	m_Type=AT_Model; 
	m_Col= Vec(0.5f,0.5f,0.5f,0.5f); 
	m_Size=sizeof(ModelObjectParams); 
	strcpy( m_sName, "" );
	m_IsModified = false;
	m_bHasScript = false;
}
Beispiel #6
0
VoxelObjectParams::VoxelObjectParams()
{
	m_Mat = MatIdentity();
	m_Type = AT_Voxel; 
	m_Col= Vec(0.5f,0.5f,0.5f,0.5f); 
	strcpy( m_sScriptFilename, "" );
	m_Size=sizeof(VoxelObjectParams); 
	m_IsModified = false;
	m_AABB = Vec(10.0f,10.0f,10.0f);
	m_bPhysicActor = true;
	strcpy( m_sName, "" );
}
Beispiel #7
0
CameraObjectParams::CameraObjectParams()
{
	m_Type=AT_Camera; 
	m_Col= Vec(0.5f,0.5f,0.5f,0.5f);
	m_Mat= MatIdentity();
	m_Size=sizeof(CameraObjectParams);
	strcpy( m_sScriptFilename, "" );
	strcpy( m_sName, "" );
	m_IsModified = false;

	m_bHasScript = false;
}
Beispiel #8
0
 BLOCO_API ModelObjectParams::ModelObjectParams( const char* modelFilename, const char* fxFilename, const char* fxTechinqueName )
{
	m_Mat = MatIdentity();
	m_Type=AT_Model; 
	m_Col= Vec(0.5f,0.5f,0.5f,0.5f); 
	strcpy(m_ModellFilename, modelFilename);
	strcpy( m_FXFileName, fxFilename );
	strcpy( m_FXTechniqueName, fxTechinqueName );
	m_Size=sizeof(ModelObjectParams); 
	m_IsModified = false;
	m_bPhysicActor = true;
	strcpy( m_sName, GetTitle(m_ModellFilename).c_str() );
}
Beispiel #9
0
BoneObjectParams::BoneObjectParams( string name, string parentName, Mat global, Mat bindPose )
{
	m_Mat = MatIdentity();
	m_Type=AT_Model; 
	m_Col= Vec(0.5f,0.5f,0.5f,0.5f); 
	m_Size=sizeof(BoneObjectParams); 
	m_IsModified = false;
	m_AABB = Vec(10.0f,10.0f,10.0f);
	strcpy( m_sScriptFilename, "" );
	strcpy( m_sName, "" );
	m_bPhysicActor = true;

	m_bHasScript = false;
}
Beispiel #10
0
 BLOCO_API ActorParams::ActorParams() 
{
	m_Mat = MatIdentity();
	m_Pos=Vec(0,0,0); 
	m_Type=AT_Unknown; 
	m_Col = Col(1.0f,1.0f,1.0f,1.0f);
	strcpy( m_OnCreateLuaFunctionName, "" );
	strcpy( m_sScriptFilename, "" );
	strcpy( m_sName, "" );
	strcpy( m_OnDestroyLuaFunctionName, "" );
	m_Size=sizeof(ActorParams); 
	m_IsModified= false;
	m_bPhysicActor = true;
	m_bHasScript = false;
}
Beispiel #11
0
 BLOCO_API ModelObjectParams::ModelObjectParams()
{
	m_Mat = MatIdentity();
	m_Type=AT_Model; 
	m_Col= Vec(0.5f,0.5f,0.5f,0.5f); 
	strcpy( m_ModellFilename, "-" );
	strcpy( m_FXFileName, "-" );
	strcpy( m_FXTechniqueName,  "-" );
	strcpy( m_sScriptFilename, "" );
	m_Size=sizeof(ModelObjectParams); 
	m_IsModified = false;
	m_AABB = Vec(10.0f,10.0f,10.0f);
	m_bPhysicActor = true;
	strcpy( m_sName, "" );
}
Beispiel #12
0
VoxelObjectParams::VoxelObjectParams( int width, int height, int depth, int ChunkSize ) :
	m_width(width),
	m_height(height),
	m_depth(depth),
	m_ChunkSize(ChunkSize)
{
	m_Mat = MatIdentity();
	m_Type=AT_Voxel; 
	m_Col= Vec(0.5f,0.5f,0.5f,0.5f); 
	strcpy( m_sScriptFilename, "" );
	m_Size=sizeof(VoxelObjectParams); 
	m_IsModified = false;
	m_bPhysicActor = true;
	strcpy( m_sName, "" );
}
Beispiel #13
0
 BLOCO_API ModelChildObjectParams::ModelChildObjectParams(  int actorID )
{
	m_Mat = MatIdentity();
	m_Id = actorID;
	m_Type=AT_ModelChild_Mesh; 
	m_Col= Vec(0.5f,0.5f,0.5f,0.5f); 
	strcpy( m_ModellFilename, "" );
	strcpy( m_FXFileName, "" );
	strcpy( m_FXTechniqueName, "" );
	m_AABB = Vec(10.0f,10.0f,10.0f);
	m_Size=sizeof(ModelChildObjectParams); 
	m_IsModified = false;
	m_bDynamic = true;

	m_bHasScript = false;
}
Beispiel #14
0
bool CameraObjectParams::VInit( LuaObject srcData, TErrorMessageList & errorMessages )
{
	if ( false == ActorParams::VInit( srcData, errorMessages ) )
	{
		return false;
	}

	m_Type = AT_Camera;

	m_Mat = MatIdentity();

	LuaObject matObj = srcData[ "Mat" ];
	if ( matObj.IsTable() )
	{
		const int tableCount = matObj.GetTableCount();
		if ( 16 != tableCount )
		{
			const std::string err( "Incorrect number of parameters in the 'Mat' member." );
			errorMessages.push_back( err );
			return false;
		}
		else
		{
			char name[4] = "_00";

			for( int i = 1; i <= 4; ++i ) 
			{
				name[1] = '0' + i;

				for( int j = 1; j <= 4; ++j ) 
				{
					name[2] = '0' + j;

					LuaObject entry = matObj[ name ];
					if( entry.IsNumber() ) 
					{
						m_Mat.GetStorage().m[i - 1][j - 1] = entry.GetFloat();
					}
				}
			}
		}
	}

	return true;
}
Beispiel #15
0
bool BLOCO_API ModelObjectParams::VInit( LuaObject srcData, TErrorMessageList & errorMessages )
{
	if ( false == ActorParams::VInit( srcData, errorMessages ) )
	{
		return false;
	}

	m_Type = AT_Model;
	m_bDynamic = true;
	m_Mat = MatIdentity();


	//Positon
	LuaObject positionObj = srcData[ "Position" ];
	if ( positionObj.IsTable() )
	{
		float x = positionObj[ "x" ].GetFloat();
		float y = positionObj[ "y" ].GetFloat();
		float z = positionObj[ "z" ].GetFloat();

		m_Mat = MatTranslation( x, y, z );
	}


	LuaObject matObj = srcData[ "Mat" ];
	if ( matObj.IsTable() )
	{
		const int tableCount = matObj.GetTableCount();
		if ( 16 != tableCount )
		{
			const std::string err( "Incorrect number of parameters in the 'Mat' member." );
			errorMessages.push_back( err );
			return false;
		}
		else
		{
			char name[4] = "_00";

			for( int i = 1; i <= 4; ++i ) 
			{
				name[1] = '0' + i;

				for( int j = 1; j <= 4; ++j ) 
				{
					name[2] = '0' + j;

					LuaObject entry = matObj[ name ];
					if( entry.IsNumber() ) 
					{
						m_Mat.GetStorage().m[i - 1][j - 1] = entry.GetFloat();
					}
				}
			}
		}
	}


	LuaObject XFileObj = srcData[ "ModelFile" ];
	if ( XFileObj.IsString() )
	{
		//Check if it is a Path
		bool bPath = false;
		const char * filename = XFileObj.GetString();

		strcpy( m_ModellFilename, MODEL_PATH(filename) );

		m_bHasScript = true;
		string tmp = m_ModellFilename;
		tmp.erase(tmp.end()-3,tmp.end());
		tmp += "lua";

		strcpy( m_sScriptFilename, tmp.c_str() );
	}

	//Physic
	LuaObject PhysicObj = srcData[ "Physic" ];
	if ( PhysicObj.IsString() )
	{
		string strPhysic = PhysicObj.GetString();

		if ( strPhysic == "static")
			m_bDynamic = false;
		else if( strPhysic == "dynamic")
			m_bDynamic = true;
		else if( strPhysic == "none")
			m_bPhysicActor = false;
	}


	LuaObject FXFileObj = srcData[ "FXFile" ];
	if ( FXFileObj.IsString() )
	{
		const char * pFXFile = FXFileObj.GetString();
		strcpy( m_FXFileName, pFXFile );
	}

	LuaObject FXTechniqueObj = srcData[ "FXTechnique" ];
	if ( FXTechniqueObj.IsString() )
	{
		const char * pFXTechnique = FXTechniqueObj.GetString();
		strcpy( m_FXTechniqueName, pFXTechnique );
	}

	return true;
}
Beispiel #16
0
bool VoxelObjectParams::VInit( LuaObject srcData, TErrorMessageList & errorMessages )
{
	if ( false == ActorParams::VInit( srcData, errorMessages ) )
	{
		return false;
	}

	m_Type = AT_Model;
	m_bDynamic = true;
	m_Mat = MatIdentity();


	//Positon
	LuaObject positionObj = srcData[ "Position" ];
	if ( positionObj.IsTable() )
	{
		float x = positionObj[ "x" ].GetFloat();
		float y = positionObj[ "y" ].GetFloat();
		float z = positionObj[ "z" ].GetFloat();

		m_Mat = MatTranslation( x, y, z );
	}


	LuaObject matObj = srcData[ "Mat" ];
	if ( matObj.IsTable() )
	{
		const int tableCount = matObj.GetTableCount();
		if ( 16 != tableCount )
		{
			const std::string err( "Incorrect number of parameters in the 'Mat' member." );
			errorMessages.push_back( err );
			return false;
		}
		else
		{
			char name[4] = "_00";

			for( int i = 1; i <= 4; ++i ) 
			{
				name[1] = '0' + i;

				for( int j = 1; j <= 4; ++j ) 
				{
					name[2] = '0' + j;

					LuaObject entry = matObj[ name ];
					if( entry.IsNumber() ) 
					{
						m_Mat.GetStorage().m[i - 1][j - 1] = entry.GetFloat();
					}
				}
			}
		}
	}

	//Physic
	LuaObject PhysicObj = srcData[ "Physic" ];
	if ( PhysicObj.IsString() )
	{
		string strPhysic = PhysicObj.GetString();

		if ( strPhysic == "static")
			m_bDynamic = false;
		else
			m_bDynamic = true;
	}

	//Voxel
	LuaObject widthObj = srcData[ "width" ];
	if ( widthObj.IsInteger() )
	{
		m_width = widthObj.GetInteger();
	}

	LuaObject heightObj = srcData[ "height" ];
	if ( heightObj.IsInteger() )
	{
		m_height = heightObj.GetInteger();
	}

	LuaObject depthObj = srcData[ "depth" ];
	if ( depthObj.IsInteger() )
	{
		m_depth = depthObj.GetInteger();
	}

	LuaObject chunkSizeObj = srcData[ "chunkSize" ];
	if ( chunkSizeObj.IsInteger() )
	{
		m_ChunkSize = chunkSizeObj.GetInteger();
	}

	return true;
}
Beispiel #17
0
void OGL_ModelData::Load()
{
  // Already loaded?
  if (ModelPresent()) {
    return;
  }

  // Load the model
  Model.Clear();

  if (ModelFile == FileSpecifier()) {
    return;
  }
  if (!ModelFile.Exists()) {
    return;
  }

  bool Success = false;

  char *Type = &ModelType[0];
  if (StringsEqual(Type,"wave",4)) {
    // Alias|Wavefront
    Success = LoadModel_Wavefront(ModelFile, Model);
  }
  else if (StringsEqual(Type,"3ds",3)) {
    // 3D Studio Max
    Success = LoadModel_Studio(ModelFile, Model);
  }
  else if (StringsEqual(Type,"dim3",4)) {
    // Brian Barnes's "Dim3" model format (first pass: model geometry)
    Success = LoadModel_Dim3(ModelFile, Model, LoadModelDim3_First);

    // Second and third passes: frames and sequences
    try
    {
      if (ModelFile1 == FileSpecifier()) {
        throw 0;
      }
      if (!ModelFile1.Exists()) {
        throw 0;
      }
      if (!LoadModel_Dim3(ModelFile1, Model, LoadModelDim3_Rest)) {
        throw 0;
      }
    }
    catch(...)
    {}
    //
    try
    {
      if (ModelFile2 == FileSpecifier()) {
        throw 0;
      }
      if (!ModelFile2.Exists()) {
        throw 0;
      }
      if (!LoadModel_Dim3(ModelFile2, Model, LoadModelDim3_Rest)) {
        throw 0;
      }
    }
    catch(...)
    {}
  }
#if HAVE_QUESA
  else if (StringsEqual(Type,
                        "qd3d") ||
           StringsEqual(Type,"3dmf") || StringsEqual(Type,"quesa")) {
    // QuickDraw 3D / Quesa
    Success = LoadModel_QD3D(ModelFile, Model);
  }
#endif

  if (!Success) {
    Model.Clear();
    return;
  }

  // Calculate transformation matrix
  GLfloat Angle, Cosine, Sine;
  GLfloat RotMatrix[3][3], NewRotMatrix[3][3], IndivRotMatrix[3][3];
  MatIdentity(RotMatrix);

  MatIdentity(IndivRotMatrix);
  Angle = (float)Degree2Radian*XRot;
  Cosine = (float)cos(Angle);
  Sine = (float)sin(Angle);
  IndivRotMatrix[1][1] = Cosine;
  IndivRotMatrix[1][2] = -Sine;
  IndivRotMatrix[2][1] = Sine;
  IndivRotMatrix[2][2] = Cosine;
  MatMult(IndivRotMatrix,RotMatrix,NewRotMatrix);
  MatCopy(NewRotMatrix,RotMatrix);

  MatIdentity(IndivRotMatrix);
  Angle = (float)Degree2Radian*YRot;
  Cosine = (float)cos(Angle);
  Sine = (float)sin(Angle);
  IndivRotMatrix[2][2] = Cosine;
  IndivRotMatrix[2][0] = -Sine;
  IndivRotMatrix[0][2] = Sine;
  IndivRotMatrix[0][0] = Cosine;
  MatMult(IndivRotMatrix,RotMatrix,NewRotMatrix);
  MatCopy(NewRotMatrix,RotMatrix);

  MatIdentity(IndivRotMatrix);
  Angle = (float)Degree2Radian*ZRot;
  Cosine = (float)cos(Angle);
  Sine = (float)sin(Angle);
  IndivRotMatrix[0][0] = Cosine;
  IndivRotMatrix[0][1] = -Sine;
  IndivRotMatrix[1][0] = Sine;
  IndivRotMatrix[1][1] = Cosine;
  MatMult(IndivRotMatrix,RotMatrix,NewRotMatrix);
  MatCopy(NewRotMatrix,RotMatrix);

  MatScalMult(NewRotMatrix,Scale);                              // For the position vertices
  if (Scale < 0) {
    MatScalMult(RotMatrix,-1);                          // For the normals
  }
  // Is model animated or static?
  // Test by trying to find neutral positions (useful for working with the normals later on)
  if (Model.FindPositions_Neutral(false)) {
    // Copy over the vector and normal transformation matrices:
    for (int k=0; k<3; k++)
      for (int l=0; l<3; l++)
      {
        Model.TransformPos.M[k][l] = NewRotMatrix[k][l];
        Model.TransformNorm.M[k][l] = RotMatrix[k][l];
      }

    Model.TransformPos.M[0][3] = XShift;
    Model.TransformPos.M[1][3] = YShift;
    Model.TransformPos.M[2][3] = ZShift;

    // Find the transformed bounding box:
    bool RestOfCorners = false;
    GLfloat NewBoundingBox[2][3];
    // The indices i1, i2, and i3 are for selecting which of the box's two principal corners
    // to get coordinates from
    for (int i1=0; i1<2; i1++)
    {
      GLfloat X = Model.BoundingBox[i1][0];
      for (int i2=0; i2<2; i2++)
      {
        GLfloat Y = Model.BoundingBox[i2][0];
        for (int i3=0; i3<2; i3++)
        {
          GLfloat Z = Model.BoundingBox[i3][0];

          GLfloat Corner[3];
          for (int ic=0; ic<3; ic++)
          {
            GLfloat *Row = Model.TransformPos.M[ic];
            Corner[ic] = Row[0]*X + Row[1]*Y + Row[2]*Z + Row[3];
          }

          if (RestOfCorners) {
            // Find minimum and maximum for each coordinate
            for (int ic=0; ic<3; ic++)
            {
              NewBoundingBox[0][ic] = min(NewBoundingBox[0][ic],Corner[ic]);
              NewBoundingBox[1][ic] = max(NewBoundingBox[1][ic],Corner[ic]);
            }
          }
          else
          {
            // Simply copy it in:
            for (int ic=0; ic<3; ic++)
              NewBoundingBox[0][ic] = NewBoundingBox[1][ic] = Corner[ic];
            RestOfCorners = true;
          }
        }
      }
    }

    for (int ic=0; ic<2; ic++)
      objlist_copy(Model.BoundingBox[ic],NewBoundingBox[ic],3);
  }
  else
  {
    // Static model
    size_t NumVerts = Model.Positions.size()/3;

    for (size_t k=0; k<NumVerts; k++)
    {
      GLfloat *Pos = Model.PosBase() + 3*k;
      GLfloat NewPos[3];
      MatVecMult(NewRotMatrix,Pos,NewPos);                      // Has the scaling
      Pos[0] = NewPos[0] + XShift;
      Pos[1] = NewPos[1] + YShift;
      Pos[2] = NewPos[2] + ZShift;
    }

    size_t NumNorms = Model.Normals.size()/3;
    for (size_t k=0; k<NumNorms; k++)
    {
      GLfloat *Norms = Model.NormBase() + 3*k;
      GLfloat NewNorms[3];
      MatVecMult(RotMatrix,Norms,NewNorms);                     // Not scaled
      objlist_copy(Norms,NewNorms,3);
    }

    // So as to be consistent with the new points
    Model.FindBoundingBox();
  }

  Model.AdjustNormals(NormalType,NormalSplit);
  Model.CalculateTangents();

  // Don't forget the skins
  OGL_SkinManager::Load();
}