Beispiel #1
0
        public static SkyBox Generate(Texture2D horizon, float repetionsX, DepthCueMode depthCueMode)
        {
            if (horizon == null)
            {
                Color c;
                if (depthCueMode ==  DepthCueMode.Dark)
                    c = new Color(0, 0, 0);
                else if (depthCueMode == DepthCueMode.Fog)
                    c = Color.WhiteSmoke;
                else
                    throw new NotImplementedException();
                horizon = new Texture2D(Engine.Device, 1, 1, 1, TextureUsage.None, SurfaceFormat.Color);
                horizon.SetData<Color>(new Color[] { c });  //top left pixel
            }

            Color[] pixels = new Color[horizon.Width * horizon.Height];
            horizon.GetData<Color>(pixels);

            Texture2D topTexture = new Texture2D(Engine.Device, 1, 1, 1, TextureUsage.None, SurfaceFormat.Color);
            topTexture.SetData<Color>(new Color[] { pixels[0] });  //top left pixel

            Texture2D bottomTexture = new Texture2D(Engine.Device, 1, 1, 1, TextureUsage.None, SurfaceFormat.Color);
            bottomTexture.SetData<Color>(new Color[] { pixels[pixels.Length - 1] }); //bottom right pixel

            Texture2D sideTexture = new Texture2D(Engine.Device, horizon.Width, horizon.Height, 1, TextureUsage.None, SurfaceFormat.Color);
            int ptr = 0;
            Color[] flippedPixels = new Color[pixels.Length];
            for (int h = 0; h < horizon.Height; h++)
            {
                for (int w = 0; w < horizon.Width; w++)
                {
                    flippedPixels[ptr] = pixels[h * horizon.Width + (horizon.Width - w) - 1];
                    ptr++;
                }
            }
            sideTexture.SetData<Color>(flippedPixels);

            SkyBox skyBox = new SkyBox(repetionsX);
            skyBox.Textures[0] = horizon;
            skyBox.Textures[1] = horizon;
            skyBox.Textures[2] = bottomTexture;
            skyBox.Textures[3] = topTexture;
            skyBox.Textures[4] = sideTexture;
            skyBox.Textures[5] = sideTexture;
            return skyBox;
        }
Beispiel #2
0
        public Race(string filename, string playerVehicleFile)
        {
            Race.Current = this;

            Logger.Log("Starting race " + Path.GetFileName(filename));

            ConfigFile = new RaceFile(filename);

            foreach (string matFileName in ConfigFile.MaterialFiles)
            {
                MatFile matFile = new MatFile(matFileName);
                ResourceCache.Add(matFile);
            }

            foreach (string pixFileName in ConfigFile.PixFiles)
            {
                PixFile pixFile = new PixFile(pixFileName);
                ResourceCache.Add(pixFile);
            }

            if (GameVars.Emulation == EmulationMode.Demo)
                ResourceCache.Add(new CMaterial("drkcurb.mat", 226)); //demo doesn't have this file, I guess the color is hard-coded
            else
                ResourceCache.Add(new MatFile("drkcurb.mat"));

            ResourceCache.ResolveMaterials();

            if (filename.Contains("TESTMAP")) //nasty hack...
                GameVars.Scale.Y *= 0.5f;

            DatFile modelFile = new DatFile(ConfigFile.ModelFile);

            ActFile actFile = new ActFile(ConfigFile.ActorFile);
            _actors = actFile.Hierarchy;
            _actors.AttachModels(modelFile.Models);
            _actors.ResolveTransforms(false, ConfigFile.Grooves);

            if (filename.Contains("TESTMAP")) //nasty hack...
                GameVars.Scale.Y *= 2f;

            // link the actors and grooves
            foreach (BaseGroove g in ConfigFile.Grooves)
                g.SetActor(_actors.GetByName(g.ActorName));

            // link the funks and materials
            foreach (BaseFunk f in ConfigFile.Funks)
            {
                f.Resolve();
            }

            if (ConfigFile.SkyboxTexture != "none")
            {
                PixFile horizonPix = new PixFile(ConfigFile.SkyboxTexture);
                _skybox = SkyboxGenerator.Generate(horizonPix.PixMaps[0].Texture, ConfigFile.SkyboxRepetitionsX - 3f, ConfigFile.DepthCueMode);
                _skybox.HeightOffset = -220 + ConfigFile.SkyboxPositionY * 1.5f;
            }

            Physics.TrackProcessor.GenerateTrackActor(ConfigFile, _actors, out _nonCars);

            Logger.Log("NonCars: " + _nonCars.Count);

            GridPlacer.Reset();

            List<int> opponentIds = new List<int>();
            List<int> pickedNbrs = new List<int>();
            for (int i = 0; i < 5; i++)
            {
                int index = 0;
                while (true)
                {
                    index = Engine.Random.Next(1, OpponentsFile.Instance.Opponents.Count);
                    if (!pickedNbrs.Contains(index))
                    {
                        pickedNbrs.Add(index);
                        break;
                    }
                }
                try
                {
                    Opponents.Add(new Opponent(OpponentsFile.Instance.Opponents[index].FileName, ConfigFile.GridPosition, ConfigFile.GridDirection));
                    NbrOpponents++;
                }
                catch(Exception ex)
                {
                    Logger.Log("Error while loading opponent " + OpponentsFile.Instance.Opponents[index].FileName + ", " + ex.Message);
                }
            }

            foreach (CopStartPoint point in ConfigFile.CopStartPoints)
            {
                Opponents.Add(new Opponent(point.IsSpecialForces ? "bigapc.txt" : "apc.txt", point.Position, 0, new CopDriver()));
            }

            foreach (Opponent o in Opponents) Drivers.Add(o.Driver);

            OpponentController.Nodes = ConfigFile.OpponentPathNodes;

            PlayerVehicle = new Vehicle(GameVars.BasePath + @"cars\" + playerVehicleFile, new PlayerDriver());
            PlayerVehicle.PlaceOnGrid(ConfigFile.GridPosition, ConfigFile.GridDirection);
            Drivers.Add(PlayerVehicle.Driver);

            Peds = new PedestrianController(ConfigFile.Peds);
            _map = new RaceMap(this);

            RaceTime = new RaceTimeController();

            PhysX.Instance.Scene.SetActorGroupPairFlags(PhysXConsts.TrackId, PhysXConsts.VehicleId, ContactPairFlag.Forces | ContactPairFlag.OnStartTouch | ContactPairFlag.OnTouch);
            PhysX.Instance.Scene.SetActorGroupPairFlags(PhysXConsts.VehicleId, PhysXConsts.NonCarId, ContactPairFlag.Forces | ContactPairFlag.OnStartTouch | ContactPairFlag.OnTouch);
            PhysX.Instance.Scene.SetActorGroupPairFlags(PhysXConsts.TrackId, PhysXConsts.NonCarId, ContactPairFlag.OnTouch);
            PhysX.Instance.Scene.SetActorGroupPairFlags(PhysXConsts.VehicleId, PhysXConsts.VehicleId, ContactPairFlag.Forces | ContactPairFlag.OnTouch | ContactPairFlag.OnStartTouch | ContactPairFlag.OnEndTouch);
        }