Ejemplo n.º 1
0
static void SaveColorFile(HWND hWnd,TSTR &name)
   {
    MaxSDK::Util::TextFile::Writer file;	

   	Interface14 *iface = GetCOREInterface14();
	UINT codepage  = iface-> DefaultTextSaveCodePage(true); //dll\PaintLayerMod\ColorPaletteTool.cpp :: SaveColorFile, UTF8 allowed, keep to same.

   if(!file.Open(fname, false, MaxSDK::Util::TextFile::Writer::WRITE_BOM | codepage )){
      TSTR buf2 = GetString(IDS_RB_COLORCLIPBOARD);
      TSTR buf1;
      buf1.printf(GetString(IDS_RB_CANTOPENFILE),fname);       
      MessageBox(hWnd,buf1,buf2,MB_ICONEXCLAMATION);
      return;
      }

   for (int i=0; i<12; i++) {
      int r, g, b;
      IColorSwatch *cs = GetIColorSwatch(GetDlgItem(hWnd,csIDs[i]));
      COLORREF col = cs->GetColor();
      ReleaseIColorSwatch(cs);
      r = GetRValue(col); g = GetGValue(col); b = GetBValue(col);
      file.Printf(_T("%d %d %d\n"), r, g, b);
      }  

   for (int i=0; i<12; i++) {
      IColorSwatch *cs = GetIColorSwatch(GetDlgItem(hWnd,csIDs[i]));
      AColor col = cs->GetAColor();
      ReleaseIColorSwatch(cs);
      file.Printf(_T("%f %f %f %f\n"), col.r, col.g, col.b, col.a);
   }  

   SetupTitle(hWnd,name);
   file.Close();
   }
Ejemplo n.º 2
0
void AppDataTest_UpdateAppDataLoadProc(Animatable *anim, const Class_ID& cid, SClass_ID sid, ILoad* iload, Tab<DWORD> &subIDs)
{
	DbgAssert( anim && iload );
	if ( anim == NULL || iload == NULL )
		return;

	DbgAssert (cid == APPDATA_TEST_CLASS_ID);
	DbgAssert (sid == UTILITY_CLASS_ID);

	Interface14 *iface = GetCOREInterface14();
	iface->ConvertAppDataChunksContainingStringToUTF8(anim, cid, sid, subIDs, iload->CodePage());
}
Ejemplo n.º 3
0
int FaceDataExport::DoExport(const TCHAR *name,ExpInterface *ei,Interface *i, BOOL suppressPrompts, DWORD options) {
	exportSelected = (options & SCENE_EXPORT_SELECTED) ? true : false;
	Interface14 *iface = GetCOREInterface14();
	UINT codepage  = iface-> DefaultTextSaveCodePage(true);
	if(!fileStream.Open(name, false, MaxSDK::Util::TextFile::Writer::WRITE_BOM | codepage )) return 0;
	fileStream.Printf(_T("FaceFloats Export 1.1\n\n"));
	int numChildren = i->GetRootNode()->NumberOfChildren();
	for (int idx=0; idx<numChildren; idx++) {
		nodeEnum(i->GetRootNode()->GetChildNode(idx), i);
	}
	fileStream.Close();

	return TRUE;
}
Ejemplo n.º 4
0
void AppDataTest::GetAppData()
	{
	Animatable *anim = PickAnim();
	if (!anim) return;

	// XRef stuff 020416  --prs.
	if (s_through_xref) {
		RefTargetHandle rth = (RefTargetHandle)anim;
		IXRefItem* xi = NULL;
		while (rth != NULL && (xi = IXRefItem::GetInterface(*rth)) != NULL)
			rth = xi->GetSrcItem();
		if (rth != NULL)
			anim = rth;
	}

	// Grab the app data chunk from the anim
	AppDataChunk *ad = 
		anim->GetAppDataChunk(
			APPDATA_TEST_CLASS_ID, 
			UTILITY_CLASS_ID, 
			spin->GetIVal());
	if (ad && ad->data) {
		// Fill the edit field with the text.
		TSTR data;
		const char* raw_string = (const char*)ad->data;
		if (strncmp(raw_string, "\xef\xbb\xbf", 3) == 0)
			data = TSTR::FromUTF8(raw_string+3);
		else
		{
			DbgAssert(!_T("Should always convert appdata in UpdateAppDataLoadProc"));
			Interface14 *iface = GetCOREInterface14();
			LANGID langID = iface->LanguageToUseForFileIO();
			UINT codePage = iface->CodePageForLanguage(langID);
			data = TSTR::FromCP(codePage, raw_string);
		}
		SetDlgItemText(hPanel,IDC_APPDATA_EDIT,data.data());
	} else {
		// Not found!
		MessageBox(hPanel,_T("No app data found"),_T("App Data Tester"),MB_OK);
		}
	}
Ejemplo n.º 5
0
int Blockporter::DoExport(const TCHAR* name, ExpInterface* ei, Interface* i, BOOL supressPrompts, DWORD options)
{
	INode* root;
	//caption and message for MessagesBoxes
	TCHAR msg[MB_BUFFER_LENGTH];
	TCHAR cap[MB_BUFFER_LENGTH];

	//Get the root node
	root = i->GetRootNode();

	//the node of our object should be a groupnode, which contains every object
	//we want to export
	i->PushPrompt(_T("Searching for Group..."));
	bool found = false;
	for(int idx = 0; idx < root->NumberOfChildren(); idx++)
	{
		if(root->GetChildNode(idx)->IsGroupHead())
		{
			//we found our group
			//next step is to make the group node our new root, because every object
			//we want is part of this group

			found = true;
			root = root->GetChildNode(idx);
			break;
		}
	}

	if(!found)
	{
		MessageBox(nullptr, GetString(IDS_ERROR_NO_GROUP, msg), GetString(IDS_GENERAL_ERROR, cap), MB_OK | MB_ICONERROR);
		return 0;
	}

	//Now that we have the groupnode let's compare the fileversions
	if(!IsNewModelVersion(name, root->GetName()))
	{
		if(MessageBox(nullptr, GetString(IDS_VER_TO_LOW_MSG, msg), GetString(IDS_VER_TO_LOW_CAP, cap), MB_YESNO | MB_ICONEXCLAMATION) == IDNO)
			return 1;
	}

	i->PushPrompt(_T("Opening File"));
	Interface14* iface = GetCOREInterface14();
	UINT code = iface->DefaultTextSaveCodePage(true);
	MaxSDK::Util::Path storageNamePath(name);
	storageNamePath.SaveBaseFile();
	switch (code & MaxSDK::Util::MaxStringDataEncoding::MSDE_CP_MASK)
	{
	case CP_UTF8:
		mStream = _tfopen(name, _T("wt, ccs=UFT-8"));
		break;
	case MaxSDK::Util::MaxStringDataEncoding::MSDE_CP_UTF16:
		mStream = _tfopen(name, _T("wt, ccs=UTF-16BE"));
		break;
	default:
		mStream = _tfopen(name, _T("wt"));
	}
	if(!mStream)
		return 0;

	//now we have our file stream, so let's write the header
	i->PushPrompt(_T("Writing Header"));
	WriteHeader(root->GetName(), root->NumberOfChildren());

	//now that we have the header written, let's iterate through the objects in the
	//group and export the meshes and lights

	INode* child;
    Point3 pMin(0,0,0), pMax(0,0,0);

	for(int idx = 0; idx < root->NumberOfChildren(); idx++)
	{
		child = root->GetChildNode(idx);
		i->PushPrompt(_T("Processing Object %s", child->GetName()));
		if(child->IsGroupHead())
		{
			MessageBox(nullptr, GetString(IDS_ERROR_TO_MANY_GROUPS, msg), GetString(IDS_GENERAL_ERROR, cap), MB_OK | MB_ICONERROR);
			continue;
		}

		ObjectState os = child->EvalWorldState(0);

		//let's take a look at the SuperClassID of the object
		//so we find out if it's a mesh or a light
		if(!os.obj)
			continue; //somehow this node doesn't have an object

        Box3 boundBox;

		switch(os.obj->SuperClassID())
		{
		case GEOMOBJECT_CLASS_ID:
			_ftprintf(mStream, _T("<ObjectID=%i>\n"), idx);
			i->PushPrompt(_T("Writing MeshData for Object %s", child->GetName()));
			boundBox = WriteMeshData(child, idx);
            pMin.x = (boundBox.Min().x < pMin.x) ? boundBox.Min().x : pMin.x;
            pMin.y = (boundBox.Min().y < pMin.y) ? boundBox.Min().y : pMin.y;
            pMax.x = (boundBox.Max().x > pMax.x) ? boundBox.Max().x : pMax.x;
            pMax.y = (boundBox.Max().y > pMax.y) ? boundBox.Max().y : pMax.y;
			i->PushPrompt(_T("Writing MaterialData for Object %s", child->GetName()));
			WriteMaterialData(child);
			_ftprintf(mStream, _T("</Object>\n"));
			break;
		//case LIGHT_CLASS_ID:
		//	WriteLightData(child, idx);
		//	break;
		}
	}

    //Write the Bounding Box
    _ftprintf(mStream, _T("<BoundingBox>\n"));
    _ftprintf(mStream, _T("\t<Min=%f,%f>\n"), pMin.x, pMin.y);
    _ftprintf(mStream, _T("\t<Max=%f,%f>\n"), pMax.x, pMax.y);
    _ftprintf(mStream, _T("</BoundingBox>\n"));
	//we are done exporting, so close the stream
	i->PushPrompt(_T("Closing file..."));
	fclose(mStream);

	MessageBox(nullptr, GetString(IDS_FINISH_MSG, msg), GetString(IDS_FINISH_CAP, cap), MB_OK | MB_ICONINFORMATION);

	return 1;
}
Ejemplo n.º 6
0
// Output float keys if this is a known float controller that
// supports key operations. Otherwise we will sample the controller 
// once for each frame to get the value.
void AsciiExp::DumpFloatKeys(Control* cont, int indentLevel) 
{
	if (!cont)
		return;
	
	int i;
	TSTR indent = GetIndent(indentLevel);
	IKeyControl *ikc = NULL;

	// If the user wants us to always sample, we will ignore the KeyControlInterface
	if (!GetAlwaysSample())
		ikc = GetKeyControlInterface(cont);
	
	// TCB float
	if (ikc && cont->ClassID() == Class_ID(TCBINTERP_FLOAT_CLASS_ID, 0)) {
		_ftprintf(pStream, _T("%s\t\t%s {\n"), indent.data(), ID_CONTROL_FLOAT_TCB); 
		for (i=0; i<ikc->GetNumKeys(); i++) {
			ITCBFloatKey key;
			ikc->GetKey(i, &key);
			_ftprintf(pStream, _T("%s\t\t\t%s %d\t%s"),
				indent.data(),
				ID_TCB_FLOAT_KEY,
				key.time,
				Format(key.val));
			_ftprintf(pStream, _T("\t%s\t%s\t%s\t%s\t%s\n"), Format(key.tens), Format(key.cont), Format(key.bias), Format(key.easeIn), Format(key.easeOut));
		}
		_ftprintf(pStream, _T("%s\t\t}\n"), indent.data());
	}
	// Bezier float
	else if (ikc && cont->ClassID() == Class_ID(HYBRIDINTERP_FLOAT_CLASS_ID, 0)) {
		_ftprintf(pStream, _T("%s\t\t%s {\n"), indent.data(), ID_CONTROL_FLOAT_BEZIER); 
		for (i=0; i<ikc->GetNumKeys(); i++) {
			IBezFloatKey key;
			ikc->GetKey(i, &key);
			_ftprintf(pStream, _T("%s\t\t\t%s %d\t%s"),
				indent.data(),
				ID_BEZIER_FLOAT_KEY,
				key.time, 
				Format(key.val));
			_ftprintf(pStream, _T("\t%s\t%s\t%d\n"), Format(key.intan), Format(key.outtan), key.flags);
		}
		_ftprintf(pStream, _T("%s\t\t}\n"), indent.data());
	}
	else if (ikc && cont->ClassID() == Class_ID(LININTERP_FLOAT_CLASS_ID, 0)) {
		_ftprintf(pStream, _T("%s\t\t%s {\n"), indent.data(), ID_CONTROL_FLOAT_LINEAR); 
		for (i=0; i<ikc->GetNumKeys(); i++) {
			ILinFloatKey key;
			ikc->GetKey(i, &key);
			_ftprintf(pStream, _T("%s\t\t\t%s %d\t%s\n"),
				indent.data(),
				ID_FLOAT_KEY,
				key.time,
				Format(key.val));
		}
		_ftprintf(pStream, _T("%s\t\t}\n"), indent.data());
	}
	else {
		
		// Unknown controller, no key interface or sample on demand -
		// This might be a procedural controller or something else we
		// don't know about. The last resort is to get the value from the 
		// controller at every n frames.
		
		TSTR name;
		cont->GetClassName(name);
		TSTR className = FixupName(name);
		Interface14 *iface = GetCOREInterface14();
		UINT codepage  = iface-> DefaultTextSaveCodePage(true);
		const char* className_locale = className.ToCP(codepage);
		_ftprintf(pStream, _T("%s\t\t%s \"%hs\" {\n"), indent.data(), ID_CONTROL_FLOAT_SAMPLE,
			className_locale);
		
		// If it is animated at all...
		if (cont->IsAnimated()) {
			// Get the range of the controller animation 
			Interval range; 
			// Get range of full animation
			Interval animRange = ip->GetAnimRange(); 
			TimeValue t = cont->GetTimeRange(TIMERANGE_ALL).Start();
			float value;
			
			// While we are inside the animation... 
			while (animRange.InInterval(t)) {
				// Sample the controller
				range = FOREVER;
				cont->GetValue(t, &value, range);
				
				// Set time to start of controller validity interval 
				t = range.Start();
				
				// Output the sample
				_ftprintf(pStream, _T("%s\t\t\t%s %d\t%s\n"),
					indent.data(),
					ID_FLOAT_KEY,
					t,
					Format(value));
				
				// If the end of the controller validity is beyond the 
				// range of the animation
				if (range.End() > cont->GetTimeRange(TIMERANGE_ALL).End()) {
					break;
				}
				else {
					t = (range.End()/GetTicksPerFrame()+GetKeyFrameStep()) * GetTicksPerFrame();
				}
			}
		}
		_ftprintf(pStream, _T("%s\t\t}\n"), indent.data());
	}
}
Ejemplo n.º 7
0
// Get hold of the transform controllers for the node... 
void AsciiExp::ExportAnimKeys(INode* node, int indentLevel) 
{
	TSTR indent = GetIndent(indentLevel);
	BOOL bPosAnim;
	BOOL bRotAnim;
	BOOL bScaleAnim;
	BOOL bDoKeys = FALSE;

	// We can only export keys if all TM controllers are "known" to us.
	// The reason for that is that some controllers control more than what
	// they should. Consider a path position controller, if you turn on
	// follow and banking, this position controller will also control
	// rotation. If a node that had a path position controller also had a
	// TCB rotation controller, the TCB keys would not describe the whole
	// rotation of the node.
	// For that reason we will only export keys if all controllers
	// position, rotation and scale are linear, hybrid (bezier) or tcb.

	if (!GetAlwaysSample()) {
		Control* pC = node->GetTMController()->GetPositionController();
		Control* rC = node->GetTMController()->GetRotationController();
		Control* sC = node->GetTMController()->GetScaleController();

		if (IsKnownController(pC) && IsKnownController(rC) && IsKnownController(sC)) {
			bDoKeys = TRUE;
		}
	}

	Interface14 *iface = GetCOREInterface14();
	UINT codepage  = iface-> DefaultTextSaveCodePage(true);
	TSTR nodeName = FixupName(node->GetName());
	const char* nodeName_locale = nodeName.ToCP(codepage);
	if (bDoKeys) {
		// Only dump the track header if any of the controllers have keys
		if (node->GetTMController()->GetPositionController()->NumKeys() ||
			node->GetTMController()->GetRotationController()->NumKeys() ||
			node->GetTMController()->GetScaleController()->NumKeys()) {

			_ftprintf(pStream, _T("%s\t%s {\n"), indent.data(), ID_TM_ANIMATION); 
			_ftprintf(pStream, _T("%s\t\t%s \"%hs\"\n"), indent.data(), ID_NODE_NAME,
				nodeName_locale);

			DumpPosKeys(node->GetTMController()->GetPositionController(), indentLevel);
			DumpRotKeys(node->GetTMController()->GetRotationController(), indentLevel);
			DumpScaleKeys(node->GetTMController()->GetScaleController(), indentLevel);

			_ftprintf(pStream, _T("%s\t}\n"), indent.data());
		}
	}
	else if (CheckForAnimation(node, bPosAnim, bRotAnim, bScaleAnim)) {
		_ftprintf(pStream, _T("%s\t%s {\n"), indent.data(), ID_TM_ANIMATION); 
		_ftprintf(pStream, _T("%s\t\t%s \"%hs\"\n"), indent.data(), ID_NODE_NAME,
			nodeName_locale);

		if (bPosAnim) {
			DumpPosSample(node, indentLevel);
		}
		if (bRotAnim) {
			DumpRotSample(node, indentLevel);
		}
		if (bScaleAnim) {
			DumpScaleSample(node, indentLevel);
		}

		_ftprintf(pStream, _T("%s\t}\n"), indent.data());
	}
}
Ejemplo n.º 8
0
int
dump_mtlchunk(ushort tag,FILE *stream,void *data)
	{
	long chunkptr,chunkbase,curpos,chunksize;
	Color_f *cf;
	Color_24 *c24;

	Interface14 *iface= GetCOREInterface14();
	UINT codePage = iface->DefaultTextSaveCodePage();
	
	TSTR tName;
	CStr cName ;

	Mmtllist *ml;
//	Mliblist *mlb;
	
	chunkbase=ftell(stream);
	WRTERR(&tag,2);
	chunkptr=ftell(stream);  /* Save file ptr for chunk size */
	WRTERR(&chunkptr,4);
	switch(tag)
		{
		case MLIBMAGIC:
			switch(libtype)
				{
				case 0:
//					if(mlib)
//						{
//						mlb=mlib;
//						while(mlb)
//							{
//							savemtl= &mlb->material;
//							if(dump_mtlchunk(MAT_ENTRY,stream,NULL)==0)
//								return(0);
//							mlb=mlb->next;
//							}
//						}
					break;
				case 1:
					if(mmtl)
						{
//						tag_used_mmtls(); // for our purposes, they're ALL used
						ml=mmtl;
						while(ml)
							{
//							if(ml->flags & MMTLUSED)
								{
								savemtl= &ml->material;
								if(dump_mtlchunk(MAT_ENTRY,stream,NULL)==0)
									return(0);
								}
							ml=ml->next;
							}
						}
					break;
				}
			break;
		case MAT_ENTRY:
		case MATMAGIC:
			{
			if(dump_mtlchunk(MAT_NAME,stream,savemtl->name)==0) return(0);
			if(dump_mtlchunk(MAT_AMBIENT,stream,&savemtl->amb)==0) return(0);
			if(dump_mtlchunk(MAT_DIFFUSE,stream,&savemtl->diff)==0) return(0);
			if(dump_mtlchunk(MAT_SPECULAR,stream,&savemtl->spec)==0)return(0);
			if(dump_mtlchunk(MAT_SHININESS,stream,NULL)==0)	return(0);
			if(dump_mtlchunk(MAT_SHIN2PCT,stream,NULL)==0) return(0);
			if(dump_mtlchunk(MAT_TRANSPARENCY,stream,NULL)==0)	return(0);
			if(dump_mtlchunk(MAT_XPFALL,stream,NULL)==0)	return(0);
			if(dump_mtlchunk(MAT_REFBLUR,stream,NULL)==0) return(0);
			if(dump_mtlchunk(MAT_SHADING,stream,NULL)==0) return(0);
			if(dump_mtlchunk(MAT_SELF_ILPCT,stream,NULL)==0) return(0);
	
			if(savemtl->use&MATUSE_XPFALL)  {
				if(dump_mtlchunk(MAT_USE_XPFALL,stream,NULL)==0)
					return(0);
				}
			if(savemtl->use&MATUSE_REFBLUR)  {
				if(dump_mtlchunk(MAT_USE_REFBLUR,stream,NULL)==0)
					return(0);
				}
			if(savemtl->flags & MF_TWOSIDE)  {
				if(dump_mtlchunk(MAT_TWO_SIDE,stream,NULL)==0)
					return(0);
				}
			if(savemtl->flags & MF_ADDITIVE) {
				if(dump_mtlchunk(MAT_ADDITIVE,stream,NULL)==0)
					return(0);
				}
			if(savemtl->flags & MF_WIRE) {
				if(dump_mtlchunk(MAT_WIRE,stream,NULL)==0)
					return(0);
				}
			if(savemtl->flags & MF_FACEMAP) {
				if(dump_mtlchunk(MAT_FACEMAP,stream,NULL)==0)
					return(0);
				}

			if(savemtl->flags & MF_XPFALLIN) {
				if(dump_mtlchunk(MAT_XPFALLIN,stream,NULL)==0)
					return(0);
				}

			if(savemtl->flags & MF_PHONGSOFT) {
				if(dump_mtlchunk(MAT_PHONGSOFT,stream,NULL)==0)
					return(0);
				}

			if(savemtl->flags & MF_WIREABS) {
				if(dump_mtlchunk(MAT_WIREABS,stream,NULL)==0)
					return(0);
				}

			if(dump_mtlchunk(MAT_WIRESIZE,stream,&savemtl->wiresize)==0)
					return(0);

			/* Save out any texture maps, masks, sxp's */
			for (int k=0; k<NMAPTYPES; k++) {
				Mapping *mp = savemtl->map[k];
				if (mp==NULL) continue;
				if (mp->use) {
					DMP_MATCHUNK(map_chunks[k],NULL);
					if (k!=Nrefl) {
						if (isSXPMap(&mp->map)) 
							DMP_MATCHUNK(map_sxp_chunks[k],mp->map.p.tex.sxp_data);
						}
					if (mp->mask.name[0]!=0) {
						DMP_MATCHUNK(mask_chunks[k],NULL);
						if (isSXPMap(&mp->mask)) 
							DMP_MATCHUNK(mask_sxp_chunks[k],mp->mask.p.tex.sxp_data);
						}
					}
				}
			/* dump auto-cubic chunk */
				{
				Mapping *rm = savemtl->map[Nrefl];
				if (rm&&rm->use&&rm->map.p.ref.acb.flags & AC_ON) DMP_MATCHUNK(MAT_ACUBIC,&rm->map.p.ref.acb);
				}
			if (savemtl->appdata) 
				if(dump_mtlchunk(APP_DATA,stream,savemtl->appdata)==0)
						return(0);
			}				
			break;
	
		case APP_DATA:
			{
			ULONG *plong = (ULONG *)data;
			WRTERR(&plong[1],plong[0]);
			}
			break;
		case MAT_AMBIENT:
		case MAT_DIFFUSE:
		case MAT_SPECULAR:
			if (gammaMgr.enable) {
				Color_24 gc;
				c24 = (Color_24 *)data;
				gc.r = gammaMgr.file_in_gamtab[c24->r];
				gc.g = gammaMgr.file_in_gamtab[c24->g];
				gc.b = gammaMgr.file_in_gamtab[c24->b];
				if(dump_mtlchunk(COLOR_24,stream,&gc)==0)	return(0);
				if(dump_mtlchunk(LIN_COLOR_24,stream,data)==0)return(0);
				}
			else {
				if(dump_mtlchunk(COLOR_24,stream,data)==0) return(0);
				}
			break;
		case MAT_SHININESS:
			if(dump_mtlchunk(INT_PERCENTAGE,stream,&savemtl->shininess)==0)
				return(0);
			break;
		case MAT_SHIN2PCT:
			if(dump_mtlchunk(INT_PERCENTAGE,stream,&savemtl->shin2pct)==0)
				return(0);
			break;
		case MAT_SHIN3PCT:
			if(dump_mtlchunk(INT_PERCENTAGE,stream,&savemtl->shin3pct)==0)
				return(0);
			break;
		case MAT_TRANSPARENCY:
			if(dump_mtlchunk(INT_PERCENTAGE,stream,&savemtl->transparency)==0)
				return(0);
			break;
		case MAT_XPFALL:
			if(dump_mtlchunk(INT_PERCENTAGE,stream,&savemtl->xpfall)==0)
				return(0);
			break;
		case MAT_REFBLUR:
			if(dump_mtlchunk(INT_PERCENTAGE,stream,&savemtl->refblur)==0)
				return(0);
			break;
		case MAT_SELF_ILPCT:
			if(dump_mtlchunk(INT_PERCENTAGE,stream,&savemtl->selfipct)==0)
				return(0);
			break;
		case MAT_SHADING:
			WRTERR(&savemtl->shading,2);
			break;
	
		case MAT_TEXMAP:   if (!dmp_map(stream,Ntex)) return(0); break;
		case MAT_TEX2MAP:  if (!dmp_map(stream,Ntex2)) return(0); break;
		case MAT_OPACMAP:  if (!dmp_map(stream,Nopac)) return(0); break;
		case MAT_BUMPMAP:  if (!dmp_map(stream,Nbump)) return(0); break;
		case MAT_SPECMAP:  if (!dmp_map(stream,Nspec)) return(0); break;
		case MAT_SHINMAP:  if (!dmp_map(stream,Nshin)) return(0); break;
		case MAT_SELFIMAP: if (!dmp_map(stream,Nselfi)) return(0); break;
		case MAT_REFLMAP:  if (!dmp_map(stream,Nrefl)) return(0); break;
	
		case MAT_TEXMASK:  if (!dmp_mask(stream,Ntex)) return(0); break;
		case MAT_TEX2MASK: if (!dmp_mask(stream,Ntex2)) return(0); break;
		case MAT_OPACMASK: if (!dmp_mask(stream,Nopac)) return(0); break;
		case MAT_BUMPMASK: if (!dmp_mask(stream,Nbump)) return(0); break;
		case MAT_SPECMASK: if (!dmp_mask(stream,Nspec)) return(0); break;
		case MAT_SHINMASK: if (!dmp_mask(stream,Nshin)) return(0); break;
		case MAT_SELFIMASK:if (!dmp_mask(stream,Nselfi)) return(0); break;
		case MAT_REFLMASK: if (!dmp_mask(stream,Nrefl)) return(0); break;
	
		case MAT_MAP_TILING: 
			WRTERR(data,2);
			break;
		case MAT_MAP_TEXBLUR: 
		case MAT_MAP_USCALE: 
		case MAT_MAP_VSCALE: 
		case MAT_MAP_UOFFSET: 
		case MAT_MAP_VOFFSET: 
			WRTERR(data,4);
			break;
		case MAT_MAP_COL1:
		case MAT_MAP_COL2:
		case MAT_MAP_RCOL:
		case MAT_MAP_GCOL:
		case MAT_MAP_BCOL:
			c24=(Color_24 *)data;
			WRTERR(c24,3);
			break;
		case MAT_MAP_ANG:
 			{
			MapParams *mp = (MapParams *)data;
			float ang,dang;
 			ang = (float)atan2(mp->ang_sin,mp->ang_cos);
			dang = RadToDeg(ang);
#if 0
			printf("Saving MAT_MAP_ANG sin = %.4f , cos = %.4f, ang = %.4f \n",
				mp->ang_sin, mp->ang_cos, ang);
#endif
			WRTERR(&dang,4);
			}
			break;
	
		case COLOR_F:
			cf=(Color_f *)data;
			WRTERR(cf,12);
			break;
		case COLOR_24:
			c24=(Color_24 *)data;
			WRTERR(c24,3);
			break;
		case LIN_COLOR_24:
			c24 = (Color_24 *)data;
			WRTERR(c24,3);
			break;
		case MAT_NAME:  /* Simple strings */
			tName = (TCHAR *)data;
			cName =  tName.ToCP(codePage).data();
			if(cName.Length()>16)
				cName.Resize(16);
			WRTERR(cName.data(),(size_t)( cName.Length()+1));
			break;
		case MAT_MAPNAME:
			tName = (TCHAR *)data;
			// convert to 8.3 filename format
			EightDotThreeName( tName, false );
			cName =  tName.ToCP(codePage).data();
			if(cName.Length()>12)
				cName.Resize(12);
			WRTERR( cName.data(),(size_t)( cName.Length()+1));
			break;

		case MAT_BUMP_PERCENT:
		case INT_PERCENTAGE:
			WRTERR(data,2);
			break;
		case MAT_WIRESIZE:
			WRTERR(data,4);
			break;
		case MAT_TWO_SIDE:
		case MAT_SUPERSMP:
		case MAT_ADDITIVE:
		case MAT_WIRE:
		case MAT_FACEMAP:
		case MAT_XPFALLIN:
		case MAT_USE_XPFALL:
		case MAT_USE_REFBLUR:
		case MAT_PHONGSOFT:
		case MAT_WIREABS:
		case DUMMY:
			break;
		case MAT_ACUBIC: {
				AutoCubicParams *ac = (AutoCubicParams *)data;
				WRTERR(&ac->shade,1);
				WRTERR(&ac->aalevel,1);
				WRTERR(&ac->flags,2);
				WRTERR(&ac->size,4);
				WRTERR(&ac->nth,4);
				}
			break;
		case MAT_SXP_TEXT_DATA:
		case MAT_SXP_TEXT2_DATA:
		case MAT_SXP_OPAC_DATA:
		case MAT_SXP_BUMP_DATA:
		case MAT_SXP_SPEC_DATA:
		case MAT_SXP_SHIN_DATA:
		case MAT_SXP_SELFI_DATA:

		case MAT_SXP_TEXT_MASKDATA:
		case MAT_SXP_TEXT2_MASKDATA:
		case MAT_SXP_OPAC_MASKDATA:
		case MAT_SXP_BUMP_MASKDATA:
		case MAT_SXP_SPEC_MASKDATA:
		case MAT_SXP_SHIN_MASKDATA:
		case MAT_SXP_SELFI_MASKDATA:
		case MAT_SXP_REFL_MASKDATA:
			{
			ULONG *plong = (ULONG *)data;
			if (plong!=NULL)
				WRTERR(&plong[1],plong[0]);
			}
			break;
		}
	
	/* Save file ptr */
	
	curpos=ftell(stream);
	
	/* Point back to chunk size location */
	
	fseek(stream,chunkptr,SEEK_SET);
	
	/* Calc & write chunk size */
	
	chunksize=curpos-chunkbase;
	WRTERR(&chunksize,4);
	
	/* Point back to file end */
	
	fseek(stream,curpos,SEEK_SET);
	return(1);
	}