void bmodMotionState::getWorldTransform(btTransform &worldTrans) const { if(obj->getEntities()->size() == 0) { worldTrans = btTransform(btQuaternion(0, 0, 0, 1)); return; } edict_t * entity = INDEXENT(obj->getEntities()->front()); worldTrans = btTransform(btQuaternion(0, 0, 0, 1), btVector3(entity->v.origin.x, entity->v.origin.y, entity->v.origin.z)); btVector3 angles; entity->v.angles.CopyToArray(angles.m_floats); EulerMatrix(angles, worldTrans.getBasis()); }
void LoadDockInfo(uint client) { CLIENT_DATA &cd = clients[client]; // How many docking modules do we have? cd.iDockingModules = 0; cd.mapDockedShips.clear(); for (list<EquipDesc>::iterator item = Players[client].equipDescList.equip.begin(); item != Players[client].equipDescList.equip.end(); item++) { if (item->bMounted && item->iArchID == 0xB85AB480) { cd.iDockingModules++; } } // Load docked ships until we run out of docking module space. uint count = HookExt::IniGetI(client, "dock.docked_ships_count"); for (uint i=1; i<=count && cd.mapDockedShips.size()<=cd.iDockingModules; i++) { char key[100]; sprintf(key, "dock.docked_ship.%u", i); wstring charname = HookExt::IniGetWS(client, key); if (charname.length()) { if (HkGetAccountByCharname(charname)) { cd.mapDockedShips[charname] = charname; } } } cd.wscDockedWithCharname = HookExt::IniGetWS(client, "dock.docked_with_charname"); if (cd.wscDockedWithCharname.length()) cd.mobile_docked = true; cd.iLastBaseID = HookExt::IniGetI(client, "dock.last_base"); cd.iCarrierSystem = HookExt::IniGetI(client, "dock.carrier_system"); cd.vCarrierLocation.x = HookExt::IniGetF(client, "dock.carrier_pos.x"); cd.vCarrierLocation.y = HookExt::IniGetF(client, "dock.carrier_pos.y"); cd.vCarrierLocation.z = HookExt::IniGetF(client, "dock.carrier_pos.z"); Vector vRot; vRot.x = HookExt::IniGetF(client, "dock.carrier_rot.x"); vRot.y = HookExt::IniGetF(client, "dock.carrier_rot.y"); vRot.z = HookExt::IniGetF(client, "dock.carrier_rot.z"); cd.mCarrierLocation = EulerMatrix(vRot); }
/* copy entity's position&stuff to rigidbody */ void bmodObject::update() { if(entities.size() == 0) return; //TODO: use getWorldTransform instead! edict_t * entity = INDEXENT(entities.front()); btTransform worldTrans(btQuaternion(0, 0, 0, 1), btVector3(entity->v.origin.x, entity->v.origin.y, entity->v.origin.z)); btVector3 angles; entity->v.angles.CopyToArray(angles.m_floats); EulerMatrix(angles, worldTrans.getBasis()); rigidBody->setWorldTransform(worldTrans); rigidBody->setLinearVelocity(btVector3(entity->v.velocity.x, entity->v.velocity.y, entity->v.velocity.z)); rigidBody->setAngularVelocity(btVector3(entity->v.avelocity.z, -entity->v.avelocity.x, entity->v.avelocity.y) * SIMD_RADS_PER_DEG); }