Exemplo n.º 1
0
/*************
 * DESCRIPTION:   read a LWOB-file
 * INPUT:         rc          context
 *                filename    name of LWOB-file
 *                link        link structure
 *                pos         object position
 *                ox, oy, oz  object orientation
 *                actor       pointer to actor
 *                replacesurf pointer to surface to replace object surface
 *                            with
 *                version     version number
 * OUTPUT:        NULL if ok else errorstring
 *************/
extern "C" char* SAVEDS objRead(rsiCONTEXT *rc, char *filename, OBJLINK *link, VECTOR *pos, VECTOR *ox, VECTOR *oy,
	VECTOR *oz, VECTOR *scale, ACTOR *actor, SURFACE *replacesurf, ULONG *version, void (*SetProgress)(rsiCONTEXT*, float))
{
	long error = 0;
	struct ContextNode *cn;
	char *err;
	HANDLER_DATA data;

	data.link = link;
	data.iff = NULL;
	data.points = NULL;
	data.rc = rc;
	data.surfaces = NULL;
	data.pos = *pos;
	data.ox = *ox;
	data.oy = *oy;
	data.oz = *oz;
	data.size = *scale;
	data.replacesurf = replacesurf;
	data.SetProgress = SetProgress;
	data.size_done = 0;

	err = OpenIFF(&data.iff, filename, &data.filesize);
	if(err)
	{
		readLWOB_cleanup(&data);
		return err;
	}

	while (!error || error == IFFERR_EOC)
	{
		error = ParseIFF(data.iff, IFFPARSE_RAWSTEP);
		if (error != IFFERR_EOC)
		{
			// Get a pointer to the context node describing the current context
			cn = CurrentChunk(data.iff);
			if (cn)
			{
				switch (cn->cn_ID)
				{
					case ID_SRFS:
						err = ReadSurfaces(&data, cn);
						if(err)
						{
							readLWOB_cleanup(&data);
							return err;
						}
						break;
					case ID_SURF:
						if(!data.replacesurf)
						{
							err = ReadSurface(&data, cn);
							if(err)
							{
								readLWOB_cleanup(&data);
								return err;
							}
						}
						break;
					case ID_PNTS:
						err = ReadPoints(&data, cn);
						if(err)
						{
							readLWOB_cleanup(&data);
							return err;
						}
						break;
					case ID_POLS:
						err = ReadPolygons(&data, cn, actor);
						if(err)
						{
							readLWOB_cleanup(&data);
							return err;
						}
						break;
				}
				if(SetProgress)
				{
					data.size_done += cn->cn_Size;
					(*SetProgress)(rc, (float)data.size_done/(float)data.filesize);
				}
			}
		}
	}
	readLWOB_cleanup(&data);
	if (error != IFFERR_EOF)
	{
		return errors[ERR_LWOBFILE];
	}
	return NULL;
}
Exemplo n.º 2
0
/*************
 * DESCRIPTION:   parse a sphere from a RSCN file
 * INPUT:         iff      iff handler
 *                where    where to insert after
 *                dir      insert direction
 * OUTPUT:        created object
 *************/
OBJECT *ParseSphere(struct IFFHandle *iff, OBJECT *where, int dir)
{
	SPHERE *sphere;
	struct ContextNode *cn;
	long error = 0;

	sphere = new SPHERE;
	if(!sphere)
		return NULL;

	if(!sphere->ReadAxis(iff))
	{
		delete sphere;
		return NULL;
	}
	sphere->surf = GetSurfaceByName(SURF_DEFAULTNAME);

	while(!error)
	{
		error = ParseIFF(iff, IFFPARSE_RAWSTEP);
		if(error < 0 && error != IFFERR_EOC)
		{
			delete sphere;
			return NULL;
		}

		// Get a pointer to the context node describing the current context
		cn = CurrentChunk(iff);
		if(!cn)
			continue;

		if((cn->cn_ID == ID_FORM) && (cn->cn_Type == ID_SPHR))
			break;

		if(error == IFFERR_EOC)
		{
			error = 0;
			continue;
		}
		switch (cn->cn_ID)
		{
			case ID_FORM:
				switch(cn->cn_Type)
				{
					case ID_SURF:
						if(!ReadSurface(iff, &sphere->surf, (OBJECT*)sphere))
						{
							delete sphere;
							return NULL;
						}
						break;
				}
				break;
			case ID_NAME:
				if(!sphere->ReadName(iff))
				{
					delete sphere;
					return NULL;
				}
				break;
			case ID_TRCK:
				if(!sphere->ReadTrack(iff))
				{
					delete sphere;
					return NULL;
				}
				break;
			case ID_FLGS:
				if(!sphere->ReadFlags(iff))
				{
					delete sphere;
					return NULL;
				}
				break;
		}
	}

	SetVector(&sphere->bboxmin, -sphere->size.x, -sphere->size.y, -sphere->size.z);
	sphere->bboxmax = sphere->size;
	sphere->Insert(where, dir);

	return (OBJECT*)sphere;
}
Exemplo n.º 3
0
void clGeometryReader::ReadGeometry(fstream &file, clGeometry &geometry) const
{
  int numberSurfaces = 0;
  int EndOfBlock     = 0;

  // Read line
  char line[LINE_SIZE];
  file.getline(line, LINE_SIZE);

  while(!file.eof() && file.good() && !EndOfBlock)
  {
    // Check first character in trimmed line
    switch(*strtrim(line))
    {
      case '#':
      case '*':
        // Comment line
        file.getline(line, LINE_SIZE);
        break;
      case '$':
      case '&':
      {
        // Block specifier
        int blockCommand = GetBlockSpec(line);

        switch(blockCommand)
        {
          case UNKNOWN_SPEC:
            throw clExceptionTree("clGeometryReader", "ReadGeometry", "Unknown block specifier.");
            break;
          case POINT_SPEC:
            // Start of point block
            throw clExceptionTree("clGeometryReader", "ReadGeometry", "Unexpected start of block POINT.");
            break;
          case PATCH_SPEC:
            // Start of patch block
            throw clExceptionTree("clGeometryReader", "ReadGeometry", "Unexpected start of block PATCH.");
            break;
          case SURFACE_SPEC:
          {
            // Start of surface block
            clSurface *surface = new clSurface(numberSurfaces++);

            ReadSurface(file, *surface);
            geometry.AddSurface(surface);

            file.getline(line, LINE_SIZE);
            break;
          }
          case GEOMETRY_SPEC:
            // Start of geometry block
            throw clExceptionTree("clGeometryReader", "ReadGeometry", "Unexpected start of block GEOMETRY.");
            break;
          case END_SPEC:
            // End of geometry block specification
            EndOfBlock = 1;
            break;
          default:
            throw clExceptionTree("clGeometryReader", "ReadGeometry", "Function GetBlockSpec returned unknown value.");
            break;
        }

        break;
      }
      case '/':
        // End of geometry block specification
        EndOfBlock = 1;
        break;
      default:
        file.getline(line, LINE_SIZE);
        break;
    }
  }
}