int CGameStudioModelRenderer::_StudioDrawPlayer(int flags, entity_state_t *pplayer) { m_pCurrentEntity = IEngineStudio.GetCurrentEntity(); IEngineStudio.GetTimes(&m_nFrameCount, &m_clTime, &m_clOldTime); IEngineStudio.GetViewInfo(m_vRenderOrigin, m_vUp, m_vRight, m_vNormal); IEngineStudio.GetAliasScale(&m_fSoftwareXScale, &m_fSoftwareYScale); m_nPlayerIndex = pplayer->number - 1; if (m_nPlayerIndex < 0 || m_nPlayerIndex >= gEngfuncs.GetMaxClients()) return 0; m_pRenderModel = IEngineStudio.SetupPlayerModel(m_nPlayerIndex); if (m_pRenderModel == NULL) return 0; m_pStudioHeader = (studiohdr_t *)IEngineStudio.Mod_Extradata(m_pRenderModel); IEngineStudio.StudioSetHeader(m_pStudioHeader); IEngineStudio.SetRenderModel(m_pRenderModel); if (m_pCurrentEntity->curstate.sequence >= m_pStudioHeader->numseq) m_pCurrentEntity->curstate.sequence = 0; if (pplayer->sequence >= m_pStudioHeader->numseq) pplayer->sequence = 0; if (m_pCurrentEntity->curstate.gaitsequence >= m_pStudioHeader->numseq) m_pCurrentEntity->curstate.gaitsequence = 0; if (pplayer->gaitsequence >= m_pStudioHeader->numseq) pplayer->gaitsequence = 0; if (pplayer->gaitsequence) { vec3_t orig_angles; m_pPlayerInfo = IEngineStudio.PlayerInfo(m_nPlayerIndex); VectorCopy(m_pCurrentEntity->angles, orig_angles); StudioProcessGait(pplayer); m_pPlayerInfo->gaitsequence = pplayer->gaitsequence; m_pPlayerInfo = NULL; StudioSetUpTransform(0); VectorCopy(orig_angles, m_pCurrentEntity->angles); } else { m_pCurrentEntity->curstate.controller[0] = 127; m_pCurrentEntity->curstate.controller[1] = 127; m_pCurrentEntity->curstate.controller[2] = 127; m_pCurrentEntity->curstate.controller[3] = 127; m_pCurrentEntity->latched.prevcontroller[0] = m_pCurrentEntity->curstate.controller[0]; m_pCurrentEntity->latched.prevcontroller[1] = m_pCurrentEntity->curstate.controller[1]; m_pCurrentEntity->latched.prevcontroller[2] = m_pCurrentEntity->curstate.controller[2]; m_pCurrentEntity->latched.prevcontroller[3] = m_pCurrentEntity->curstate.controller[3]; m_pPlayerInfo = IEngineStudio.PlayerInfo(m_nPlayerIndex); CalculatePitchBlend(pplayer); CalculateYawBlend(pplayer); m_pPlayerInfo->gaitsequence = 0; StudioSetUpTransform(0); } if (flags & STUDIO_RENDER) { (*m_pModelsDrawn)++; (*m_pStudioModelCount)++; if (m_pStudioHeader->numbodyparts == 0) return 1; } m_pPlayerInfo = IEngineStudio.PlayerInfo(m_nPlayerIndex); StudioSetupBones(); StudioSaveBones(); m_pPlayerInfo->renderframe = m_nFrameCount; m_pPlayerInfo = NULL; if (flags & STUDIO_EVENTS && (!(flags & STUDIO_RENDER) || !pplayer->weaponmodel || !WeaponHasAttachments(pplayer))) { StudioCalcAttachments(); IEngineStudio.StudioClientEvents(); if (m_pCurrentEntity->index > 0) { cl_entity_t *ent = gEngfuncs.GetEntityByIndex(m_pCurrentEntity->index); memcpy(ent->attachment, m_pCurrentEntity->attachment, sizeof(vec3_t) * 4); } } if (flags & STUDIO_RENDER) { alight_t lighting; vec3_t dir; lighting.plightvec = dir; IEngineStudio.StudioDynamicLight(m_pCurrentEntity, &lighting); IEngineStudio.StudioEntityLight(&lighting); IEngineStudio.StudioSetupLighting(&lighting); m_pPlayerInfo = IEngineStudio.PlayerInfo(m_nPlayerIndex); m_nTopColor = m_pPlayerInfo->topcolor; if (m_nTopColor < 0) m_nTopColor = 0; if (m_nTopColor > 360) m_nTopColor = 360; m_nBottomColor = m_pPlayerInfo->bottomcolor; if (m_nBottomColor < 0) m_nBottomColor = 0; if (m_nBottomColor > 360) m_nBottomColor = 360; IEngineStudio.StudioSetRemapColors(m_nTopColor, m_nBottomColor); StudioRenderModel(dir); m_pPlayerInfo = NULL; if (pplayer->weaponmodel) { studiohdr_t *saveheader = m_pStudioHeader; cl_entity_t saveent = *m_pCurrentEntity; model_t *pweaponmodel = IEngineStudio.GetModelByIndex(pplayer->weaponmodel); m_pStudioHeader = (studiohdr_t *)IEngineStudio.Mod_Extradata(pweaponmodel); IEngineStudio.StudioSetHeader(m_pStudioHeader); StudioMergeBones(pweaponmodel); IEngineStudio.StudioSetupLighting(&lighting); StudioRenderModel(dir); StudioCalcAttachments(); if (m_pCurrentEntity->index > 0) memcpy(saveent.attachment, m_pCurrentEntity->attachment, sizeof(vec3_t) * m_pStudioHeader->numattachments); *m_pCurrentEntity = saveent; m_pStudioHeader = saveheader; IEngineStudio.StudioSetHeader(m_pStudioHeader); if (flags & STUDIO_EVENTS) IEngineStudio.StudioClientEvents(); } } if( cl_shadows->value != 0.0f ) { StudioDrawShadow(m_pCurrentEntity->origin, 20.0f); } return 1; }
/* ==================== _StudioDrawPlayer ==================== */ int CGameStudioModelRenderer::_StudioDrawPlayer(int flags, entity_state_t *pplayer) { alight_t lighting; vec3_t dir; m_pCurrentEntity = IEngineStudio.GetCurrentEntity(); IEngineStudio.GetTimes(&m_nFrameCount, &m_clTime, &m_clOldTime); IEngineStudio.GetViewInfo(m_vRenderOrigin, m_vUp, m_vRight, m_vNormal); IEngineStudio.GetAliasScale(&m_fSoftwareXScale, &m_fSoftwareYScale); m_nPlayerIndex = pplayer->number - 1; if(m_nPlayerIndex < 0 || m_nPlayerIndex >= gEngfuncs.GetMaxClients()) return 0; m_pRenderModel = IEngineStudio.SetupPlayerModel(m_nPlayerIndex); if(m_pRenderModel == NULL) return 0; m_pStudioHeader = (studiohdr_t *)IEngineStudio.Mod_Extradata(m_pRenderModel); IEngineStudio.StudioSetHeader(m_pStudioHeader); IEngineStudio.SetRenderModel(m_pRenderModel); if(pplayer->gaitsequence) { vec3_t orig_angles; m_pPlayerInfo = IEngineStudio.PlayerInfo(m_nPlayerIndex); VectorCopy(m_pCurrentEntity->angles, orig_angles); StudioProcessGait(pplayer); m_pPlayerInfo->gaitsequence = pplayer->gaitsequence; m_pPlayerInfo = NULL; StudioSetUpTransform(0); VectorCopy(orig_angles, m_pCurrentEntity->angles); } else { m_pCurrentEntity->curstate.controller[0] = 127; m_pCurrentEntity->curstate.controller[1] = 127; m_pCurrentEntity->curstate.controller[2] = 127; m_pCurrentEntity->curstate.controller[3] = 127; m_pCurrentEntity->latched.prevcontroller[0] = m_pCurrentEntity->curstate.controller[0]; m_pCurrentEntity->latched.prevcontroller[1] = m_pCurrentEntity->curstate.controller[1]; m_pCurrentEntity->latched.prevcontroller[2] = m_pCurrentEntity->curstate.controller[2]; m_pCurrentEntity->latched.prevcontroller[3] = m_pCurrentEntity->curstate.controller[3]; m_pPlayerInfo = IEngineStudio.PlayerInfo(m_nPlayerIndex); m_pPlayerInfo->gaitsequence = 0; StudioSetUpTransform(0); } if(flags & STUDIO_RENDER) { // see if the bounding box lets us trivially reject, also sets if(!IEngineStudio.StudioCheckBBox()) return 0; (*m_pModelsDrawn)++; (*m_pStudioModelCount)++; // render data cache cookie if(m_pStudioHeader->numbodyparts == 0) return 1; } m_pPlayerInfo = IEngineStudio.PlayerInfo(m_nPlayerIndex); StudioSetupBones(); StudioSaveBones(); m_pPlayerInfo->renderframe = m_nFrameCount; m_pPlayerInfo = NULL; if(flags & STUDIO_EVENTS) { StudioCalcAttachments(); IEngineStudio.StudioClientEvents(); // copy attachments into global entity array if(m_pCurrentEntity->index > 0) { cl_entity_t *ent = gEngfuncs.GetEntityByIndex(m_pCurrentEntity->index); memcpy(ent->attachment, m_pCurrentEntity->attachment, sizeof(vec3_t) * 4); } } if(flags & STUDIO_RENDER) { /* if (m_pCvarHiModels->value && m_pRenderModel != m_pCurrentEntity->model ) { // show highest resolution multiplayer model m_pCurrentEntity->curstate.body = 255; } if (!(m_pCvarDeveloper->value == 0 && gEngfuncs.GetMaxClients() == 1 ) && ( m_pRenderModel == m_pCurrentEntity->model ) ) { m_pCurrentEntity->curstate.body = 1; // force helmet } */ lighting.plightvec = dir; IEngineStudio.StudioDynamicLight(m_pCurrentEntity, &lighting); IEngineStudio.StudioEntityLight(&lighting); // model and frame independant IEngineStudio.StudioSetupLighting(&lighting); m_pPlayerInfo = IEngineStudio.PlayerInfo(m_nPlayerIndex); // get remap colors m_nTopColor = m_pPlayerInfo->topcolor; if(m_nTopColor < 0) m_nTopColor = 0; if(m_nTopColor > 360) m_nTopColor = 360; m_nBottomColor = m_pPlayerInfo->bottomcolor; if(m_nBottomColor < 0) m_nBottomColor = 0; if(m_nBottomColor > 360) m_nBottomColor = 360; IEngineStudio.StudioSetRemapColors(m_nTopColor, m_nBottomColor); StudioRenderModel(); m_pPlayerInfo = NULL; if(pplayer->weaponmodel) { cl_entity_t saveent = *m_pCurrentEntity; model_t *pweaponmodel = IEngineStudio.GetModelByIndex(pplayer->weaponmodel); m_pStudioHeader = (studiohdr_t *)IEngineStudio.Mod_Extradata(pweaponmodel); IEngineStudio.StudioSetHeader(m_pStudioHeader); StudioMergeBones(pweaponmodel); IEngineStudio.StudioSetupLighting(&lighting); StudioRenderModel(); StudioCalcAttachments(); *m_pCurrentEntity = saveent; } } return 1; }