コード例 #1
0
ファイル: bg_animgroup.c プロジェクト: BulldogDrummond/etmod
qboolean BG_R_RegisterAnimationGroup(const char *filename, animModelInfo_t *animModelInfo)
{
    pc_token_t token;
    int        handle;

    animModelInfo->numAnimations = 0;
    animModelInfo->footsteps     = FOOTSTEP_NORMAL;
    animModelInfo->gender        = GENDER_MALE;
    animModelInfo->isSkeletal    = qtrue;
    animModelInfo->version       = 3;
    animModelInfo->numHeadAnims  = 0;

    handle = trap_PC_LoadSource(filename);

    if (!handle)
    {
        return qfalse;
    }

    if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "animgroup"))
    {
        return BG_RAG_ParseError(handle, "expected 'animgroup'");
    }

    if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "{"))
    {
        return BG_RAG_ParseError(handle, "expected '{'");
    }

    while (1)
    {
        if (!trap_PC_ReadToken(handle, &token))
        {
            break;
        }

        if (token.string[0] == '}')
        {
            break;
        }

        if (!Q_stricmp(token.string, "animfile"))
        {
            if (!BG_RAG_ParseAnimFile(handle, animModelInfo))
            {
                return qfalse;
            }
        }
        else
        {
            return BG_RAG_ParseError(handle, "unknown token '%s'", token.string);
        }
    }

    trap_PC_FreeSource(handle);

    return qtrue;
}
コード例 #2
0
ファイル: bg_animgroup.c プロジェクト: BulldogDrummond/etmod
static qboolean BG_RAG_ParseAnimFile(int handle, animModelInfo_t *animModelInfo)
{
    pc_token_t token;
    qhandle_t  mdxFile;

    animation_t *animation;

    if (!trap_PC_ReadToken(handle, &token))
    {
        return BG_RAG_ParseError(handle, "expected mdx filename");
    }

    if (!(mdxFile = trap_R_RegisterModel(token.string)))
    {
        return BG_RAG_ParseError(handle, "failed to load %s", token.string);
    }

    if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "{"))
    {
        return BG_RAG_ParseError(handle, "expected '{'");
    }

    while (1)
    {
        if (!trap_PC_ReadToken(handle, &token))
        {
            return BG_RAG_ParseError(handle, "unexpected EOF");
        }

        if (token.string[0] == '}')
        {
            break;
        }

        if (!(animation = BG_RAG_FindFreeAnimation(mdxFile, token.string)))
        {
            return BG_RAG_ParseError(handle, "out of animation storage space");
        }

        Q_strncpyz(animation->name, token.string, sizeof(animation->name));
        Q_strlwr(animation->name);

        if (!BG_RAG_ParseAnimation(handle, animation))
        {
            return qfalse;
        }

        animModelInfo->animations[animModelInfo->numAnimations] = animation;
        animModelInfo->numAnimations++;
    }

    return qtrue;
}
コード例 #3
0
ファイル: bg_animgroup.c プロジェクト: morsik/war-territory
static animation_t * BG_RAG_FindFreeAnimation(const char *mdxFileName, const char *name)
#endif // CGAMEDLL
{
	int i;

	for (i = 0; i < MAX_ANIMPOOL_SIZE; i++)
	{
#ifdef CGAMEDLL
		if (animationPool[i].mdxFile == mdxFile && !Q_stricmp(animationPool[i].name, name))
		{
#else
		if (*animationPool[i].mdxFileName && !Q_stricmp(animationPool[i].mdxFileName, mdxFileName) && !Q_stricmp(animationPool[i].name, name))
		{
#endif // CGAMEDLL
			return(&animationPool[i]);
		}
	}

	for (i = 0; i < MAX_ANIMPOOL_SIZE; i++)
	{
#ifdef CGAMEDLL
		if (!animationPool[i].mdxFile)
		{
			animationPool[i].mdxFile = mdxFile;
#else
		if (!animationPool[i].mdxFileName[0])
		{
			Q_strncpyz(animationPool[i].mdxFileName, mdxFileName, sizeof(animationPool[i].mdxFileName));
#endif // CGAMEDLL
			Q_strncpyz(animationPool[i].name, name, sizeof(animationPool[i].name));
			return(&animationPool[i]);
		}
	}

	return NULL;
}

static qboolean BG_RAG_ParseError(int handle, char *format, ...)
{
	int         line;
	char        filename[128];
	va_list     argptr;
	static char string[4096];

	va_start(argptr, format);
	Q_vsnprintf(string, sizeof(string), format, argptr);
	va_end(argptr);

	filename[0] = '\0';
	line        = 0;
	trap_PC_SourceFileAndLine(handle, filename, &line);

	Com_Printf(S_COLOR_RED "ERROR: %s, line %d: %s\n", filename, line, string);

	trap_PC_FreeSource(handle);

	return qfalse;
}

static qboolean BG_RAG_ParseAnimation(int handle, animation_t *animation)
{
	int i;

	animation->flags = 0;

	if (!PC_Int_Parse(handle, &animation->firstFrame))
	{
		return BG_RAG_ParseError(handle, "expected first frame integer");
	}

	if (!PC_Int_Parse(handle, &animation->numFrames))
	{
		return BG_RAG_ParseError(handle, "expected length integer");
	}

	if (!PC_Int_Parse(handle, &animation->loopFrames))
	{
		return BG_RAG_ParseError(handle, "expected looping integer");
	}

	if (!PC_Int_Parse(handle, &i))
	{
		return BG_RAG_ParseError(handle, "expected fps integer");
	}

	if (i == 0)
	{
		i = 1;
	}

	animation->frameLerp   = 1000 / (float)i;
	animation->initialLerp = 1000 / (float)i;

	if (!PC_Int_Parse(handle, &animation->moveSpeed))
	{
		return BG_RAG_ParseError(handle, "expected move speed integer");
	}

	if (!PC_Int_Parse(handle, &animation->animBlend))
	{
		return BG_RAG_ParseError(handle, "expected transition integer");
	}

	if (!PC_Int_Parse(handle, &i))
	{
		return BG_RAG_ParseError(handle, "expected reversed integer");
	}

	if (i == 1)
	{
		animation->flags |= ANIMFL_REVERSED;
	}

	// calculate the duration
	animation->duration = animation->initialLerp
	                      + animation->frameLerp * animation->numFrames
	                      + animation->animBlend;

	// get the nameHash
	animation->nameHash = BG_StringHashValue(animation->name);

	// hacky-ish stuff
	if (!Q_strncmp(animation->name, "climb", 5))
	{
		animation->flags |= ANIMFL_LADDERANIM;
	}

	if (strstr(animation->name, "firing"))
	{
		animation->flags      |= ANIMFL_FIRINGANIM;
		animation->initialLerp = 40;
	}

	return qtrue;
}
コード例 #4
0
ファイル: bg_animgroup.c プロジェクト: morsik/war-territory
static qboolean BG_RAG_ParseAnimFile(int handle, animModelInfo_t *animModelInfo)
{
	pc_token_t token;
#ifdef CGAMEDLL
	qhandle_t mdxFile;
#else
	char mdxFileName[MAX_QPATH];
#endif // CGAMEDLL

	animation_t *animation;

	if (!trap_PC_ReadToken(handle, &token))
	{
		return BG_RAG_ParseError(handle, "expected mdx filename");
	}

#ifdef CGAMEDLL
	if (!(mdxFile = trap_R_RegisterModel(token.string)))
	{
		return BG_RAG_ParseError(handle, "failed to load %s", token.string);
	}
#else
	Q_strncpyz(mdxFileName, token.string, sizeof(mdxFileName));
#endif // CGAMEDLL

	if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "{"))
	{
		return BG_RAG_ParseError(handle, "expected '{'");
	}

	while (1)
	{
		if (!trap_PC_ReadToken(handle, &token))
		{
			return BG_RAG_ParseError(handle, "unexpected EOF");
		}

		if (token.string[0] == '}')
		{
			break;
		}

#ifdef CGAMEDLL
		if (!(animation = BG_RAG_FindFreeAnimation(mdxFile, token.string)))
		{
#else
		if (!(animation = BG_RAG_FindFreeAnimation(mdxFileName, token.string)))
		{
#endif // CGAMEDLL
			return BG_RAG_ParseError(handle, "out of animation storage space");
		}

		Q_strncpyz(animation->name, token.string, sizeof(animation->name));
		Q_strlwr(animation->name);

		if (!BG_RAG_ParseAnimation(handle, animation))
		{
			return qfalse;
		}

		animModelInfo->animations[animModelInfo->numAnimations] = animation;
		animModelInfo->numAnimations++;
	}

	return qtrue;
}

qboolean BG_R_RegisterAnimationGroup(const char *filename, animModelInfo_t *animModelInfo)
{
	pc_token_t token;
	int        handle;

	animModelInfo->numAnimations = 0;
	animModelInfo->footsteps     = FOOTSTEP_NORMAL;
	animModelInfo->gender        = GENDER_MALE;
	animModelInfo->isSkeletal    = qtrue;
	animModelInfo->version       = 3;
	animModelInfo->numHeadAnims  = 0;

	handle = trap_PC_LoadSource(filename);

	if (!handle)
	{
		return qfalse;
	}

	if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "animgroup"))
	{
		return BG_RAG_ParseError(handle, "expected 'animgroup'");
	}

	if (!trap_PC_ReadToken(handle, &token) || Q_stricmp(token.string, "{"))
	{
		return BG_RAG_ParseError(handle, "expected '{'");
	}

	while (1)
	{
		if (!trap_PC_ReadToken(handle, &token))
		{
			break;
		}

		if (token.string[0] == '}')
		{
			break;
		}

		if (!Q_stricmp(token.string, "animfile"))
		{
			if (!BG_RAG_ParseAnimFile(handle, animModelInfo))
			{
				return qfalse;
			}
		}
		else
		{
			return BG_RAG_ParseError(handle, "unknown token '%s'", token.string);
		}
	}

	trap_PC_FreeSource(handle);

	return qtrue;
}
コード例 #5
0
ファイル: bg_animgroup.c プロジェクト: BulldogDrummond/etmod
static qboolean BG_RAG_ParseAnimation(int handle, animation_t *animation)
{
    int i;

    animation->flags = 0;

    if (!PC_Int_Parse(handle, &animation->firstFrame))
    {
        return BG_RAG_ParseError(handle, "expected first frame integer");
    }

    if (!PC_Int_Parse(handle, &animation->numFrames))
    {
        return BG_RAG_ParseError(handle, "expected length integer");
    }

    if (!PC_Int_Parse(handle, &animation->loopFrames))
    {
        return BG_RAG_ParseError(handle, "expected looping integer");
    }

    if (!PC_Int_Parse(handle, &i))
    {
        return BG_RAG_ParseError(handle, "expected fps integer");
    }

    if (i == 0)
    {
        i = 1;
    }

    animation->frameLerp   = 1000 / (float)i;
    animation->initialLerp = 1000 / (float)i;

    if (!PC_Int_Parse(handle, &animation->moveSpeed))
    {
        return BG_RAG_ParseError(handle, "expected move speed integer");
    }

    if (!PC_Int_Parse(handle, &animation->animBlend))
    {
        return BG_RAG_ParseError(handle, "expected transition integer");
    }

    if (!PC_Int_Parse(handle, &i))
    {
        return BG_RAG_ParseError(handle, "expected reversed integer");
    }

    if (i == 1)
    {
        animation->flags |= ANIMFL_REVERSED;
    }

    // calculate the duration
    animation->duration = animation->initialLerp
                          + animation->frameLerp * animation->numFrames
                          + animation->animBlend;

    // get the nameHash
    animation->nameHash = BG_StringHashValue(animation->name);

    // hacky-ish stuff
    if (!Q_strncmp(animation->name, "climb", 5))
    {
        animation->flags |= ANIMFL_LADDERANIM;
    }

    if (strstr(animation->name, "firing"))
    {
        animation->flags      |= ANIMFL_FIRINGANIM;
        animation->initialLerp = 40;
    }

    return qtrue;
}