void CG_RunTestEmitter() { if ( cg_testEmitter.getStr()[0] == 0 || cg_testEmitter.getStr()[0] == '0' ) { CG_FreeTestEmitter(); return; } class particleDeclAPI_i* pDecl = g_declMgr->registerParticleDecl( cg_testEmitter.getStr() ); if ( pDecl == 0 ) { CG_FreeTestEmitter(); return; } if ( cg_testEmitterInstance == 0 ) { cg_testEmitterInstance = new emitterD3_c; rf->addCustomRenderObject( cg_testEmitterInstance ); cg_testEmitterInstance->setOrigin( cg.refdefViewOrigin + cg.refdefViewAxis.getForward()*cg_testEmitter_cameraDistance.getFloat() ); } else { if ( cg_testEmitter_attachToCamera.getInt() ) { cg_testEmitterInstance->setOrigin( cg.refdefViewOrigin + cg.refdefViewAxis.getForward()*cg_testEmitter_cameraDistance.getFloat() ); } } cg_testEmitterInstance->setParticleDecl( pDecl ); }
void CG_RunViewModel() { if ( cg_printViewWeaponClipSize.getInt() ) { if ( cg.snap ) { g_core->Print( "ViewWeapon clip %i/%i\n", cg.snap->ps.viewWeaponCurClipSize, cg.snap->ps.viewWeaponMaxClipSize ); } } int viewModelEntity = cg.snap->ps.curWeaponEntNum; if ( cg_thirdPerson.integer ) { CG_FreeViewModelEntity(); if ( viewModelEntity != ENTITYNUM_NONE && cg_entities[viewModelEntity].rEnt ) { cg_entities[viewModelEntity].rEnt->showModel(); } return; } if ( viewModelEntity == ENTITYNUM_NONE ) { CG_FreeViewModelEntity(); return; } if ( cg_entities[viewModelEntity].rEnt ) { //cg_entities[viewModelEntity].rEnt->hideModel(); cg_entities[viewModelEntity].rEnt->setThirdPersonOnly( true ); } // local weapons offset (affected by cg_gunX/Y/Z cvars) vec3_c localOfs( 0, 0, 0 ); // local weapon rotation (affected by cg_gunRotX/Y/Z cvars) vec3_c localRot( 0, 0, 0 ); rModelAPI_i* viewModel; if ( cg.snap->ps.customViewRModelIndex ) { viewModel = cgs.gameModels[cg.snap->ps.customViewRModelIndex]; } else { if ( cg_entities[viewModelEntity].rEnt ) { viewModel = cg_entities[viewModelEntity].rEnt->getModel(); } else { viewModel = 0; } } if ( viewModel == 0 ) { CG_FreeViewModelEntity(); return; } // add hardcoded gun offset if ( !stricmp( viewModel->getName(), "models/weapons2/plasma/plasma.md3" ) || !stricmp( viewModel->getName(), "models/weapons2/railgun/railgun.md3" ) || !stricmp( viewModel->getName(), "models/weapons2/rocketl/rocketl.md3" ) || !stricmp( viewModel->getName(), "models/weapons2/shotgun/shotgun.md3" ) // it could be better for grenade launcher || !stricmp( viewModel->getName(), "models/weapons2/grenadel/grenadel.md3" ) ) { localOfs.set( 5, -5, -10 ); } else if ( !stricmp( viewModel->getName(), "models/weapons/w_physics.mdl" ) ) { // Half Life2 physgun (for weapon_physgun) // "w_*" is a worldmodel // set 90 yaw rotation (around Z axis) localRot.set( 0, 0, 90 ); localOfs.set( 5, -5, -10 ); } else if ( !stricmp( viewModel->getName(), "models/weapons/v_physcannon.mdl" ) ) { // "v_*" is a viewmodel #if 0 localRot.set( 0, 15, 90 ); localOfs.set( -35, 0, -50 ); #else localRot.set( 0, 0, 90 ); localOfs.set( -15, 0, -65 ); #endif } else { localRot = cg.snap->ps.viewModelAngles; localOfs = cg.snap->ps.viewModelOffset; if ( viewModel->isDeclModel() ) { localOfs += viewModel->getDeclModelAPI()->getOffset(); } } //g_core->Print("Player velocity: %f %f %f\n",cg.snap->ps.velocity.x,cg.snap->ps.velocity.y,cg.snap->ps.velocity.z); // calculate viewmodel bobbing offset based on player velocity viewModelMovement.setConfig( viewModelMovementConfig ); viewModelMovement.calcViewModelOffset( cg.snap->ps.isOnGround(), cg.snap->ps.velocity, cg.refdefViewAngles, cg.frametime * 0.001f ); const vec3_c& currentMovement = viewModelMovement.getCurrentMovement(); localOfs += currentMovement; if ( cg_printViewModelBobbingOffset.getInt() ) { g_core->Print( "Viewmodel bobbing movement: %f %f %f\n", currentMovement.x, currentMovement.y, currentMovement.z ); } if ( cg_printCurViewModelName.getInt() ) { g_core->Print( "Current viewmodel name: %s\n", viewModel->getName() ); } if ( cg_printCurViewModelAnimationCount.getInt() ) { g_core->Print( "Current viewmodel animation count: %i\n", viewModel->getNumAnims() ); } if ( cg_printCurViewModelBoneNames.getInt() ) { g_core->Print( "Current viewmodel %s bonenames:\n", viewModel->getName() ); viewModel->printBoneNames(); } CG_AllocViewModelEntity(); vec3_c origin = cg.refdefViewOrigin; vec3_c angles = cg.refdefViewAngles; // apply extra gun offset localOfs.x += cg_gunX.getFloat(); localOfs.y += cg_gunY.getFloat(); localOfs.z += cg_gunZ.getFloat(); // apply extra gun rotation localRot.x += cg_gunRotX.getFloat(); localRot.y += cg_gunRotY.getFloat(); localRot.z += cg_gunRotZ.getFloat(); if ( localRot.isNull() == false ) { matrix_c m; m.fromAngles( angles ); m.rotateX( localRot.x ); m.rotateY( localRot.y ); m.rotateZ( localRot.z ); angles = m.getAngles(); } // add local offset to hand origin origin.vectorMA( origin, cg.refdefViewAxis[0], localOfs.x ); origin.vectorMA( origin, cg.refdefViewAxis[1], localOfs.y ); origin.vectorMA( origin, cg.refdefViewAxis[2], localOfs.z ); // always update viewmodel position cg_viewModelEntity->setOrigin( origin ); cg_viewModelEntity->setAngles( angles ); cg_viewModelEntity->setFirstPersonOnly( true ); // set viewmodel model //rModelAPI_i *viewModel = rf->registerModel("models/testweapons/xrealMachinegun/machinegun_view.md5mesh"); cg_viewModelEntity->setModel( viewModel ); int viewModelAnimFlags; if ( stricmp( cg_forceViewModelAnimationFlags.getStr(), "none" ) ) { viewModelAnimFlags = cg_forceViewModelAnimationFlags.getInt(); } else { viewModelAnimFlags = cg.snap->ps.viewModelAnimFlags; } if ( stricmp( cg_forceViewModelAnimationIndex.getStr(), "none" ) ) { int index = cg_forceViewModelAnimationIndex.getInt(); cg_viewModelEntity->setDeclModelAnimLocalIndex( index, viewModelAnimFlags ); } else if ( stricmp( cg_forceViewModelAnimationName.getStr(), "none" ) ) { const char* animName = cg_forceViewModelAnimationName.getStr(); cg_viewModelEntity->setAnim( animName, viewModelAnimFlags ); } else { const char* animName = CG_ConfigString( CS_ANIMATIONS + cg.snap->ps.viewModelAnim ); if ( cg_printViewModelAnimName.getInt() ) { g_core->Print( "ViewModelAnim: %s, flags %i\n", animName, viewModelAnimFlags ); } if ( cg_viewModelEntity->hasAnim( animName ) ) { cg_viewModelEntity->setAnim( animName, viewModelAnimFlags ); } else { g_core->RedWarning( "ViewModel has no animation %s\n", animName ); } } }