Example #1
0
IFFRESULT IFFParser::IFFDescendChunk(IFFCHUNK* lpck)
{
	lpck->flags = 0;	// Read

	ULONG	len = IFFReadChunkBytes(lpck, IFFCHUNKSIZE);

	if (len == 0)
		return IFF_EOF;
	else if (len != IFFCHUNKSIZE)
		return IFFERR_READWRITE;

	lpck->ckID = BigEndian32(lpck->ckID);
	lpck->ckSize = BigEndian32(lpck->ckSize);

	lpck->dataOffset = SetFilePos(0, IO::STREAM_SEEK_CUR);
	lpck->grpID = 0;

	if (lpck->ckID == ID_FORM)
	{
		if (IFFReadChunkBytes(&lpck->grpID, sizeof(ID)) != sizeof(ID))
			return IFFERR_READWRITE;
		lpck->grpID = BigEndian32(lpck->grpID);
		return IFF_EOC;
	}

	return IFF_OK;
}
Example #2
0
static Att_List *do_read_sites_iff(struct opusftp_globals *og,char *filename,LONG *diskerr)
{
APTR iff;
BOOL err=FALSE;
Att_List *list;

D(bug("read sites\n"));

if	(!(list=Att_NewList(LISTF_POOL)))
	return(NULL);

	// Open IFF file
if	((iff=IFFOpen(filename,IFF_READ,ID_OPUS)))
	{
	struct site_entry *e;
	ULONG chunk;

	while	(!err && (chunk=IFFNextChunk(iff,0)))
		{
		if	((e=AllocVec(sizeof(struct site_entry),MEMF_CLEAR)))
			{
			int size;
			int chunksize = 0;

			if	(chunk==ID_FTPSITE_SHORT)
				size=SMALL_SIZE;

			else if (chunk==ID_FTPSITE_LONG)
				size=LARGE_SIZE;
			else
				{
				*diskerr=212;
				err=TRUE;
				FreeVec(e);
				break;
				}

			// Adjustment for changed ListFormat size
			chunksize = (int)IFFChunkSize(iff);
			if ((chunksize < size) && (size - chunksize == 84))
			{
				if (!(err=(chunksize!=IFFReadChunkBytes(iff,(char *)e,chunksize))));
				{
					char patterns[82] = {'\0'};
					int i = 0;

					CopyMem(e->se_listformat.show_pattern_p, patterns, 80);
					memset(e->se_listformat.show_pattern_p, 0, 160);
					for (i = 0; i < 40; i++)
					{
						e->se_listformat.show_pattern_p[i] = patterns[i];
						e->se_listformat.hide_pattern_p[i] = patterns[i+40];
					}
				}
			}
			else
				err=(size!=IFFReadChunkBytes(iff,(char *)e,size));

			if	(!err)
				{
#ifdef __AROS__
				e->se_anon = AROS_BE2WORD(e->se_anon);
				e->se_port = AROS_BE2LONG(e->se_port);
				e->se_has_custom_env = AROS_BE2WORD(e->se_has_custom_env);
				if (size == LARGE_SIZE)
				{
					e->se_env_private.e_retry_count = AROS_BE2LONG(e->se_env_private.e_retry_count);
					e->se_env_private.e_retry_delay = AROS_BE2LONG(e->se_env_private.e_retry_delay);
					e->se_env_private.e_list_update = AROS_BE2LONG(e->se_env_private.e_list_update);
					e->se_env_private.e_timeout = AROS_BE2LONG(e->se_env_private.e_timeout);
					e->se_env_private.e_script_time = AROS_BE2LONG(e->se_env_private.e_script_time);
					e->se_env_private.e_indexsize = AROS_BE2LONG(e->se_env_private.e_indexsize);

					e->se_env_private.bitfield1 = AROS_BE2LONG(e->se_env_private.bitfield1);
					e->se_env_private.bitfield2 = AROS_BE2LONG(e->se_env_private.bitfield2);
				}
#endif

				//  adjust ptrs for environment
				// if custom env then set ptr to internal private copy
				// else set it to point to global ftp default
				if	(e->se_has_custom_env)
					e->se_env=&e->se_env_private;
				else
					e->se_env=&og->og_oc.oc_env;


				Att_NewNode(list, e->se_name ,(ULONG)e ,0 );
				}
			else
				FreeVec(e);

			}
		else
			err=TRUE;
		}

	// Close file
	IFFClose(iff);


	if	(!err)
		return(list);
	}


Att_RemList(list,REMLIST_FREEDATA);

if	(!*diskerr)
	*diskerr=IoErr();

return(NULL);
}
Example #3
0
static struct ftp_config *do_read_options_iff(char *filename,int opt_type,LONG *diskerr)
{
APTR iff;
BOOL ok=FALSE;
struct ftp_config *conf;
LONG chunk;

D(bug("read options\n"));

if	((conf=AllocVec(sizeof(struct ftp_config),MEMF_CLEAR)))
	{
	// Open IFF file
	if	((iff=IFFOpen(filename,IFF_READ,ID_OPUS)))
		{
		chunk=IFFNextChunk(iff,0);

		if	(opt_type==WT_OPT  && chunk!=ID_ENV)
			*diskerr=212;
		else
		{
			// Adjustment for changed ListFormat size
			int chunksize = (int)IFFChunkSize(iff);
			int size = sizeof(struct ftp_config);

			if	(chunk==ID_OPTIONS)
			{
				if ((chunksize < size) && (size - chunksize == 84))
				{
					if ((ok = (chunksize==IFFReadChunkBytes(iff,(char *)conf,chunksize))));
					{
						char patterns[82] = {'\0'};
						int i = 0;

						CopyMem(conf->oc_env.e_listformat.show_pattern_p, patterns, 80);
						memset(conf->oc_env.e_listformat.show_pattern_p, 0, 160);
						for (i = 0; i < 40; i++)
						{
							conf->oc_env.e_listformat.show_pattern_p[i] = patterns[i];
							conf->oc_env.e_listformat.hide_pattern_p[i] = patterns[i+40];
						}
					}
				}
				else
					ok = ((sizeof(struct ftp_config))==IFFReadChunkBytes(iff,(char *)conf,sizeof(struct ftp_config)));
			}
			else if (chunk==ID_ENV)
			{
				ok=((sizeof(struct ftp_environment))==IFFReadChunkBytes(iff,(char *)&conf->oc_env,sizeof(struct ftp_environment)));
			}
			else
				*diskerr=212;
		}
		// Close file
		IFFClose(iff);

		if	(ok)
			{
#ifdef __AROS__
			conf->bitfield1 = AROS_LONG2BE(conf->bitfield1);

			conf->oc_env.e_retry_count = AROS_BE2LONG(conf->oc_env.e_retry_count);
			conf->oc_env.e_retry_delay = AROS_BE2LONG(conf->oc_env.e_retry_delay);
			conf->oc_env.e_list_update = AROS_BE2LONG(conf->oc_env.e_list_update);
			conf->oc_env.e_timeout = AROS_BE2LONG(conf->oc_env.e_timeout);
			conf->oc_env.e_script_time = AROS_BE2LONG(conf->oc_env.e_script_time);
			conf->oc_env.e_indexsize = AROS_BE2LONG(conf->oc_env.e_indexsize);

			conf->oc_env.bitfield1 = AROS_BE2LONG(conf->oc_env.bitfield1);
			conf->oc_env.bitfield2 = AROS_BE2LONG(conf->oc_env.bitfield2);
#endif
			return(conf);
			}
		}

	FreeVec(conf);
	}

if	(!*diskerr)
	*diskerr=IoErr();

return(NULL);
}
// Get backdrop pattern
short display_get_pattern(BOOL use_custom)
{
	APTR iff;
	BPTR file;
	struct WBPatternPrefs pattern[NUM_PATTERNS];
	short a;
	char *data[NUM_PATTERNS],*filename;
	short change=0;
	ULONG flags=0;

	// Copy from system fields to custom fields (if custom field is empty, or custom flag is not set)
	for (a=0;a<4;a++)
	{
		if (!GUI->env_BackgroundPic[a][0] || !use_custom)
		{
			strcpy(GUI->env_BackgroundPic[a],environment->env->env_BackgroundPic[a]);
			GUI->env_BackgroundFlags[a]=environment->env->env_BackgroundFlags[a];
			GUI->env_BackgroundBorderColour[a]=environment->env->env_BackgroundBorderColour[a];
		}
	}

	// Pattern disabled?
	if (environment->env->display_options&DISPOPTF_NO_BACKDROP)
	{
		// Check both patterns are invalid
		for (a=0;a<NUM_PATTERNS;a++)
		{
			// Is pattern valid?
			if (GUI->pattern[a].valid)
			{
				// Clear existing pattern
				display_update_pattern(a,0);

				// Free pattern data
				FreeVec(GUI->pattern[a].data);
				GUI->pattern[a].data=0;

				// Free pattern
				FreePattern(&GUI->pattern[a]);
			}
		}

		return 0;
	}

	// Use pattern prefs?
	if (environment->env->display_options&DISPOPTF_USE_WBPATTERN)
	{
		// End pattern notification
		stop_file_notify(GUI->pattern_notify);

		// Get filename
		filename=(IntuitionBase->LibNode.lib_Version<39)?"env:sys/wb.pat":"env:sys/wbpattern.prefs";

		// User-specified file?
		if (environment->env->backdrop_prefs[0])
		{
			BPTR lock;

			// Does file exist?
			if (lock=Lock(environment->env->backdrop_prefs,ACCESS_READ))
			{
				// Yep
				UnLock(lock);
				filename=environment->env->backdrop_prefs;
			}
		}

		// Initialise pattern and data pointers
		for (a=0;a<NUM_PATTERNS;a++)
		{
			pattern[a]=GUI->pattern[a].prefs;
			data[a]=0;
		}

		// Try to open wbpattern prefs file
		if (IntuitionBase->LibNode.lib_Version>=39 &&
			(iff=IFFOpen(filename,IFF_READ,ID_PREF)))
		{
			ULONG id;

			// Scan for chunks we know and love
			while (id=IFFNextChunk(iff,0))
			{
				// FastIPrefs FIP0 chunk?
				if (id==ID_FIP0)
				{
					// Get flags
					IFFReadChunkBytes(iff,&flags,sizeof(flags));
				}

				// PTRN chunk?
				else
				if (id==ID_PTRN)
				{
					struct WBPatternPrefs *prefs;

					// Allocate space for chunk
					if (prefs=AllocVec(IFFChunkSize(iff),MEMF_CLEAR))
					{
						// Read chunk
						IFFReadChunkBytes(iff,prefs,-1);

						// Pattern we can handle?
						if (prefs->wbp_Which==WBP_ROOT ||
							prefs->wbp_Which==WBP_DRAWER)
						{
							// Copy data
							CopyMem(
								(char *)prefs,
								(char *)&pattern[prefs->wbp_Which],
								sizeof(struct WBPatternPrefs));

							// Allocate pattern data
							if (prefs->wbp_DataLength>0 &&
								(data[prefs->wbp_Which]=AllocVec(prefs->wbp_DataLength+1,MEMF_CLEAR)))
							{
								// Copy pattern data
								CopyMem((char *)(prefs+1),data[prefs->wbp_Which],prefs->wbp_DataLength);
							}
						}

						// Free chunk
						FreeVec(prefs);
					}
				}
			}

			// Close iff file
			IFFClose(iff);
		}

		// Couldn't find it, try for wb.pat
		else
		if (IntuitionBase->LibNode.lib_Version<39 &&
			(file=Open(filename,MODE_OLDFILE)))
		{
			// Allocate pattern data
			if (data[PATTERN_MAIN]=AllocVec(96,MEMF_CLEAR))
			{
				// Skip forwards
				Seek(file,20,OFFSET_CURRENT);

				// Read pattern
				if ((Read(file,data[PATTERN_MAIN],96))<96)
				{
					FreeVec(data[PATTERN_MAIN]);
					data[PATTERN_MAIN]=0;
				}

				// Fill out WBPatternPrefs
				else
				{
					pattern[PATTERN_MAIN].wbp_Flags=WBPF_PATTERN;
					pattern[PATTERN_MAIN].wbp_Depth=GUI->screen_pointer->BitMap.Depth;
					if (pattern[PATTERN_MAIN].wbp_Depth>MAXDEPTH)
						pattern[PATTERN_MAIN].wbp_Depth=MAXDEPTH;
				}
			}

			// Close file
			Close(file);
		}

		// Start notification of wbpattern prefs
		GUI->pattern_notify=start_file_notify(filename,NOTIFY_PATTERN_CHANGED,GUI->appmsg_port);
	}

	// Otherwise, under 39 user-defined pictures
	else
	if (GfxBase->LibNode.lib_Version>=39)
	{
		short pat;

		// Do both patterns
		for (pat=0;pat<NUM_PATTERNS;pat++)
		{
			// Got valid picture?
			if (GUI->env_BackgroundPic[pat][0])
			{
				// Fill out WBPatternPrefs
				pattern[pat].wbp_Flags=0;
				pattern[pat].wbp_Which=pat;
				pattern[pat].wbp_DataLength=strlen(GUI->env_BackgroundPic[pat]);
				if (data[pat]=AllocVec(pattern[pat].wbp_DataLength+1,0))
					strcpy(data[pat],GUI->env_BackgroundPic[pat]);
			}

			// Set to no pattern
			else
			{
				// Fill out WBPatternPrefs
				pattern[pat].wbp_Flags=WBPF_PATTERN;
				pattern[pat].wbp_DataLength=0;
				data[pat]=0;
			}
		}
	}

	// Otherwise, default to no pattern
	else
	{
		short pat;

		// Do both patterns
		for (pat=0;pat<NUM_PATTERNS;pat++)
		{
			// Fill out WBPatternPrefs
			pattern[pat].wbp_Flags=WBPF_PATTERN;
			pattern[pat].wbp_DataLength=0;
			data[pat]=0;
		}
	}

	// Go through both patterns
	for (a=0;a<NUM_PATTERNS;a++)
	{
		BOOL diff=0;
		short precision=0;

		// Using Opus settings?
		if (!(environment->env->display_options&DISPOPTF_USE_WBPATTERN))
		{
			// Get precision
			if (GUI->env_BackgroundFlags[a]&ENVBF_PRECISION_NONE)
				precision=-1;
			else
			if (GUI->env_BackgroundFlags[a]&ENVBF_PRECISION_GUI)
				precision=2;
			else
			if (GUI->env_BackgroundFlags[a]&ENVBF_PRECISION_ICON)
				precision=1;
			else
			if (GUI->env_BackgroundFlags[a]&ENVBF_PRECISION_EXACT)
				precision=3;
		}

		// Maybe set in prefs
		else
		{
			// Get precision
			precision=(a==0)?PATF_WB_MODE(flags):PATF_LISTER_MODE(flags);
		}

		// Valid data?
		if (data[a])
		{
			// No last pattern?
			if (!GUI->pattern[a].data)
			{
				diff=1;
			}

			// Changed from pattern to picture or vice versa?
			else
			if ((pattern[a].wbp_Flags&WBPF_PATTERN && !(GUI->pattern[a].prefs.wbp_Flags&WBPF_PATTERN)) ||
				(!(pattern[a].wbp_Flags&WBPF_PATTERN) && GUI->pattern[a].prefs.wbp_Flags&WBPF_PATTERN))
			{
				diff=1;
			}

			// Pattern pattern?
			else
			if (pattern[a].wbp_Flags&WBPF_PATTERN)
			{
				// Different depth?
				if (pattern[a].wbp_Depth!=GUI->pattern[a].prefs.wbp_Depth) diff=1;

				// Has data changed from the last one?
				else
				{
					short num,d;

					// Get amount of data
					num=PAT_HEIGHT*pattern[a].wbp_Depth;

					// Compare data
					for (d=0;d<num;d++)
					{
						if (((USHORT *)data[a])[d]!=((USHORT *)GUI->pattern[a].data)[d])
						{
							diff=1;
							break;
						}
					}
				}
			}

			// Picture?
			else
			{
				// Different name for picture, or it's random?
				if (strcmp(data[a],GUI->pattern[a].data)!=0 || GUI->pattern[a].random)
				{
					diff=1;
				}

				// Precision changed?
				else
				if (precision!=GUI->pattern[a].precision)
				{
					diff=1;
				}

				// Stretching changed?
				else
				if (a==0 &&
					((GUI->env_BackgroundFlags[a]&ENVBF_STRETCH_PIC && !(GUI->pattern[a].flags&PATF_STRETCH)) ||
					!(GUI->env_BackgroundFlags[a]&ENVBF_STRETCH_PIC) && (GUI->pattern[a].flags&PATF_STRETCH)))
				{
					diff=1;
				}

				// Centering changed?
				else
				if ((GUI->env_BackgroundFlags[a]&ENVBF_CENTER_PIC && !(GUI->pattern[a].flags&PATF_CENTER)) ||
					!(GUI->env_BackgroundFlags[a]&ENVBF_CENTER_PIC) && (GUI->pattern[a].flags&PATF_CENTER))
				{
					diff=2;
				}
			}
		}

		// Had last data?
		else
		if (GUI->pattern[a].data) diff=1;

		if (diff!=1)
		{
			// Border pen changed?
			if ((GUI->env_BackgroundFlags[a]&ENVBF_USE_COLOUR && GUI->pattern[a].border_pen==0) ||
				(!(GUI->env_BackgroundFlags[a]&ENVBF_USE_COLOUR) && GUI->pattern[a].border_pen!=0))
			{
				diff=3;
			}
			else
			if (GUI->pattern[a].border_pen!=0 && GUI->env_BackgroundFlags[a]&ENVBF_USE_COLOUR)
			{
				ULONG col[3];
				GetPalette32(
					&GUI->screen_pointer->ViewPort,
					col,
					1,
					(GUI->pattern[a].border_pen==-1)?0:GUI->pattern[a].border_pen);
				if (ENVBF_COL_R_GET(col[0])!=ENVBF_COL_R_GET(GUI->env_BackgroundBorderColour[a]) ||
					ENVBF_COL_R_GET(col[1])!=ENVBF_COL_G_GET(GUI->env_BackgroundBorderColour[a]) ||
					ENVBF_COL_R_GET(col[2])!=ENVBF_COL_B_GET(GUI->env_BackgroundBorderColour[a]))
				{
					diff=3;
				}
			}
		}

		// Has it changed?
		if (diff)
		{
			// Existing pattern valid?
			if (GUI->pattern[a].valid)
			{
				// Clear existing patterns
				display_update_pattern(a,0);
			}

			// Change more than centering?
			if (diff==1)
			{
				// Free existing pattern
				FreePattern(&GUI->pattern[a]);
				FreeVec(GUI->pattern[a].data);

				// Copy pattern and data pointer	
				GUI->pattern[a].prefs=pattern[a];
				GUI->pattern[a].data=data[a];

				// Stretch?
				if (a==0 && GUI->env_BackgroundFlags[a]&ENVBF_STRETCH_PIC)
				{
					flags|=PATF_STRETCH;
					flags&=~PATF_CENTER;
				}
				else
				{
					flags&=~PATF_STRETCH;
					if (!(environment->env->display_options&DISPOPTF_USE_WBPATTERN) &&
						GUI->env_BackgroundFlags[a]&ENVBF_CENTER_PIC)
						flags|=PATF_CENTER;
					else
						flags&=~PATF_CENTER;
				}

				// Set flags and precision
				GUI->pattern[a].flags=flags;
				GUI->pattern[a].precision=precision;

				// Initialise pattern
				GetPattern(
					&GUI->pattern[a],
					GUI->screen_pointer,
					GUI->env_BackgroundBorderColour[a]|(GUI->env_BackgroundFlags[a]&ENVBF_USE_COLOUR));
			}

			// Change colour
			else
			if (diff==3)
			{
				// Initialise pattern colour
				GetPatternBorder(
					&GUI->pattern[a],
					GUI->screen_pointer,
					GUI->env_BackgroundBorderColour[a]|(GUI->env_BackgroundFlags[a]&ENVBF_USE_COLOUR));
			}

			// Centering changed
			else
			{
				// Environment flags set for centering?
				if (!(environment->env->display_options&DISPOPTF_USE_WBPATTERN) &&
					GUI->env_BackgroundFlags[a]&ENVBF_CENTER_PIC)
					GUI->pattern[a].flags|=PATF_CENTER;
				else
					GUI->pattern[a].flags&=~PATF_CENTER;
			}

			// Install new pattern
			display_update_pattern(a,1);
		}

		// If not, free data
		else FreeVec(data[a]);
	}

	return change;
}
Example #5
0
HRESULT CLWOLoader::LoadLWOB(IStream* pStream, ILMFNode* children)
{
	IFFRESULT	iffresult;

#if 0
	char filename[256];
	_splitpath(pStream->GetFileName(), NULL, NULL, filename, NULL);
#endif

	IFFCHUNK	ck;
/*
	CModel* pModel = new CModel;
	pModel->type = OBJT_POLYGON;

	MMLayerRef layerRef = NULL;

		filterrec->layer->AddLayerTags(parentRef, NULL, 'SLER', 'OB3D', NULL,
		(LAYER_Name),		filename,
		(LAYER_UserData),	pModel,
		(TAG_DONE));
	if (!layerRef) return NULL;
*/
	/*
	CI3DLayer* pModel = (CI3DLayer*)sBasic->CreateCmdTarget("3DLAYER");
	ASSERT(pModel);
	if (!pModel) return NULL;
	pModel->SetType(OBJT_POLYGON);
	pModel->SetName(filename);
	pModel->AddLayerParams();

	parentRef->InsertObject(pModel, NULL);
	*/

	float (*m_points)[3] = NULL;

	while ((iffresult = IFFDescendChunk(pStream, &ck)) == IFF_OK)
	{
		switch (ck.ckID)
		{
		case ID_PNTS:
			{
				ATLTRACE("PNTS\n");
				
				int numpoints = ck.ckSize / 12;	// 4*3 = 12

				m_points = new float[numpoints][3];

#if 0
				pModel->SetVertexDataSize(numpoints);
				evec3* data = pModel->GetVertexData();
#endif

				for (int i = 0; i < numpoints; i++)
				{
					DWORD	v[3];
					IFFReadChunkBytes(pStream, v, 12);
					
					float vf[3];
					*((DWORD*)&vf[0]) = ENDIANLONG(v[0]);
					*((DWORD*)&vf[1]) = ENDIANLONG(v[1]);
					*((DWORD*)&vf[2]) = ENDIANLONG(v[2]);
				
					m_points[i][0] = vf[0];
					m_points[i][1] = vf[1];
					m_points[i][2] = vf[2];
					
				//	data[i].v[0] = vf[0];
				//	data[i].v[1] = vf[1];
				//	data[i].v[2] = vf[2];
				}
			}
			break;
			
		case ID_POLS:
			{
				ATLTRACE("POLS\n");
				
				long size = ck.ckSize;
				
				// Read all polygons
				while (size > 0)
				{
					CComPtr<ILX3DNode> node;
					m_scene->createNode(L"IndexedFaceSet", &node);

					CComPtr<ILCoordinate> coordinateNode;
					m_scene->createNode(L"Coordinate", (ILX3DNode**)&coordinateNode);
					CComPtr<ILMFVec3f> pointField;
					coordinateNode->getField(L"point", (ILX3DField**)&pointField);

					CComPtr<ILSFNode> coordField;
					node->getField(L"coord", (ILX3DField**)&coordField);
					coordField->setValue(coordinateNode);

					CComPtr<ILMFInt32> coordIndexField;
					node->getField(L"coordIndex", (ILX3DField**)&coordIndexField);

					WORD numvertices;
					IFFReadChunkBytes(pStream, &numvertices, 2);
					numvertices = ENDIANWORD(numvertices);
					size -= 2;
					
					//int* polydata = pModel->AddPoly(numvertices);

					// Read all vertices of polygon
					for (int j = 0; j < numvertices; j++)
					{
						UWORD vertex;
						IFFReadChunkBytes(pStream, &vertex, 2);
						vertex =  ENDIANWORD(vertex);
						size -= 2;
						//polydata[j] = vertex;

						pointField->append1Value(m_points[vertex]);
						coordIndexField->append1Value(j);
					}
					
					// Surface properties of polygon
					SHORT surface;
					IFFReadChunkBytes(pStream, &surface, 2);
					surface = ENDIANWORD(surface);
					size -= 2;

					if (surface < 0)	// This polygon has detail polygons
					{
						MessageBox(NULL, "Detail polygons unsupported", "", MB_OK);
						iffresult = -1;
						break;
					}

					children->append1Value(node);
				}
			}
			break;
			
		case ID_SURF:
			{
				LPBYTE ckdata = (LPBYTE)GlobalAlloc(0, ck.ckSize);
				IFFReadChunkBytes(pStream, ckdata, ck.ckSize);

				//ParseSURF(pStream, ckdata, ck.ckSize);

				GlobalFree(ckdata);
			}
			break;

		default:
			ATLTRACE("%4.4s\n", &ck.ckID);
		}
		
		if (iffresult < 0) break;
		
		iffresult = IFFAscendChunk(pStream, &ck);
	}

	//pModel->BuildEdges();

	return S_OK;//pModel;
}
Example #6
0
ILX3DNode* CTDDDLoader::ParseDESC(IStream* pStream, ILMFNode* parentChildren)
{
/*
	ProjectSuite*	sPrj;
	filterrec->basic->AcquireSuite(MMSX_Project_SuiteName, MMSX_Project_SuiteVersion, (void**)&sPrj);
	ASSERT(sPrj);
*/
	IFFRESULT	iffresult;

	IFFCHUNK	ck;
/*
	CModel* pModel = new CModel;
	pModel->type = OBJT_POLYGON;

	MMLayerRef layerRef = NULL;

		filterrec->layer->AddLayerTags(parentLayer, NULL, 'SLER', 'OB3D', NULL,
		(LAYER_UserData),	pModel,
		(TAG_DONE));
	if (!layerRef) return NULL;
*/
#if 0
	CI3DLayer* pModel = (CI3DLayer*)sBasic->CreateCmdTarget("3DLAYER");
	ASSERT(pModel);
	if (!pModel) return NULL;
	pModel->SetType(OBJT_POLYGON);
	pModel->AddLayerParams();

	parentLayer->InsertObject(pModel, NULL);
#endif

	CComPtr<ILShape> shapeNode;
	m_scene->createNode(L"Shape", (ILX3DNode**)&shapeNode);

	CComPtr<ILAppearance> appearanceNode;
	m_scene->createNode(L"Appearance", (ILX3DNode**)&appearanceNode);
	shapeNode->setAppearance(appearanceNode);

	CComPtr<ILMaterial> materialNode;
	m_scene->createNode(L"Material", (ILX3DNode**)&materialNode);

	CComPtr<ILSFNode> materialField;
	appearanceNode->getField(L"material", (ILX3DField**)&materialField);
	materialField->setValue(materialNode);

	CComPtr<ILX3DGeometryNode> geometryNode;	// Not yet known what type of geometry

	edge* edges = NULL;

	float fposi[3] = {0, 0, 0};

	do
	{
		IFFDescendChunk(pStream, &ck);

		switch (ck.ckID)
		{
		case ID_NAME:
			{
				ATLASSERT(ck.ckSize == 18);

				char name[19] = {0};
				IFFReadChunkBytes(pStream, name, 18);
#if 0
				pModel->SetName(name);
#endif
			}
			break;

		case ID_SHAP:
			{
				ATLASSERT(ck.ckSize == 4);

				WORD shape, lamp;
				IFFReadChunkBytes(pStream, &shape, 2);
				IFFReadChunkBytes(pStream, &lamp, 2);
				shape = ENDIANWORD(shape);
				lamp = ENDIANWORD(lamp);

				if (shape == 0)
				{
					MessageBox(NULL, "Sphere", "", MB_OK);
				}
				else if (shape == 2)
				{
					MessageBox(NULL, "Axis", "", MB_OK);
				}
				else if (shape == 5)
				{
					MessageBox(NULL, "Ground", "", MB_OK);
				}
				else
				{
					ATLASSERT(0);
					iffresult = -1;
				}
			}
			break;

		case ID_POSI:
			{
				ATLASSERT(ck.ckSize == sizeof(VECTOR));

				VECTOR posi;

				IFFReadChunkBytes(pStream, &posi, sizeof(VECTOR));
				posi.X = ENDIANLONG(posi.X);
				posi.Y = ENDIANLONG(posi.Y);
				posi.Z = ENDIANLONG(posi.Z);

				fposi[0] = posi.X/65536.0;
				fposi[1] = posi.Y/65536.0;
				fposi[2] = posi.Z/65536.0;

				MessageBeep(-1);	// TODO
#if 0
				pModel->FindParam('posi', 0)->SetParamTags(
					(PARAM_VECTOR_Value), fposi,
					(TAG_DONE));
#endif
			}
			break;

	/*
		case ID_AXIS:
			{
			}
			break;
	*/

		case ID_PNTS:
		case ID_PNT2:
			{
				ATLASSERT(geometryNode == NULL);
				m_scene->createNode(L"IndexedFaceSet", (ILX3DNode**)&geometryNode);

				DWORD pcount = 0;

				if (ck.ckID == ID_PNTS)
				{
					UWORD	pcountw;
					IFFReadChunkBytes(pStream, &pcountw, sizeof(UWORD));
					pcount = ENDIANWORD(pcountw);

					ATLASSERT(ck.ckSize == (2 + pcount*sizeof(VECTOR)));
				}
				else
				{
					DWORD	pcountl;
					IFFReadChunkBytes(pStream, &pcountl, sizeof(DWORD));
					pcount = ENDIANLONG(pcountl);

					ATLASSERT(ck.ckSize == (4 + pcount*sizeof(VECTOR)));
				}

#if 0
				pModel->SetVertexDataSize(pcount);
				evec3* data = pModel->GetVertexData();
#endif
				CComPtr<ILCoordinate> coordinateNode;
				m_scene->createNode(L"Coordinate", (ILX3DNode**)&coordinateNode);
				CComPtr<ILMFVec3f> pointField;
				coordinateNode->getField(L"point", (ILX3DField**)&pointField);

				CComPtr<ILSFNode> coordField;
				geometryNode->getField(L"coord", (ILX3DField**)&coordField);
				coordField->setValue(coordinateNode);

				VECTOR* buf = (VECTOR*)malloc(sizeof(VECTOR)*pcount);
				if (buf)
				{
					IFFReadChunkBytes(pStream, buf, sizeof(VECTOR)*pcount);

					for (int i = 0; i < pcount; i++)
					{
						VECTOR* pnt = &buf[i];
						pnt->X = ENDIANLONG(pnt->X);
						pnt->Y = ENDIANLONG(pnt->Y);
						pnt->Z = ENDIANLONG(pnt->Z);

						float v[3];
						v[0] = pnt->X / 65536.0;
						v[1] = pnt->Y / 65536.0;
						v[2] = pnt->Z / 65536.0;

						pointField->append1Value(v);
#if 0
						data[i].v[0] = x;
						data[i].v[1] = y;
						data[i].v[2] = z;
#endif
					}

					free(buf);
				}
			}
			break;

		case ID_EDGE:
			{
				UWORD	ecount;
				IFFReadChunkBytes(pStream, &ecount, sizeof(UWORD));
				ecount = ENDIANWORD(ecount);

				ATLASSERT(ck.ckSize == (2 + ecount*4));

				edges = new edge[ecount];
				edge* data = edges;//pModel->GetEdgeData();

				for (int i = 0; i < ecount; i++)
				{
					UWORD edg[2];
					IFFReadChunkBytes(pStream, edg, 4);
					edg[0] = ENDIANWORD(edg[0]);
					edg[1] = ENDIANWORD(edg[1]);

					data[i].v[0] = edg[0];
					data[i].v[1] = edg[1];
				}
			}
			break;

		case ID_EDG2:
			{
				ULONG	ecount;
				IFFReadChunkBytes(pStream, &ecount, sizeof(ULONG));
				ecount = ENDIANLONG(ecount);

				ATLASSERT(ck.ckSize == (4 + ecount*8));

//				pModel->SetEdgeDataSize(ecount);
//				edge* data = pModel->GetEdgeData();
				edges = new edge[ecount];
				edge* data = edges;//pModel->GetEdgeData();

				for (int i = 0; i < ecount; i++)
				{
					ULONG edge[2];
					IFFReadChunkBytes(pStream, edge, 8);
					edge[0] = ENDIANLONG(edge[0]);
					edge[1] = ENDIANLONG(edge[1]);

					data[i].v[0] = edge[0];
					data[i].v[1] = edge[1];
				}
			}
			break;

		case ID_FACE:
			{
				UWORD	fcount;
				IFFReadChunkBytes(pStream, &fcount, sizeof(UWORD));
				fcount = ENDIANWORD(fcount);

				//edge* edges = pModel->GetEdgeData();

				CComPtr<ILMFInt32> coordIndex;
				geometryNode->getField(L"coordIndex", (ILX3DField**)&coordIndex);

				ATLASSERT(ck.ckSize == (2 + fcount*6));

				for (int i = 0; i < fcount; i++)
				{
					int polyindex[3];// = pModel->AddPoly(3);

					UWORD face[3];
					IFFReadChunkBytes(pStream, face, 6);
					face[0] = ENDIANWORD(face[0]);
					face[1] = ENDIANWORD(face[1]);
					face[2] = ENDIANWORD(face[2]);

					int e0=face[0], e1=face[1], e2=face[2];

// Now you retrieve 3 pairs of points for the three edges

					int p0 = edges[e0].v[0] ; int p1 = edges[e0].v[1];
					int p2 = edges[e1].v[0] ; int p3 = edges[e1].v[1];
					int p4 = edges[e2].v[0] ; int p5 = edges[e2].v[1];

					if (p0 == p2 || p0 == p3)			polyindex[0] = p0;
					else if (p1 == p2 || p1 == p3)	polyindex[0] = p1;
					else ATLASSERT(0);

					if (p2 == p4 || p2 == p5)			polyindex[1] = p2;
					else if (p3 == p4 || p3 == p5)	polyindex[1] = p3;
					else ATLASSERT(0);

					if (p4 == p0 || p4 == p1)			polyindex[2] = p4;
					else if (p5 == p0 || p5 == p1)	polyindex[2] = p5;
					else ATLASSERT(0);

					coordIndex->append1Value(polyindex[0]);
					coordIndex->append1Value(polyindex[1]);
					coordIndex->append1Value(polyindex[2]);
					coordIndex->append1Value(-1);
				}
			}
			break;

		case ID_COLR:
			{
				BYTE pad;
				IFFReadChunkBytes(pStream, &pad, 1);

				COLOR color;
				IFFReadChunkBytes(pStream, &color, sizeof(color));

				CComPtr<ILSFColor> colorField;
				materialNode->getField(L"diffuseColor", (ILX3DField**)&colorField);

				float colorf[3] = {color[0]/255.0, color[1]/255.0, color[2]/255.0};
				colorField->setValue(colorf);
			}
			break;

		case ID_REFL:
			{
				BYTE pad;
				IFFReadChunkBytes(pStream, &pad, 1);

				COLOR color;
				IFFReadChunkBytes(pStream, &color, sizeof(color));

				//MessageBeep(-1);
			}
			break;

		case ID_TRAN:
			{
				BYTE pad;
				IFFReadChunkBytes(pStream, &pad, 1);

				COLOR color;
				IFFReadChunkBytes(pStream, &color, sizeof(color));

			}
			break;

		case ID_SPC1:
			{
				BYTE pad;
				IFFReadChunkBytes(pStream, &pad, 1);

				COLOR color;
				IFFReadChunkBytes(pStream, &color, sizeof(color));

			}
			break;

		case ID_BRS5:
			{
#if 0
				BRS5 brs5;
				char filename[258] = {0};

				IFFReadChunkBytes(pStream, &brs5, sizeof(BRS5));
				brs5.Type = ENDIANWORD(brs5.Type);
				brs5.WFlags = ENDIANWORD(brs5.WFlags);

				IFFReadChunkBytes(r, filename, brs5.FileLength);

			// Import the texture as footage into project
				if (sPrj)
				{
					MMPrjRef	prjRef = filterrec->layer->GetProject(filterrec->layerRef);
					ASSERT(prjRef);

					MMPrjItemRef itemRef = sPrj->ImportFootage(prjRef, NULL, filename, 0, NULL);

					if (itemRef)
					{
						;	// Do something with it
					}
				}
#endif
			}
			break;

/*		case ID_BRS3:
			{
			}
			break;
*/

		case ID_DESC:	// Child description
			{
#if 0	// ??
				CComPtr<ILX3DField> field;
				node->getField(L"children", &field);

				CComQIPtr<ILMFNode> children = field;
#endif

				ParseDESC(pStream, parentChildren);
			}
			break;

		default:
			IFFAscendChunk(pStream, &ck);
			ATLTRACE("%4.4s\n", &ck.ckID);
		}
	}
	while (ck.ckID != ID_TOBJ);

#if 0	// TODO have this
	pModel->Move(-fposi[0], -fposi[1], -fposi[2]);
#endif

/*
	if (sPrj)
	{
		filterrec->basic->ReleaseSuite(MMSX_Project_SuiteName, MMSX_Project_SuiteVersion);
	}
*/
	shapeNode->setGeometry(geometryNode);

	parentChildren->append1Value(shapeNode);

	delete edges;

	return shapeNode;
}