コード例 #1
0
ファイル: gl_model.c プロジェクト: Cabriter/Quake
/*
===============
Mod_LoadAllSkins
===============
*/
void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype)
{
    int		i, j, k;
    char	name[32];
    int		s;
    byte	*copy;
    byte	*skin;
    byte	*texels;
    daliasskingroup_t		*pinskingroup;
    int		groupskins;
    daliasskininterval_t	*pinskinintervals;

    skin = (byte *)(pskintype + 1);

    if (numskins < 1 || numskins > MAX_SKINS)
        Sys_Error ("Mod_LoadAliasModel: Invalid # of skins: %d\n", numskins);

    s = pheader->skinwidth * pheader->skinheight;

    for (i=0 ; i<numskins ; i++)
    {
        if (pskintype->type == ALIAS_SKIN_SINGLE) {
            Mod_FloodFillSkin( skin, pheader->skinwidth, pheader->skinheight );

            // save 8 bit texels for the player model to remap
            //		if (!strcmp(loadmodel->name,"progs/player.mdl")) {
            texels = Hunk_AllocName(s, loadname);
            pheader->texels[i] = texels - (byte *)pheader;
            memcpy (texels, (byte *)(pskintype + 1), s);
            //		}
            sprintf (name, "%s_%i", loadmodel->name, i);
            pheader->gl_texturenum[i][0] =
                pheader->gl_texturenum[i][1] =
                    pheader->gl_texturenum[i][2] =
                        pheader->gl_texturenum[i][3] =
                            GL_LoadTexture (name, pheader->skinwidth,
                                            pheader->skinheight, (byte *)(pskintype + 1), true, false);
            pskintype = (daliasskintype_t *)((byte *)(pskintype+1) + s);
        } else {
            // animating skin group.  yuck.
            pskintype++;
            pinskingroup = (daliasskingroup_t *)pskintype;
            groupskins = LittleLong (pinskingroup->numskins);
            pinskinintervals = (daliasskininterval_t *)(pinskingroup + 1);

            pskintype = (void *)(pinskinintervals + groupskins);

            for (j=0 ; j<groupskins ; j++)
            {
                Mod_FloodFillSkin( skin, pheader->skinwidth, pheader->skinheight );
                if (j == 0) {
                    texels = Hunk_AllocName(s, loadname);
                    pheader->texels[i] = texels - (byte *)pheader;
                    memcpy (texels, (byte *)(pskintype), s);
                }
                sprintf (name, "%s_%i_%i", loadmodel->name, i,j);
                pheader->gl_texturenum[i][j&3] =
                    GL_LoadTexture (name, pheader->skinwidth,
                                    pheader->skinheight, (byte *)(pskintype), true, false);
                pskintype = (daliasskintype_t *)((byte *)(pskintype) + s);
            }
            k = j;
            for (/* */; j < 4; j++)
                pheader->gl_texturenum[i][j&3] =
                    pheader->gl_texturenum[i][j - k];
        }
    }

    return (void *)pskintype;
}
コード例 #2
0
ファイル: gx_model.c プロジェクト: Izhido/qrevpak
/*
===============
Mod_LoadAllSkins
===============
*/
void *Mod_LoadAllSkins (int numskins, daliasskintype_t *pskintype)
{
	int		i, j, k;
	char	name[32];
	int		s;
	byte	*skin;
	daliasskingroup_t		*pinskingroup;
	int		groupskins;
	daliasskininterval_t	*pinskinintervals;
	
	skin = (byte *)(pskintype + 1);

	if (numskins < 1 || numskins > MAX_SKINS)
		Sys_Error ("Mod_LoadAliasModel: Invalid # of skins: %d\n", numskins);

	s = pheader->skinwidth * pheader->skinheight;

	for (i=0 ; i<numskins ; i++)
	{
		if (pskintype->type == ALIAS_SKIN_SINGLE) {
			Mod_FloodFillSkin( skin, pheader->skinwidth, pheader->skinheight );

			// save 8 bit texels for the player model to remap
			// save 8 bit texels for the player model to remap
			if (!strcmp(loadmodel->name,"progs/player.mdl"))
			{
				if (s > sizeof(player_8bit_texels))
					Sys_Error ("Player skin too large");
				memcpy (player_8bit_texels, (byte *)(pskintype + 1), s);
			}
			sprintf (name, "%s_%i", loadmodel->name, i);
			pheader->gx_texturenum[i][0] =
			pheader->gx_texturenum[i][1] =
			pheader->gx_texturenum[i][2] =
			// Mipmaps disabled; pointless for this engine in GX hardware:
			pheader->gx_texturenum[i][3] =
				GX_LoadTexture (name, pheader->skinwidth, 
				pheader->skinheight, (byte *)(pskintype + 1), false/*true*/, false);
			pskintype = (daliasskintype_t *)((byte *)(pskintype+1) + s);
		} else {
			// animating skin group.  yuck.
			pskintype++;
			pinskingroup = (daliasskingroup_t *)pskintype;
			groupskins = LittleLong (pinskingroup->numskins);
			pinskinintervals = (daliasskininterval_t *)(pinskingroup + 1);

			pskintype = (void *)(pinskinintervals + groupskins);

			for (j=0 ; j<groupskins ; j++)
			{
					Mod_FloodFillSkin( skin, pheader->skinwidth, pheader->skinheight );
					sprintf (name, "%s_%i_%i", loadmodel->name, i,j);
					// Mipmaps disabled; pointless for this engine in GX hardware:
					pheader->gx_texturenum[i][j&3] = 
						GX_LoadTexture (name, pheader->skinwidth, 
						pheader->skinheight, (byte *)(pskintype), false/*true*/, false);
					pskintype = (daliasskintype_t *)((byte *)(pskintype) + s);
			}
			k = j;
			for (/* */; j < 4; j++)
				pheader->gx_texturenum[i][j&3] = 
				pheader->gx_texturenum[i][j - k]; 
		}
	}

	return (void *)pskintype;
}