Ejemplo n.º 1
0
void C3DS::ReadMeshVertices(stChunk* Chunk)
{
	unsigned int iNumberVertices = 0;
	Chunk->bytesRead += (unsigned int)fread(&iNumberVertices, 1, 2, m_fp);	

	// Allocate Memory and dump our vertices to the screen.
	stVert *pVerts = new stVert[iNumberVertices];

	Chunk->bytesRead += (unsigned int)fread( (void*)pVerts, 1, iNumberVertices*sizeof(stVert), m_fp);

	stMesh* pMesh = &(m_pMeshs[m_iNumMeshs - 1]);
	pMesh->pVerts = pVerts;
	pMesh->iNumVerts = iNumberVertices;
	
	// Crazy but true, the z and y need to be swapped around!
	for(int i=0; i< pMesh->iNumVerts; i++)
	{
		pMesh->pVerts[i].x = pMesh->pVerts[i].x;
		float tempz = pMesh->pVerts[i].y;
		pMesh->pVerts[i].y = pMesh->pVerts[i].z;
		pMesh->pVerts[i].z = tempz;
	}

	SkipChunk(Chunk);
}
// For reading the master chunk (ideally, whole file)
static bool ReadMaster(OpenedFile& OFile, int32 ParentChunkEnd)
{
	int32 Location = 0;
	OFile.GetPosition(Location);
	
	while(Location < ParentChunkEnd)
	{
		ChunkHeaderData ChunkHeader;
		if (!ReadChunkHeader(OFile,ChunkHeader)) return false;
		
		switch(ChunkHeader.ID)
		{
		case EDITOR:
			if (!ReadContainer(OFile,ChunkHeader,ReadEditor)) return false;
			break;
				
		default:
			if (!SkipChunk(OFile,ChunkHeader)) return false;
		}
		
		// Where are we now?
		OFile.GetPosition(Location);
	}
	
	if (Location > ParentChunkEnd)
	{
		if (DBOut)
			fprintf(DBOut,"ERROR: Overran parent chunk: %ld > %ld\n",Location,ParentChunkEnd);
		return false;
	}
	return true;
}
Ejemplo n.º 3
0
bool L3DS::FindChunk(LChunk &target, const LChunk &parent)
{
    if (Pos() >= parent.end)
        return false;
    LChunk chunk;
    chunk = ReadChunk();
    while (( chunk.id != target.id) && (chunk.end <= parent.end))
    {
        SkipChunk(chunk);
        if (chunk.end >= parent.end)
            break;
        unsigned short id = chunk.id;
        uint end = chunk.end;
        chunk = ReadChunk();
        // try to detect a endless loop amz
        if(id == chunk.id && end == chunk.end)
            break;
    }
    if (chunk.id == target.id)
    {
        target.start = chunk.start;
        target.end = chunk.end;
        return true;
    }
    return false;
}
Ejemplo n.º 4
0
// For reading the face-data chunk
static bool ReadFaceData(OpenedFile& OFile, int32 ParentChunkEnd)
{
	uint8 NFBuffer[2];
	uint16 NumFaces;
	if (!OFile.Read(2,NFBuffer))
	{
		logError1("ERROR reading number of faces in %s",Path);
		return false;
	}
	uint8 *S = NFBuffer;
	StreamToValue(S,NumFaces);
	
	int32 DataSize = 4*sizeof(uint16)*int(NumFaces);
	SetChunkBufferSize(DataSize);
	if (!OFile.Read(DataSize,ChunkBufferBase()))
	{
		logError1("ERROR reading face-chunk contents in %s",Path);
		return false;
	}
	
	S = ChunkBufferBase();
	ModelPtr->VertIndices.resize(3*NumFaces);
	for (int k=0; k<NumFaces; k++)
	{
		uint16 *CurrPoly = ModelPtr->VIBase() + 3*k;
		uint16 Flags;
		StreamToList(S,CurrPoly,3);
		StreamToValue(S,Flags);
	}
	
	int32 Location = 0;
	OFile.GetPosition(Location);
	
	while(Location < ParentChunkEnd)
	{
		ChunkHeaderData ChunkHeader;
		if (!ReadChunkHeader(OFile,ChunkHeader)) return false;
		
		switch(ChunkHeader.ID)
		{
		/*
		case OBJECT:
			if (!ReadContainer(OFile,ChunkHeader,ReadObject)) return false;
			break;
		*/
		default:
			if (!SkipChunk(OFile,ChunkHeader)) return false;
		}
		
		// Where are we now?
		OFile.GetPosition(Location);
	}
	
	if (Location > ParentChunkEnd)
	{
		logError3("ERROR: Overran parent chunk: %d > %d in %s",Location,ParentChunkEnd,Path);
		return false;
	}
	return true;
}
Ejemplo n.º 5
0
// For reading the editor-data chunk
static bool ReadEditor(OpenedFile& OFile, int32 ParentChunkEnd)
{
	int32 Location = 0;
	OFile.GetPosition(Location);
	
	while(Location < ParentChunkEnd)
	{
		ChunkHeaderData ChunkHeader;
		if (!ReadChunkHeader(OFile,ChunkHeader)) return false;
		
		switch(ChunkHeader.ID)
		{
		case OBJECT:
			if (!ReadContainer(OFile,ChunkHeader,ReadObject)) return false;
			break;
			
		default:
			if (!SkipChunk(OFile,ChunkHeader)) return false;
		}
		
		// Where are we now?
		OFile.GetPosition(Location);
	}
	
	if (Location > ParentChunkEnd)
	{
		logError3("ERROR: Overran parent chunk: %d > %d in %s",Location,ParentChunkEnd,Path);
		return false;
	}
	return true;
}
Ejemplo n.º 6
0
void L3DS::ReadCamera(const LChunk &parent)
{
    LVector3 v,t;
    LCamera camera;
    camera.SetName(m_objName);
    v.x = ReadFloat();
    v.y = ReadFloat();
    v.z = ReadFloat();
    t.x = ReadFloat();
    t.y = ReadFloat();
    t.z = ReadFloat();
    camera.SetPosition(v);
    camera.SetTarget(t);
    camera.SetBank(ReadFloat());
    camera.SetFOV(2400.0f/ReadFloat());
    LChunk chunk = ReadChunk();
    while (chunk.end <= parent.end)
    {
        switch (chunk.id)
        {
        case CAM_RANGES:
            camera.SetNearplane(ReadFloat());
            camera.SetFarplane(ReadFloat());
            break;
        default:
            break;
        }
        SkipChunk(chunk);
        if (chunk.end >= parent.end)
            break;
        chunk = ReadChunk();

    }
    m_cameras.push_back(camera);
}
Ejemplo n.º 7
0
void ReadRGB(int Format, unsigned char &Red, unsigned char &Green, unsigned char &Blue){
  switch (Format){
    case M3D_3DS_RGB3F:
      Red   = (unsigned char)Stream->ReadFloat()*255;
      Green = (unsigned char)Stream->ReadFloat()*255;
      Blue  = (unsigned char)Stream->ReadFloat()*255;
      break;

    case M3D_3DS_RGB3B:
      Red   = Stream->ReadByte();
      Green = Stream->ReadByte();
      Blue  = Stream->ReadByte();
      break;

    case M3D_3DS_RGBGAMMA3F:
      Red   = (unsigned char)Stream->ReadFloat()*255;
      Green = (unsigned char)Stream->ReadFloat()*255;
      Blue  = (unsigned char)Stream->ReadFloat()*255;
      break;

    case M3D_3DS_RGBGAMMA3B:
      Red   = Stream->ReadByte();
      Green = Stream->ReadByte();
      Blue  = Stream->ReadByte();
      break;

    default:
      SkipChunk();
  }
}
Ejemplo n.º 8
0
__regargs PaletteT *LoadPalette(const char *filename) {
  PaletteT *palette = NULL;
  IffFileT iff;

  if (OpenIff(&iff, filename)) {
    if (iff.header.type == ID_ILBM) {
      while (ParseChunk(&iff)) {
        switch (iff.chunk.type) {
          case ID_CMAP:
            palette = NewPalette(iff.chunk.length / sizeof(ColorT));
            ReadChunk(&iff, palette->colors);
            break;

          default:
            SkipChunk(&iff);
            break;
        }
      }
    }

    CloseIff(&iff);
  }

  return palette;
}
Ejemplo n.º 9
0
void L3DS::ReadFaceList(const LChunk &chunk, LMesh &mesh)
{
    // variables 
    unsigned short count, t;    
    uint i;
    LTri tri;
    LChunk ch;
    char str[20];
    //uint mat;

    // consistency checks
    if (chunk.id != TRI_FACELIST)
    {
        ErrorMsg("L3DS::ReadFaceList - internal error: wrong chunk passed as parameter");
        return;
    }
    GotoChunk(chunk);
    tri.smoothingGroups = 1;
    // read the number of faces
    count = ReadShort();
    mesh.SetTriangleArraySize(count);
    for (i=0; i<count; i++)
    {
        tri.a = ReadShort();
        tri.b = ReadShort();
        tri.c = ReadShort();
        ReadShort();
        mesh.SetTri(tri, i);
    }
    // now read the optional chunks
    ch = ReadChunk();
    int mat_id;
    while (ch.end <= chunk.end)
    {
        switch (ch.id)
        {
        case TRI_MAT_GROUP:
            ReadASCIIZ(str, 20);
			mat_id=0;
			if (FindMaterial(str)!=NULL)
				mat_id = FindMaterial(str)->GetID();
            mesh.AddMaterial(mat_id);
            count = ReadShort();
            for (i=0; i<count; i++) 
            {
                t = ReadShort();
                mesh.GetTri(t).materialId = mat_id;
            }                
            break;
        case TRI_SMOOTH_GROUP:
            for (i=0; i<mesh.GetTriangleCount(); i++)
                mesh.GetTri(i).smoothingGroups = (ulong) ReadInt();
            break;
        }
        SkipChunk(ch);
        ch = ReadChunk();
    }
}
// For reading the object-data chunk
static bool ReadObject(OpenedFile& OFile, int32 ParentChunkEnd)
{
	// Read the name
	if (DBOut) fprintf(DBOut,"Object Name: ");
	while(true)
	{
		char c;
		if (!OFile.Read(1,&c))
		{
			if (DBOut) fprintf(DBOut,"ERROR in reading name");
			return false;
		}
		
		if (c == 0)
		{
			if (DBOut) fprintf(DBOut,"\n");
			break;
		}
		else
		{
			if (DBOut) fprintf(DBOut,"%c",c);
		}
	}
	
	int32 Location = 0;
	OFile.GetPosition(Location);
	
	while(Location < ParentChunkEnd)
	{
		ChunkHeaderData ChunkHeader;
		if (!ReadChunkHeader(OFile,ChunkHeader)) return false;
		
		switch(ChunkHeader.ID)
		{
		case TRIMESH:
			if (!ReadContainer(OFile,ChunkHeader,ReadTrimesh)) return false;
			break;
			
		default:
			if (!SkipChunk(OFile,ChunkHeader)) return false;
		}
		
		// Where are we now?
		OFile.GetPosition(Location);
	}
	
	if (Location > ParentChunkEnd)
	{
		if (DBOut)
			fprintf(DBOut,"ERROR: Overran parent chunk: %ld > %ld\n",Location,ParentChunkEnd);
		return false;
	}
	return true;
}
Ejemplo n.º 11
0
void C3DS::ReadNameOfObjectToAnimate(stChunk* Chunk)
{
	char str[256];
	Chunk->bytesRead += GetString(str);

	stAnimation* pAnim = &(m_pAnimation[m_iNumAnimObjects - 1]);

	strcpy(pAnim->szObjName, str);

	// Skip hierachy
	SkipChunk(Chunk);
}
Ejemplo n.º 12
0
unsigned char ReadPercent(int Format){
  switch (Format){
    case M3D_3DS_PERCENTI:
      return (int)Stream->ReadShort();

    case M3D_3DS_PERCENTF:
      return (int)Stream->ReadFloat();

    default:
      SkipChunk();
      return 0.0;
  }
}
Ejemplo n.º 13
0
void C3DS::ReadMeshTexCoords(stChunk* Chunk)
{
    unsigned short iNumberVertices = 0;
    Chunk->bytesRead += (unsigned int)fread(&iNumberVertices, 1, 2, m_fp);

    // Allocate Memory and dump our texture for each vertice to the screen.
    stTex *pTex = new stTex[iNumberVertices];

    Chunk->bytesRead += (unsigned int)fread( (void*)pTex, 1, iNumberVertices*sizeof(stTex), m_fp);

    stMesh* pMesh = &(m_pMeshs[m_iNumMeshs - 1]);
    pMesh->pTexs = pTex;

    SkipChunk(Chunk);
}
Ejemplo n.º 14
0
void L3DS::ReadLight(const LChunk &parent)
{
    float t;
    LVector3 v;
    LLight light;
    light.SetName(m_objName);
    v.x = ReadFloat();
    v.y = ReadFloat();
    v.z = ReadFloat();
    light.SetPosition(v);
    LChunk chunk = ReadChunk();
    while (chunk.end <= parent.end)
    {
        switch (chunk.id)
        {
        case COLOR_24:
        case COLOR_F:
        case LIN_COLOR_F:
        case LIN_COLOR_24:
            light.SetColor(ReadColor(chunk));
            break;
        case SPOTLIGHT:
            v.x = ReadFloat();
            v.y = ReadFloat();
            v.z = ReadFloat();
            light.SetTarget(v);
            t = ReadFloat();
            light.SetHotspot(t);
            t = ReadFloat();
            light.SetFalloff(t);
            break;
        case LIT_INRANGE:
            light.SetAttenuationstart(ReadFloat());
            break;
        case LIT_OUTRANGE:
            light.SetAttenuationend(ReadFloat());
            break;
        default:
            break;
        }
        SkipChunk(chunk);
        if (chunk.end >= parent.end)
            break;
        chunk = ReadChunk();

    }
    m_lights.push_back(light);
}
Ejemplo n.º 15
0
// Ambient (rgb)
void C3DS::GetAmbientColour(stChunk* Chunk)
{
	struct stRGB{ unsigned char r, g, b; };
	stRGB AmbColour;

	char ChunkHeader[6];
	Chunk->bytesRead += (unsigned int)fread(ChunkHeader, 1, 6, m_fp);

	Chunk->bytesRead += (unsigned int)fread(&AmbColour, 1, 3, m_fp);	

	stMaterial* pM = &(m_pMaterials[m_iNumMaterials-1]);
	pM->Ambient.r = AmbColour.r;
	pM->Ambient.g = AmbColour.g;
	pM->Ambient.b = AmbColour.b;

	SkipChunk(Chunk);
}
Ejemplo n.º 16
0
// Read in our diffuse colour (rgb)
void C3DS::GetDiffuseColour(stChunk* Chunk)
{
    struct stRGB{ unsigned char r, g, b; };
    stRGB DiffColour;

    char ChunkHeader[6];
    Chunk->bytesRead += (unsigned int)fread(ChunkHeader, 1, 6, m_fp);

    Chunk->bytesRead += (unsigned int)fread(&DiffColour, 1, 3, m_fp);

    stMaterial* pM = &(m_pMaterials[m_iNumMaterials-1]);
    pM->Colour.r = DiffColour.r;
    pM->Colour.g = DiffColour.g;
    pM->Colour.b = DiffColour.b;

    SkipChunk(Chunk);
}
Ejemplo n.º 17
0
void C3DS::ReadMeshVertices(stChunk* Chunk)
{
    unsigned int iNumberVertices = 0;
    Chunk->bytesRead += (unsigned int)fread(&iNumberVertices, 1, 2, m_fp);

    // Allocate Memory and dump our vertices to the screen.
    stVert *pVerts = new stVert[iNumberVertices];
    stVert *pNormalVerts = new stVert[iNumberVertices];

    Chunk->bytesRead += (unsigned int)fread( (void*)pVerts, 1, iNumberVertices*sizeof(stVert), m_fp);

    stMesh* pMesh = &(m_pMeshs[m_iNumMeshs - 1]);
    pMesh->pVerts = pVerts;
    pMesh->pNormalVerts = pNormalVerts;
    pMesh->iNumVerts = iNumberVertices;

    SkipChunk(Chunk);
}
// For reading the triangle-mesh-data chunk
static bool ReadTrimesh(OpenedFile& OFile, int32 ParentChunkEnd)
{
	int32 Location = 0;
	OFile.GetPosition(Location);
	
	assert(ModelPtr);
	
	while(Location < ParentChunkEnd)
	{
		ChunkHeaderData ChunkHeader;
		if (!ReadChunkHeader(OFile,ChunkHeader)) return false;
		
		switch(ChunkHeader.ID)
		{
		case VERTICES:
			if (!LoadChunk(OFile,ChunkHeader)) return false;
			LoadVertices();
			break;
			
		case TXTR_COORDS:
			if (!LoadChunk(OFile,ChunkHeader)) return false;
			LoadTextureCoordinates();
			break;
			
		case FACE_DATA:
			if (!ReadContainer(OFile,ChunkHeader,ReadFaceData)) return false;
			break;
			
		default:
			if (!SkipChunk(OFile,ChunkHeader)) return false;
		}
		
		// Where are we now?
		OFile.GetPosition(Location);
	}
	
	if (Location > ParentChunkEnd)
	{
		if (DBOut)
			fprintf(DBOut,"ERROR: Overran parent chunk: %ld > %ld\n",Location,ParentChunkEnd);
		return false;
	}
	return true;
}
Ejemplo n.º 19
0
// For reading the object-data chunk
static bool ReadObject(OpenedFile& OFile, int32 ParentChunkEnd)
{
	// Read the name
	char c;
	do
	{
		if (!OFile.Read(1,&c))
		{
			logError1("ERROR when reading name in %s",Path);
			return false;
		}
	}
	while(c != 0);
	
	int32 Location = 0;
	OFile.GetPosition(Location);
	
	while(Location < ParentChunkEnd)
	{
		ChunkHeaderData ChunkHeader;
		if (!ReadChunkHeader(OFile,ChunkHeader)) return false;
		
		switch(ChunkHeader.ID)
		{
		case TRIMESH:
			if (!ReadContainer(OFile,ChunkHeader,ReadTrimesh)) return false;
			break;
			
		default:
			if (!SkipChunk(OFile,ChunkHeader)) return false;
		}
		
		// Where are we now?
		OFile.GetPosition(Location);
	}
	
	if (Location > ParentChunkEnd)
	{
		logError3("ERROR: Overran parent chunk: %d > %d in %s",Location,ParentChunkEnd,Path);
		return false;
	}
	return true;
}
Ejemplo n.º 20
0
bool L3DS::FindChunk(LChunk &target, const LChunk &parent)
{
    if (Pos() >= parent.end)
        return false;
    LChunk chunk;
    chunk = ReadChunk();
    while (( chunk.id != target.id) && (chunk.end <= parent.end))
    {
        SkipChunk(chunk);
        if (chunk.end >= parent.end)
            break;
        chunk = ReadChunk();
    }
    if (chunk.id == target.id)
    {
        target.start = chunk.start;
        target.end = chunk.end;
        return true;
    }
    return false;
}
Ejemplo n.º 21
0
int main() {
  UWORD len = __commandlen;
  STRPTR filename = __builtin_alloca(len);
  IffFileT iff;

  memcpy(filename, __commandline, len--);
  filename[len] = '\0';

  OpenIff(&iff, filename);
  Log("Parsing '%s':\n", filename);
  Log("%.4s %ld\n", (STRPTR)&iff.header.type, iff.header.length);

  while (ParseChunk(&iff)) {
    Log(".%.4s %ld\n", (STRPTR)&iff.chunk.type, iff.chunk.length);
    SkipChunk(&iff);
  }

  CloseIff(&iff);

  return 0;
}
Ejemplo n.º 22
0
void L3DS::ReadMap(const LChunk &chunk, LMap& map)
{
    LChunk child;
    char str[20];
    GotoChunk(chunk);
    child = ReadChunk();
    while (child.end <= chunk.end)
    {
        switch (child.id)
        {
        case INT_PERCENTAGE:
            map.strength = ReadPercentage(child);
            break;
        case MAT_MAPNAME:
            ReadASCIIZ(str, 20);
            strcpy(map.mapName, str);
            break;
        case MAT_MAP_TILING:
            map.tiling = ReadShort();
            break;
        case MAT_MAP_USCALE:
            map.uScale = ReadFloat();
            break;
        case MAT_MAP_VSCALE:
            map.vScale = ReadFloat();
            break;
        case MAT_MAP_UOFFSET:
            map.uOffset = ReadFloat();
            break;
        case MAT_MAP_VOFFSET:
            map.vOffset = ReadFloat();
            break;
        case MAT_MAP_ANG:
            map.angle = ReadFloat();
            break;
        }
        SkipChunk(child);
        child = ReadChunk();
    }
}
Ejemplo n.º 23
0
__regargs BitmapT *LoadILBM(const char *filename, BOOL interleaved) {
  BitmapT *bitmap = NULL;
  PaletteT *palette = NULL;
  IffFileT iff;

  if (OpenIff(&iff, filename)) {
    if (iff.header.type == ID_ILBM) {
      BOOL compression = FALSE;

      while (ParseChunk(&iff)) {
        BitmapHeaderT bmhd;

        switch (iff.chunk.type) {
          case ID_BMHD:
            ReadChunk(&iff, &bmhd);
            bitmap = NewBitmap(bmhd.w, bmhd.h, bmhd.nPlanes, interleaved);
            compression = bmhd.compression;
            break;

          case ID_CMAP:
            palette = NewPalette(iff.chunk.length / sizeof(ColorT));
            ReadChunk(&iff, palette->colors);
            break;
        
          case ID_BODY:
            {
              BYTE *data = MemAlloc(iff.chunk.length, MEMF_PUBLIC);
              LONG size = iff.chunk.length;

              ReadChunk(&iff, data);

              if (compression) {
                LONG newSize = bitmap->bplSize * bitmap->depth;
                BYTE *uncompressed = MemAlloc(newSize, MEMF_PUBLIC);

                UnRLE(data, size, uncompressed);
                MemFree(data, size);

                data = uncompressed;
                size = newSize;
              }

              if (!interleaved)
                Deinterleave(data, bitmap);
              else
                memcpy(bitmap->planes[0], data, bitmap->bplSize * bitmap->depth);

              MemFree(data, size);
            }
            break;

          default:
            SkipChunk(&iff);
            break;
        }
      }

      if (bitmap)
        bitmap->palette = palette;
    }

    CloseIff(&iff);
  } else {
    Log("File '%s' missing.\n", filename);
  }

  return bitmap;
}
Ejemplo n.º 24
0
Mesh* Load3ds(string URL, Entity* parent_ent){
  int Size;
  //Local OldDir:String
  unsigned char Red, Green, Blue;
  //unsigned char Percent;
  //Local Pixmap:TPixmap
  Stream = File::ReadResourceFile(URL);
  if (Stream == 0) return 0;

  //Size = Stream.Size()
  fseek(Stream->pFile, 0, SEEK_END); // seek to end of file
  Size = ftell(Stream->pFile); // get current file pointer
  fseek(Stream->pFile, 0, SEEK_SET);

  // Read Main-Chunk
  ReadChunk();
  if (ChunkID != M3D_3DS_MAIN || ChunkSize != Size) {
    Stream->CloseFile();
    //Print "No 3DS File"
    return 0;
  }
  // Find 3DEditor-Chunk
  while (Stream->Eof()==0){
    ReadChunk();
    if (ChunkID == M3D_3DS_3DEDITOR){
      break;
    }else{
      SkipChunk();
    }
  }

  //OldDir = CurrentDir()
  //If String(URL) <> "" Then ChangeDir(ExtractDir(String(URL)))
  mesh = Mesh::CreateMesh();
  while (Stream->Eof()==0){
    ReadChunk();
    switch (ChunkID){
    case M3D_3DS_OBJECTBLOCK:
      ReadCString(); // ' ObjectName
      break;
    case M3D_3DS_BrushBLOCK:
      ReadBrushBlock();
      break;
    case M3D_3DS_TRIMESH:
      ReadTriMesh();
      break;
    case M3D_3DS_VERTEXLIST:
      ReadVertexList();
      break;
    case M3D_3DS_FACELIST:
      ReadFaceList();
      break;
    case M3D_3DS_FACEMATLIST:
      ReadFaceMatList();
      break;
    case M3D_3DS_TEXCOORDS:
      ReadTexCoords();
      break;
    case M3D_3DS_BrushNAME:
      //Loader.Brush = CreateBrush()
      brush->name = ReadCString();
      break;
    case M3D_3DS_BrushAMBIENT:
      //ReadChunk();
      //ReadRGB(ChunkID, Red, Green, Blue);
      //brush->SetAmbientColor(Red, Green, Blue);
      break;
    case M3D_3DS_BrushDIFFUSE:
      ReadChunk();
      ReadRGB(ChunkID, Red, Green, Blue);
      brush->BrushColor(Red, Green, Blue);
      break;
    case M3D_3DS_BrushSPECULAR:
      //'Loader.ReadChunk()
      //'Loader.ReadRGB(Loader.ChunkID, Red, Green, Blue)
      //'Loader.Brush.SetSpecularColor(Red, Green, Blue)
      break;
    case M3D_3DS_BrushSHININESS:
      //'Loader.ReadChunk()
      //'Percent = Loader.ReadPercent(Loader.ChunkID)
      //'Loader.Brush.BrushShininess(Percent)
      break;
    case M3D_3DS_MAPFILENAME:
      LoadMap();
      break;
    case M3D_3DS_MAPVSCALE:
      texture->v_scale = Stream->ReadFloat();
      break;
    case M3D_3DS_MAPUSCALE:
      texture->u_scale = Stream->ReadFloat();
      break;
    case M3D_3DS_MAPUOFFSET:
      texture->u_pos = Stream->ReadFloat();
      break;
    case M3D_3DS_MAPVOFFSET:
      texture->v_pos = Stream->ReadFloat();
      break;
    case M3D_3DS_MAPROTATION:
      texture->angle = Stream->ReadFloat();
      break;
    default:
      if ((ChunkID == M3D_3DS_TEXTUREMAP1) || (ChunkID == M3D_3DS_TEXTUREMAP2)) {
        ReadMap(ChunkID);
      }else{
        SkipChunk();
      }
    }
  }
  Stream->CloseFile();

  if (surface!=0){
    MovedTris.sort();
    int CheckSurface=0;
    for(list<int>::const_reverse_iterator it = MovedTris.rbegin(); it != MovedTris.rend(); it++){
      surface->RemoveTri(*it);
      CheckSurface=1;
    }
    MovedTris.clear();

    if (surface->no_tris==0 && CheckSurface !=0) {
      delete surface;
      mesh->surf_list.remove(surface);
      mesh->no_surfs=mesh->no_surfs-1;
    }
  }


//    ChangeDir(OldDir)
//    Loader.Surface.UpdateVertices()
//    Loader.Surface.UpdateTriangles()
  mesh->UpdateNormals();
  /*Loader.Mesh.UpdateBuffer()
  Print Loader.Surface.Tris.Length
  Print Loader.Surface.no_verts
  'Loader.Mesh.FlipMesh()*/

  mesh->class_name="Mesh";
  mesh->AddParent(*parent_ent);
  Entity::entity_list.push_back(mesh);
  if(mesh->parent!=0){
    mesh->mat.Overwrite(mesh->parent->mat);
    mesh->UpdateMat();
  }else{
    mesh->UpdateMat(true);
  }
  return mesh;
}
Ejemplo n.º 25
0
void sXSILoader::ScanMatLib(sInt indent)
{
  sChar chunk[XSISIZE];
  sChar name[XSISIZE];
  sChar texname[256];
  sChar buffer[XSISIZE];
  sChar pname[XSISIZE];
  sChar tname[XSISIZE];
  sChar tsup[2][XSISIZE];
  sInt texena[2];

  sXSIMaterial *mat;
  sXSITexture *tex;
  sInt i,max;
  sInt pcount,ccount;
  sInt ival;
  sF32 fval;

  ScanInt();
  while(*Scan!=0 && *Scan!='}' && !Error)
  {
    ScanChunk(indent,chunk,name);

    if(sCmpString(chunk,"SI_Material")==0)
    {
      mat = new sXSIMaterial;
      sCopyString(mat->Name,name,sizeof(mat->Name));
      mat->Flags |= 0;
      Materials->Add(mat);

      ScanFloat(); ScanFloat(); ScanFloat(); ScanFloat();
      ScanFloat(); ScanFloat(); ScanFloat(); ScanFloat();
      ScanFloat(); ScanFloat(); ScanFloat(); 
      ScanInt();
      ScanFloat(); ScanFloat(); ScanFloat();

      sScanSpace(Scan);
      while(*Scan!=0 && *Scan!='}' && !Error)
      {
        ScanChunk(indent+1,chunk,name);
        if(sCmpString(chunk,"SI_Texture2D")==0)
        {
          ScanString(texname,sizeof(texname));
          ScanInt(); ScanInt(); ScanInt(); ScanInt();
          ScanInt(); ScanInt(); ScanInt(); ScanInt();
          ScanInt(); ScanInt(); ScanInt(); ScanInt();
          ScanFloat(); ScanFloat(); ScanFloat(); ScanFloat();
          ScanFloat(); ScanFloat(); ScanFloat(); ScanFloat();
          ScanFloat(); ScanFloat(); ScanFloat(); ScanFloat();
          ScanFloat(); ScanFloat(); ScanFloat(); ScanFloat();
          ScanFloat(); ScanFloat(); ScanFloat(); ScanFloat();
          ScanInt();
          ScanFloat(); ScanFloat(); ScanFloat(); ScanFloat();
          ScanFloat(); ScanFloat(); ScanFloat();
          EndChunk();

          if(mat->Tex[0] == 0)
          {
            tex = FindTexture(texname);
            if(tex)
              mat->Tex[0] = tex;
          }
        }
        else
        {
          SkipChunk();
        }
        sScanSpace(Scan);
      }
      EndChunk();
    }
    else if(sCmpString(chunk,"XSI_Material")==0)
    {
      mat = new sXSIMaterial;
      sCopyString(mat->Name,name,sizeof(mat->Name));
      mat->TFlags[0] = 0;
      mat->TFlags[1] = 0;
      mat->Flags |= 0;
			sDPrintF("%08x:<%s>\n",Scan,name);
      Materials->Add(mat);


      max = ScanInt();
      for(i=0;i<max;i++)
      {
        ScanString(buffer,sizeof(buffer));
        ScanString(buffer,sizeof(buffer));
      }
      sScanSpace(Scan);
      tsup[0][0]=0;
      tsup[0][1]=0;
      texena[0] = 0;
      texena[1] = 0;
      while(*Scan!=0 && *Scan!='}' && !Error)
      {
        ScanChunk(indent+1,chunk,name);

        if(sCmpString(chunk,"XSI_Shader")==0)
        {
          ScanString(buffer,sizeof(buffer));
          ScanInt();
          pcount = ScanInt();
          ccount = ScanInt();
          for(i=0;i<pcount;i++)
          {
            ScanString(pname,sizeof(pname));
            ScanString(tname,sizeof(tname));
            if(sCmpString(tname,"STRING")==0)
            {
              ScanString(buffer,sizeof(buffer));
              if(sCmpString(pname,"tspace_id1")==0)   sCopyString(tsup[0],buffer,sizeof(tsup[0]));
              if(sCmpString(pname,"tspace_id" )==0)   sCopyString(tsup[0],buffer,sizeof(tsup[0]));
              if(sCmpString(pname,"tspace_id2")==0)   sCopyString(tsup[1],buffer,sizeof(tsup[1]));
            }
            else if(sCmpString(tname,"FLOAT")==0)
            {
              fval = ScanFloat();
              ival = sRange<sInt>(255*fval,255,0);
              if(sCmpString(pname,"Ambient.red")==0)    mat->Ambient.r = ival;
              if(sCmpString(pname,"Ambient.green")==0)  mat->Ambient.g = ival;
              if(sCmpString(pname,"Ambient.blue")==0)   mat->Ambient.b = ival;
              if(sCmpString(pname,"Diffuse.red")==0)    mat->Diffuse.r = ival;
              if(sCmpString(pname,"Diffuse.green")==0)  mat->Diffuse.g = ival;
              if(sCmpString(pname,"Diffuse.blue")==0)   mat->Diffuse.b = ival;
              if(sCmpString(pname,"Specular.red")==0)   mat->Specular.r = ival;
              if(sCmpString(pname,"Specular.green")==0) mat->Specular.g = ival;
              if(sCmpString(pname,"Specular.blue")==0)  mat->Specular.b = ival;
              if(sCmpString(pname,"Shininess")==0)      mat->Specularity = fval;
            }
            else if(sCmpString(tname,"INTEGER")==0)
            {
              ival = ScanInt();
            }
            else if(sCmpString(tname,"BOOLEAN")==0)
            {
              ival = ScanInt();
              if(ival!=0)
              {
//                if(sCmpString(pname,"WrapS1")==0)     mat->TFlags[0] |= sMTF_TILE;
//                if(sCmpString(pname,"WrapT1")==0)     mat->TFlags[0] |= sMTF_TILE;
                if(sCmpString(pname,"Refmap1")==0)    mat->TFlags[0] |= sMTF_UVENVI;
                if(sCmpString(pname,"Texture_1_Enable")==0) texena[0]=1;

//                if(sCmpString(pname,"WrapS2")==0)     mat->TFlags[1] |= sMTF_TILE;
//                if(sCmpString(pname,"WrapT2")==0)     mat->TFlags[1] |= sMTF_TILE;
                if(sCmpString(pname,"Refmap2")==0)    mat->TFlags[1] |= sMTF_UVENVI;
                if(sCmpString(pname,"Texture_2_Enable")==0) texena[1]=1;
              }
              else
              {
                if(sCmpString(pname,"Enable_Ambient")==0)  mat->Ambient = 0xffffffff;
                if(sCmpString(pname,"Enable_Diffuse")==0)  mat->Diffuse = 0xffffffff;
                if(sCmpString(pname,"Enable_Specular")==0) mat->Specular = 0xffffffff;
                if(sCmpString(pname,"Enable_Shininess")==0) mat->Specularity = 0;
//                if(sCmpString(pname,"Enable_Lighting")==0) mat->Flags &= ~sMF_LIGHTMASK;
              }
              
            }
            else
            {
              Error = sTRUE;
            }
          }
          for(i=0;i<ccount;i++)
          {
            ScanString(pname,sizeof(pname));
            ScanString(buffer,sizeof(buffer));
            ScanString(tname,sizeof(tname));
            if(sCmpString(tname,"IMAGE")==0)
            {
              if((sCmpString(pname,"Texture_1")==0 || sCmpString(pname,"tex")==0) && texena[0])
              {
                if(mat->Tex[0] == 0 
                  && (tsup[0][0]!=0 || (mat->TFlags[0]&sMTF_UVMASK)==sMTF_UVENVI) 
                  && TSCount<sXSI_MAXTS)
                {
                  tex = FindTexture(buffer);
                  if(tex)
                  {
                    mat->Tex[0] = tex;
                    mat->Mode = sMBM_TEX;
                    sCopyString(TSName[TSCount],tsup[0],XSISIZE);
                    mat->TUV[0] = TSCount++;
                  }
                }
              }

              if(sCmpString(pname,"Texture_2")==0 && texena[1])
              {
                if(mat->Tex[1] == 0 
                  && (tsup[1][0]!=0 || (mat->TFlags[1]&sMTF_UVMASK)==sMTF_UVENVI) 
                  && TSCount<sXSI_MAXTS)
                {
                  tex = FindTexture(buffer);
                  if(tex)
                  {
                    mat->Tex[1] = tex;
                    mat->Mode = sMBM_MUL;
//                    mat->TFlags[1] = sMTF_FILTER|sMTF_MIPMAP;//|sMTF_UVENVI;
                    sCopyString(TSName[TSCount],tsup[1],XSISIZE);
                    mat->TUV[1] = TSCount++;
                  }
                }
              }
            }
          }
          sScanSpace(Scan);
          while(*Scan!=0 && *Scan!='}' && !Error)
          {
            ScanChunk(indent+1,chunk,name);
            SkipChunk();
            sScanSpace(Scan);
          }
          EndChunk();
        }
        else
        {
          SkipChunk();
        }
        sScanSpace(Scan);
      }      
      if((mat->TFlags[1] & sMTF_UVMASK)==0)
        mat->TFlags[1] |= sMTF_UV1;
      if(mat->Specularity>0.0001f || mat->Ambient!=0xffffffff 
        || mat->Diffuse != 0xffffffff || mat->Specular != 0xffffffff)
      {
//        mat->Flags = (mat->Flags & (~sMF_LIGHTMASK)) | sMF_LIGHTMAT;
//        sDPrintF("extlight: %08x %08x %08x\n",mat->Diffuse.Color,mat->Ambient.Color,mat->Specular.Color);
      }
      else
      {
//        mat->Flags |= sMF_COLBOTH;
      }
      mat->TFlags[0] |= sMTF_FILTERMIN | sMTF_FILTERMAG | sMTF_MIPMAP;
      mat->TFlags[1] |= sMTF_FILTERMIN | sMTF_FILTERMAG | sMTF_MIPMAP;
      EndChunk();
    }
    else
    {
      SkipChunk();
    }
    sScanSpace(Scan);
  }
  EndChunk();
}
Ejemplo n.º 26
0
void C3DS::ParseChunk(stChunk* Chunk){
    while(Chunk->bytesRead < Chunk->length){
        stChunk tempChunk = {0, 0, 0};
        ReadChunk(&tempChunk);

        switch( tempChunk.ID){
        // HEADER OUR ENTRY POINT
        case EDIT3DS: //0x3D3D
            ParseChunk(&tempChunk);
            break;

            // MATERIALS
        case MATERIAL: //0xAFFF
            stMaterial newMaterial;
            m_pMaterials.push_back(newMaterial);
            m_iNumMaterials++;
            ParseChunk(&tempChunk);
            break;
        case MAT_NAME: //0xA000 - sz for hte material name "e.g. default 2"
            GetMaterialName(&tempChunk);
            break;
        case MAT_DIFFUSE:  // Diffuse Colour  //0xA020
            GetDiffuseColour(&tempChunk);
            break;
        case MAT_TEXMAP:  //0xA200 - if there's a texture wrapped to it where here
            ParseChunk(&tempChunk);
            break;
        case MAT_TEXFLNM: // 0xA300 -  get filename of the material
            GetTexFileName(&tempChunk);
            break;

            // OBJECT - MESH'S
        case NAMED_OBJECT:{
            stMesh newMesh;
            m_pMeshs.push_back(newMesh);
            m_iNumMeshs++;
            GetMeshObjectName(&tempChunk);
        }
            break;
        case OBJ_MESH:     //0x4100
            ParseChunk(&tempChunk);
            break;
        case MESH_VERTICES: //0x4110
            ReadMeshVertices(&tempChunk);
            break;
        case MESH_FACES: //0x4120
            ReadMeshFaces(&tempChunk);
            break;
        case MESH_TEX_VERT: //0x4140
            ReadMeshTexCoords(&tempChunk);
            break;
        case MESH_MATER: //0x4130
            ReadMeshMaterials(&tempChunk);
            break;

        default:
            SkipChunk(&tempChunk);
        }

        Chunk->bytesRead += tempChunk.length;
    }
}
Ejemplo n.º 27
0
bool L3DS::Read3DS()
{
    LChunk mainchunk;
    LChunk edit;
    edit.id = EDIT3DS;
    mainchunk = ReadChunk();
    if (mainchunk.id != MAIN3DS)
    {
        fprintf(stderr, "L3DS::Read3DS - wrong file format");
        return false;
    }
    if (!FindChunk(edit, mainchunk))
        return false;
    LChunk obj;
    LChunk ml;

    GotoChunk(edit);
    obj.id = MAT_ENTRY;
    while (FindChunk(obj, edit))
    {
        ReadMaterial(obj);
        SkipChunk(obj);
    }
    GotoChunk(edit);

    obj.id = EDIT_OBJECT;
    {
        while (FindChunk(obj, edit))
        {
            ReadASCIIZ(m_objName, 99);
            ml = ReadChunk();
            if (ml.id == OBJ_TRIMESH)
                ReadMesh(ml);
            else
            if (ml.id == OBJ_LIGHT)
                ReadLight(ml);
            else
            if (ml.id == OBJ_CAMERA)
                ReadCamera(ml);
            SkipChunk(obj);
        }
    }

    // read the keyframer data here to find out correct object orientation

    LChunk keyframer;
    keyframer.id = KFDATA;

    LChunk objtrack;
    objtrack.id = OBJECT_NODE_TAG;

    GotoChunk(mainchunk);
    if (FindChunk(keyframer, mainchunk))
    {   // keyframer chunk is present
        GotoChunk(keyframer);
        while (FindChunk(objtrack, keyframer))
        {
            ReadKeyframeData(objtrack);
            SkipChunk(objtrack);
        }
    }

    for (uint i=0; i<m_meshes.size(); i++)
        m_meshes[i].Optimize(m_optLevel);
    m_pos = 0;
    strcpy(m_objName, "");
    return true;
}
Ejemplo n.º 28
0
void L3DS::ReadMesh(const LChunk &parent)
{
    unsigned short count, i;
    LVector4 p;
    LMatrix4 m;
    LVector2 t;
    p.w = 1.0f;
    LMesh mesh;
    mesh.SetName(m_objName);
    GotoChunk(parent);
    LChunk chunk = ReadChunk();
    while (chunk.end <= parent.end)
    {
        switch (chunk.id)
        {
        case TRI_VERTEXLIST:
            count = ReadShort();
            mesh.SetVertexArraySize(count);
            for (i=0; i < count; i++)
            {
                p.x = ReadFloat();
                p.y = ReadFloat();
                p.z = ReadFloat();
                mesh.SetVertex(p, i);
            }
            break;
        case TRI_FACEMAPPING:
            count = ReadShort();
            if (mesh.GetVertexCount() == 0)
                mesh.SetVertexArraySize(count);
            for (i=0; i < count; i++)
            {
                t.x = ReadFloat();
                t.y = ReadFloat();
                mesh.SetUV(t, i);
            }
            break;
        case TRI_FACELIST:
            ReadFaceList(chunk, mesh);
            break;
        case TRI_MATRIX:
            m._11 = ReadFloat();
            m._12 = ReadFloat();
            m._13 = ReadFloat();

            m._21 = ReadFloat();
            m._22 = ReadFloat();
            m._23 = ReadFloat();

            m._31 = ReadFloat();
            m._32 = ReadFloat();
            m._33 = ReadFloat();

            m._41 = ReadFloat();
            m._42 = ReadFloat();
            m._43 = ReadFloat();

            m._14 = 0.0f;
            m._24 = 0.0f;
            m._34 = 0.0f;
            m._44 = 1.0f;

            mesh.SetMatrix(m);
            break;
        default:
            break;
        }
        SkipChunk(chunk);
        if (chunk.end >= parent.end)
            break;
        chunk = ReadChunk();
    }
    m_meshes.push_back(mesh);
}
Ejemplo n.º 29
0
void L3DS::ReadMaterial(const LChunk &parent)
{
    // variables
    LChunk chunk;
    LChunk child;
    char str[30];
    LMaterial mat;
    short sh;

    GotoChunk(parent);

    chunk = ReadChunk();
    while (chunk.end <= parent.end)
    {
        switch (chunk.id)
        {
        case MAT_NAME:
            ReadASCIIZ(str, 30);
            mat.SetName(str);
            break;
        case MAT_AMBIENT:
            child = ReadChunk();
            mat.SetAmbientColor(ReadColor(child));
            break;
        case MAT_DIFFUSE:
            child = ReadChunk();
            mat.SetDiffuseColor(ReadColor(child));
            break;
        case MAT_SPECULAR:
            child = ReadChunk();
            mat.SetSpecularColor(ReadColor(child));
            break;
        case MAT_SHININESS:
            child = ReadChunk();
            mat.SetShininess(ReadPercentage(child));
            break;
        case MAT_TRANSPARENCY:
            child = ReadChunk();
            mat.SetTransparency(ReadPercentage(child));
            break;
        case MAT_SHADING:
            sh = ReadShort();
            switch (sh)
            {
            case 0:
                mat.SetShadingType(sWireframe);
                break;
            case 1:
                mat.SetShadingType(sFlat);
                break;
            case 2:
                mat.SetShadingType(sGouraud);
                break;
            case 3:
                mat.SetShadingType(sPhong);
                break;
            case 4:
                mat.SetShadingType(sMetal);
                break;
            }
            break;
        case MAT_WIRE:
            mat.SetShadingType(sWireframe);
            break;
        case MAT_TEXMAP:
            ReadMap(chunk, mat.GetTextureMap1());
            break;
        case MAT_TEX2MAP:
            ReadMap(chunk, mat.GetTextureMap2());
            break;
        case MAT_OPACMAP:
            ReadMap(chunk, mat.GetOpacityMap());
            break;
        case MAT_BUMPMAP:
            ReadMap(chunk, mat.GetBumpMap());
            break;
        case MAT_SPECMAP:
            ReadMap(chunk, mat.GetSpecularMap());
            break;
        case MAT_REFLMAP:
            // AMZ not really a bugfix but it seems to work!
#if 1
            ReadMap(chunk, mat.GetReflectionMap());
#else
            child = ReadChunk();
            mat.GetReflectionMap().strength = ReadPercentage(child);
            SkipChunk(child);
            child = ReadChunk();
            if (child.id != MAT_MAPNAME)
            {
                fprintf(stderr, "L3DS::ReadMaterial - error, expected chunk not found");
                return;
            }
            ReadASCIIZ(str, 30);
            if (strcmp(str, "") == 0)
                strcpy(mat.GetReflectionMap().mapName, "auto");
#endif
            break;
        }

        SkipChunk(chunk);
        chunk = ReadChunk();
    }
    m_materials.push_back(mat);
    m_materials[m_materials.size()-1].SetID(uint(m_materials.size())-1);
}
Ejemplo n.º 30
0
void C3DS::ParseChunk(stChunk* Chunk)
{
	while(Chunk->bytesRead < Chunk->length)
	{
		stChunk tempChunk = {0};
		ReadChunk(&tempChunk);

		// DEBUG CHUNKS
		//char buf[2000];
		//sprintf(buf, "Chunk ID: %.4x\t Size: %d\n", tempChunk.ID, tempChunk.length);
		//debug_op(buf);

		switch( tempChunk.ID)
		{
		// HEADER OUR ENTRY POINT
		case EDIT3DS: //0x3D3D
			ParseChunk(&tempChunk);
			break;

		// MATERIALS
		case MATERIAL: //0xAFFF
			{
			stMaterial newMaterial;
			m_pMaterials.push_back(newMaterial);
			m_iNumMaterials++;
			}
			ParseChunk(&tempChunk);
			break;
		case MAT_NAME: //0xA000 - sz for hte material name "e.g. default 2"
			GetMaterialName(&tempChunk);
			break;
		case MAT_AMBIENT:
			GetAmbientColour(&tempChunk);
			break;
		case MAT_SPECULAR:
			GetSpecularColour(&tempChunk);
			break;
		case MAT_DIFFUSE:  // Diffuse Colour  //0xA020
			GetDiffuseColour(&tempChunk);
			break;
		case MAT_TEXMAP:  //0xA200 - if there's a texture wrapped to it where here
			ParseChunk(&tempChunk);
			break;
		case MAT_TEXFLNM: // 0xA300 -  get filename of the material
			GetTexFileName(&tempChunk);
			break;

		// OBJECT - MESH'S
		case NAMED_OBJECT: //0x4000
			{
			stMesh newMesh;
			m_pMeshs.push_back(newMesh);
			m_iNumMeshs++;
			GetMeshObjectName(&tempChunk);
			}
			break;
		case OBJ_MESH:     //0x4100
			ParseChunk(&tempChunk);
			break;
		case MESH_VERTICES: //0x4110
			ReadMeshVertices(&tempChunk);
			break;
		case MESH_FACES: //0x4120
			ReadMeshFaces(&tempChunk);
			break;
		case MESH_TEX_VERT: //0x4140
			ReadMeshTexCoords(&tempChunk);
			break;
		case MESH_MATER: //0x4130
			ReadMeshMaterials(&tempChunk);
			break;

		// ANIMATION
		case KEYF3DS:	//0xB000
			ParseChunk(&tempChunk);
			break;
		case ANIM_S_E_TIME:   //0xB008
			StartEndFrames(&tempChunk);
			break;
		case ANIM_OBJ:	//0xB002
			{
				stAnimation newAnimation;
				m_pAnimation.push_back(newAnimation);
				m_iNumAnimObjects++;
			}
			ParseChunk(&tempChunk);
			break;
		case ANIM_NAME:
			ReadNameOfObjectToAnimate(&tempChunk);
			break;
		case ANIM_PIVOT: // 0xB013
			ReadPivotPoint(&tempChunk);
			break;
		case ANIM_POS: // 0xB020
			ReadAnimPos(&tempChunk);
			break;
		case ANIM_ROT: //		0xB021
			ReadAnimRot(&tempChunk);
			break;
		case ANIM_SCALE: // 0xB022
			ReadAnimScale(&tempChunk); 
			break;

		default:
			SkipChunk(&tempChunk);
		}
		
		Chunk->bytesRead += tempChunk.length;
	}
}