public static SkeletalModel Res_GetSkybox(World world, Loader.Engine engine_version) { switch(engine_version) { case Loader.Engine.TR2: return world.GetModelByID((uint) TR_ITEM_SKYBOX.TR2); case Loader.Engine.TR3: return world.GetModelByID((uint)TR_ITEM_SKYBOX.TR3); case Loader.Engine.TR4: return world.GetModelByID((uint)TR_ITEM_SKYBOX.TR4); case Loader.Engine.TR5: return world.GetModelByID((uint)TR_ITEM_SKYBOX.TR5); default: return null; } }
public static void TR_GenEntities(World world, Level tr) { for (var i = 0; i < tr.Items.Length; i++) { var trItem = tr.Items[i]; var entity = trItem.ObjectID == 0 ? new Character((uint) i) : new Entity((uint) i); entity.Transform.Origin.X = trItem.Position.X; entity.Transform.Origin.Y = -trItem.Position.Z; entity.Transform.Origin.Z = trItem.Position.Y; entity.Angles.X = trItem.Rotation; entity.Angles.Y = 0; entity.Angles.Z = 0; entity.UpdateTransform(); entity.Self.Room = trItem.Room.IsBetween(0, world.Rooms.Count - 1) ? world.Rooms[trItem.Room] : null; entity.TriggerLayout = (ENTITY_TLAYOUT)trItem.ActivationMash; // FIXME: Ignore INVISIBLE and CLEAR BODY flags for a moment. entity.OCB = trItem.ObjectCodeBit; entity.Timer = 0.0f; entity.Self.CollisionType = COLLISION_TYPE.Kinematic; entity.Self.CollisionShape = COLLISION_SHAPE.TrimeshConvex; entity.MoveType = MoveType.StaticPos; entity.InertiaLinear = 0.0f; entity.InertiaAngular = Vector2.Zero; entity.Bf.Animations.Model = world.GetModelByID((uint)trItem.ObjectID); if(entity.Bf.Animations.Model == null) { var id = EngineLua.Call("getOverridedID", Loader.Helper.GameToEngine(tr.GameVersion), trItem.ObjectID)[0]; entity.Bf.Animations.Model = world.GetModelByID((uint) id); } var replaceAnimId = (int)EngineLua.Call("getOverridedAnim", Loader.Helper.GameToEngine(tr.GameVersion), trItem.ObjectID)[0]; if(replaceAnimId > 0) { var replaceAnimModel = world.GetModelByID((uint)replaceAnimId); var tmp = entity.Bf.Animations.Model.Animations; entity.Bf.Animations.Model.Animations = replaceAnimModel.Animations; replaceAnimModel.Animations = tmp; } if(entity.Bf.Animations.Model == null) { // SPRITE LOADING var sp = world.GetSpriteByID((uint)trItem.ObjectID); if(sp != null && entity.Self.Room != null) { var rsp = new RoomSprite(); rsp.Sprite = sp; rsp.Position = entity.Transform.Origin; rsp.WasRendered = false; entity.Self.Room.Sprites.Add(rsp); } continue; // that entity has no model. may be it is a some trigger or look at object } if(tr.GameVersion < TRGame.TR2 && trItem.ObjectID == 83) // FIXME: brutal magick hardcode! ;-) { // skip PSX save model continue; } entity.Bf.FromModel(entity.Bf.Animations.Model); if(trItem.ObjectID == 0) // Lara is unical model { var lara = (Character) entity; Assert(lara != null); lara.MoveType = MoveType.OnFloor; world.Character = lara; lara.Self.CollisionType = COLLISION_TYPE.Actor; lara.Self.CollisionShape = COLLISION_SHAPE.TrimeshConvex; lara.TypeFlags |= ENTITY_TYPE.TriggerActivator; SkeletalModel LM; EngineLua.Set("player", lara.ID); switch (Loader.Helper.GameToEngine(tr.GameVersion)) { case Loader.Engine.TR1: if (GameflowManager.LevelID == 0) { LM = world.GetModelByID((uint) TR_ITEM_LARA.AlternateTR1); if (LM != null) { // In TR1, Lara has unified head mesh for all her alternate skins. // Hence, we copy all meshes except head, to prevent Potato Raider bug. SkeletonCopyMeshes(world.SkeletalModels[0].MeshTree, LM.MeshTree, world.SkeletalModels[0].MeshCount - 1); } } break; case Loader.Engine.TR3: LM = world.GetModelByID((uint) TR_ITEM_LARA.TR3); if (LM != null) { SkeletonCopyMeshes(world.SkeletalModels[0].MeshTree, LM.MeshTree, world.SkeletalModels[0].MeshCount); var tmp = world.GetModelByID(11); // moto / quadro cycle animations if (tmp != null) { SkeletonCopyMeshes(tmp.MeshTree, LM.MeshTree, world.SkeletalModels[0].MeshCount); } } break; case Loader.Engine.TR4: case Loader.Engine.TR5: LM = world.GetModelByID((uint)TR_ITEM_LARA.TR4_5); // base skeleton meshes if (LM != null) { SkeletonCopyMeshes(world.SkeletalModels[0].MeshTree, LM.MeshTree, world.SkeletalModels[0].MeshCount); } LM = world.GetModelByID((uint)TR_ITEM_LARA.Joints_TR4_5); // skin skeleton meshes if (LM != null) { SkeletonCopyMeshes2(world.SkeletalModels[0].MeshTree, LM.MeshTree, world.SkeletalModels[0].MeshCount); } world.SkeletalModels[0].FillSkinnedMeshMap(); break; case Loader.Engine.Unknown: break; } for (var j = 0; j < lara.Bf.BoneTags.Count; j++) { lara.Bf.BoneTags[j].MeshBase = lara.Bf.Animations.Model.MeshTree[j].MeshBase; lara.Bf.BoneTags[j].MeshSkin = lara.Bf.Animations.Model.MeshTree[j].MeshSkin; lara.Bf.BoneTags[i].MeshSlot = null; } world.Character.SetAnimation(TR_ANIMATION.LaraStayIdle, 0); lara.GenRigidBody(); lara.CreateGhosts(); lara.Height = 768.0f; lara.StateFunc = AnimStateControl.StateControlLara; continue; } entity.SetAnimation(TR_ANIMATION.LaraRun, 0); // Set zero animation and zero frame Res_SetEntityProperties(entity); entity.RebuildBV(); entity.GenRigidBody(); entity.Self.Room.AddEntity(entity); world.AddEntity(entity); } }