示例#1
0
//A utility function to load shaders from resource
bool LoadShaderData(CStr& outData, int iShaderID, HINSTANCE hInst, const MSTR& strTypeName)
{
	bool bResult = false;

	// Load from resource
	HRSRC hResourceInfo;
	HGLOBAL hResource;
	DWORD dwSize;
	// find the resource info
	hResourceInfo = FindResourceW(hInst, MAKEINTRESOURCEW(iShaderID), strTypeName);
	if (hResourceInfo != NULL)
	{
		// handle to the resource
		hResource = LoadResource(hInst, hResourceInfo);
		if (hResource != NULL)
		{
			byte* pStr = (byte*)LockResource(hResource);
			dwSize = SizeofResource(hInst, hResourceInfo);
			if (pStr != NULL && dwSize != 0)
			{
				outData.Resize(dwSize + 1); //Reserve '\0' at the end of string
				ZeroMemory(outData.dataForWrite(), outData.length());
				memcpy(outData.dataForWrite(), pStr, dwSize);
				outData.dataForWrite()[dwSize] = '\0';
				UnlockResource(hResource);
				bResult = true;
			}
		}
	}

	return bResult;
}
示例#2
0
// Substring operator
CStr CStr::Substr(int start, int nchars) const
{
   CStr tmp;
   int len = Length();
   int n = min(start+nchars, len) - start;
   tmp.Resize(n);
   StringCbCopyA(tmp.buf, n, buf+start);
   return tmp;
}
示例#3
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);
	}