示例#1
0
        /// <summary>
        /// Should be called when a map is loaded. Sets up visgroups, object ids, gamedata, and textures.
        /// </summary>
        public void PostLoadProcess(GameData.GameData gameData, Func <string, ITexture> textureAccessor, Func <string, float> textureOpacity)
        {
            PartialPostLoadProcess(gameData, textureAccessor, textureOpacity);

            var all = WorldSpawn.FindAll();

            // Set maximum ids
            var maxObjectId = all.Max(x => x.ID);
            var faces       = all.OfType <Solid>().SelectMany(x => x.Faces).ToList();
            var maxFaceId   = faces.Any() ? faces.Max(x => x.ID) : 0;

            IDGenerator.Reset(maxObjectId, maxFaceId);

            // todo visgroups
            // WorldSpawn.ForEach(x => x.IsVisgroupHidden, x => x.IsVisgroupHidden = true, true);

            // Auto visgroup
            var auto      = AutoVisgroup.GetDefaultAutoVisgroup();
            var quickHide = new AutoVisgroup {
                ID = int.MinValue, IsHidden = true, Name = "Autohide", Parent = auto, Visible = false
            };

            auto.Children.Add(quickHide);
            Visgroups.Add(auto);
            UpdateAutoVisgroups(all, false);

            // Purge empty groups
            foreach (var emptyGroup in WorldSpawn.Find(x => x is Group && !x.HasChildren))
            {
                emptyGroup.SetParent(null);
            }
        }
示例#2
0
        //TODO: maybe refactor to use List
        public Matrix GetCamera(GameData.GameData gameData)
        {
            if (cameraMode == CameraMode.StationaryCamera)
            {
                return(StationaryCamera(gameData.camera));
            }

            if (cameraMode == CameraMode.StationaryTrackingObjectCamera)
            {
                //TODO: refactor First()
                return(StationaryTrackingModelCamera(gameData.camera, gameData.models.First().translationVector));
            }

            if (cameraMode == CameraMode.MovingAssociatedWithObjectCamera)
            {
                //TODO: refactor First()
                Vector cameraOffset = new Vector(10, 0, 0);
                return(MovingAssociatedWithObjectCamera(gameData.camera, gameData.models.First().translationVector,
                                                        cameraOffset));
            }

            return(StationaryCamera(gameData.camera));
//            gameData.camera.viewMatrix = gameData.cameras.StationaryTrackingModelCamera(gameData.camera, model.translationVector);
//            Vector cameraOffset = new Vector(10, 0, 0);
//            gameData.camera.viewMatrix =
//                gameData.cameras.MovingAssociatedWithObjectCamera(gameData.camera, model.translationVector,
//                    cameraOffset);
        }
示例#3
0
        public PresetManager(GameData.GameData gameData)
        {
            _gameData = gameData;

            var displayPresetFolder         = PresetFolder;
            var displayPresetTemplateFolder = PresetTemplateFolder;

            // redact user name from log string
            var userName = Environment.UserName;

            if (displayPresetFolder.Contains(userName))
            {
                displayPresetFolder         = displayPresetFolder.Replace(userName, "<redacted>");
                displayPresetTemplateFolder = displayPresetTemplateFolder.Replace(userName, "<redacted>");
            }

            // just make sure the preset dir exists by calling the PresetFolder Property
            Log.Message($"[PrepareLanding] Preset folder is at: {displayPresetFolder}");
            // location of the preset templates, provided de facto with the mod
            Log.Message($"[PrepareLanding] Preset template folder is at: {displayPresetTemplateFolder}");

            CopyFromTemplateFolderToPresetFolder(PresetTemplateFolder, PresetFolder);

            PreloadPresets();
        }
示例#4
0
        //TODO write function which applies(renders) phong lighining on scene
        //TODO: check if whole triangle face is fragment or only single pixels, because it is important in specular lightning, probably one pixel is fragment
        public Color ApplyLightning(GameData.GameData gameData, Color color, Vector fragPosition,
                                    Vector triangleNormal)
        {
            Vector triangleAfterLightningColor = new Vector(0, 0, 0);

            foreach (var lightSource in gameData.lightSources)
            {
                if (lightSource is Flashlight flashlight)
                {
                    if (flashlight.CalculateIfFragmentShouldBeIlluminated(fragPosition))
                    {
                        flashlight.spotDir           = gameData.camera.cameraFront;
                        triangleAfterLightningColor +=
                            ApplyLightning(gameData, color, fragPosition, triangleNormal, lightSource).rgb;
                    }
                }
                else
                {
                    triangleAfterLightningColor +=
                        ApplyLightning(gameData, color, fragPosition, triangleNormal, lightSource).rgb;
                }
            }

            return(new Color(triangleAfterLightningColor));
        }
示例#5
0
        public void RenderModels(PaintEventArgs e, PictureBox gamePictureBox, GameData.GameData gameData /*, Mouse mouse*/) //DEBUG mouse DELETE mouse arguement after dubugging
        {
            foreach (Model model in gameData.models)
            {
                RenderModel(e, gamePictureBox, gameData, model /*, mouse*/);
            }

            algorithms.DepthTesting(gamePictureBox);
        }
示例#6
0
文件: Map.cs 项目: NCC-Lykos/Chisel
        //public void PartialPostLoadProcess(GameData.GameData gameData, Func<string, ITexture> textureAccessor, Func<string, float> textureOpacity)
        public void PartialPostLoadProcess(GameData.GameData gameData,
                                           Func <string, ITexture> textureAccessor,
                                           Func <string, float> textureOpacity,
                                           bool DisableTransparent)
        {
            var objects = WorldSpawn.FindAll();

            Parallel.ForEach(objects, obj =>
            {
                if (obj is Entity)
                {
                    var ent = (Entity)obj;
                    if (ent.GameData == null || !String.Equals(ent.GameData.Name, ent.EntityData.Name, StringComparison.InvariantCultureIgnoreCase))
                    {
                        var gd =
                            gameData.Classes.FirstOrDefault(
                                x => String.Equals(x.Name, ent.EntityData.Name, StringComparison.CurrentCultureIgnoreCase) && x.ClassType != ClassType.Base);
                        ent.GameData = gd;
                        ent.UpdateBoundingBox();
                    }
                }
                else if (obj is Solid)
                {
                    var s    = ((Solid)obj);
                    var disp = HideDisplacementSolids && s.Faces.Any(x => x is Displacement);
                    s.Faces.ForEach(f =>
                    {
                        if (f.Texture.Texture == null)
                        {
                            f.Texture.Texture = textureAccessor(f.Texture.Name.ToLowerInvariant());
                            f.AlignTexture();
                        }
                        if (disp && !(f is Displacement))
                        {
                            f.Texture.Opacity = 0;
                        }
                        else if (f.Texture.Texture != null)
                        {
                            //NOTE(SVK):Seems Chisel exepects some special char in WAD file texture name for transparancy.
                            //RF functions differntly so disable
                            //f.Opacity = textureOpacity(f.Texture.Name.ToLowerInvariant());
                            //if (!HideNullTextures && f.Opacity < 0.1) f.Opacity = 1;
                            if (DisableTransparent)
                            {
                                f.Texture.Opacity = 1;
                            }
                        }
                    });
                }
            });
        }
示例#7
0
        void RenderModel(PaintEventArgs e, PictureBox gamePictureBox, GameData.GameData gameData, Model model /*, Mouse mouse*/) //DEBUG mouse DELETE mouse arguement after dubugging
        {
            phi += 0.05;

            model.rotationAngle  = phi;
            model.rotationVector = new Vector(0, 0, 1);
//            model.translationVector.z = phi;
//            gameData.player.translationVector.z = phi;
            model.modelMatrix = model.Transform();

            gameData.camera.viewMatrix = gameData.cameras.GetCamera(gameData);

            DrawModelTriangles(e, gamePictureBox, gameData, model);

            Debug.PrintDebugGameData(e.Graphics, gameData /*, mouse*/);
        }
示例#8
0
        public static GameData.GameData ProcessKeyPress(GameData.GameData gameData, KeyPressEventArgs e)
        {
            GameData.GameData processedGameData = gameData;
            if (e.KeyChar == 'w')
            {
                processedGameData.camera.cameraPosition = gameData.camera.cameraPosition + gameData.camera.cameraSpeed * gameData.camera.cameraFront;
//                processedGameData.player.translationVector =
//                    gameData.player.translationVector + 0.1 * new Vector(-1,0,0,1);
            }
            else if (e.KeyChar == 's')
            {
                processedGameData.camera.cameraPosition = gameData.camera.cameraPosition - gameData.camera.cameraSpeed * gameData.camera.cameraFront;
            }
            else if (e.KeyChar == 'a')
            {
                processedGameData.camera.cameraPosition = gameData.camera.cameraPosition - gameData.camera.cameraSpeed *
                                                          gameData.camera.cameraFront.CrossProduct(gameData.camera.upAxis).Normalize();
            }
            else if (e.KeyChar == 'd')
            {
                processedGameData.camera.cameraPosition = gameData.camera.cameraPosition + gameData.camera.cameraSpeed *
                                                          gameData.camera.cameraFront.CrossProduct(gameData.camera.upAxis).Normalize();
            }
            else if (e.KeyChar == '1')
            {
                gameData.cameras.cameraMode = CameraMode.StationaryCamera;
            }
            else if (e.KeyChar == '2')
            {
                gameData.cameras.cameraMode = CameraMode.StationaryTrackingObjectCamera;
            }
            else if (e.KeyChar == '3')
            {
                gameData.cameras.cameraMode = CameraMode.MovingAssociatedWithObjectCamera;
            }
            else if (e.KeyChar == 'p')
            {
                //TODO Phong shading or lightning here
            }
            else if (e.KeyChar == 'g')
            {
                //TODO Gourand shading here
            }

            return(processedGameData);
//            return gameData.camera.cameraPosition;
        }
示例#9
0
        //TODO: implement fragShader and vertexShader
        //TODO: bug with rendering is probably here (because when model is behind it should not be drawn)
        void DrawModelTriangles(PaintEventArgs e, PictureBox gamePictureBox, GameData.GameData gameData, Model model)
        {
            foreach (Triangle triangle in model.triangles)
            {
                //TODO: fix tirangle.verticec[0] because it is not fragPosition probably
                //TODO: maybe fragposiotion should be 3D vector
                Vector fragPosition = model.modelMatrix * triangle.vertices[2].position;
//                Vector triangleNormal = model.modelMatrix * triangle.vertices[1].normal.Cast3DVectorTo4D();
                Vector triangleNormal = model.modelMatrix * triangle.firstVertex.normal.Cast3DVectorTo4D();
                //Backface Culling
                if (BackfaceCulling(fragPosition, gameData.camera.cameraPosition, triangleNormal))
                {
                    Vector p1e = Projection.ProjectionMatrix * gameData.camera.viewMatrix * model.modelMatrix *
                                 triangle.firstVertex.position;
                    Vector p2e = Projection.ProjectionMatrix * gameData.camera.viewMatrix * model.modelMatrix *
                                 triangle.secondVertex.position;
                    Vector p3e = Projection.ProjectionMatrix * gameData.camera.viewMatrix * model.modelMatrix *
                                 triangle.thirdVertex.position;

//                    Algorithms.ProjectedTriangle projectedTriangle = new Algorithms.ProjectedTriangle(p1e, p2e, p3e);
//                    projectedTriangle = projectedTriangle.ProjectTriangle(gamePictureBox.Width, gamePictureBox.Height);
                    Algorithms.ProjectedTriangle projectedTriangle = new Algorithms.ProjectedTriangle(p1e, p2e, p3e, triangle.color);
                    //TODO: refactor
                    Tuple <Algorithms.ProjectedTriangle, bool> returnedValue = projectedTriangle.ProjectTriangle(gamePictureBox.Width, gamePictureBox.Height);
                    projectedTriangle = returnedValue.Item1;

                    //TODO: refactor
                    if (returnedValue.Item2)
                    {
                        var col =
                            Lightning.Lightning.ApplyLightning(gameData, triangle.color, fragPosition, triangleNormal);
                        Color triangleColor = col;

                        algorithms.ScanLineFillVertexSort(e, projectedTriangle, gameData, triangleColor);
                    }
                }

//                e.Graphics.DrawLine(Pens.Black, (float)p1_x_prim, (float)p1_y_prim, (float)p2_x_prim, (float)p2_y_prim);
//                e.Graphics.DrawLine(Pens.Black, (float)p1_x_prim, (float)p1_y_prim, (float)p3_x_prim, (float)p3_y_prim);
//                e.Graphics.DrawLine(Pens.Black, (float)p2_x_prim, (float)p2_y_prim, (float)p3_x_prim, (float)p3_y_prim);
//
//                MyDrawLine(e, Pens.Black, (float)p1_x_prim, (float)p1_y_prim, (float)p2_x_prim, (float)p2_y_prim);
//                MyDrawLine(e, Pens.Black, (float)p1_x_prim, (float)p1_y_prim, (float)p3_x_prim, (float)p3_y_prim);
//                MyDrawLine(e, Pens.Black, (float)p2_x_prim, (float)p2_y_prim, (float)p3_x_prim, (float)p3_y_prim);
            }
        }
示例#10
0
        public void PartialPostLoadProcess(GameData.GameData gameData, Func <string, ITexture> textureAccessor, Func <string, float> textureOpacity)
        {
            var objects = WorldSpawn.FindAll();

            Parallel.ForEach(objects, obj =>
            {
                if (obj is Entity)
                {
                    var ent = (Entity)obj;
                    if (ent.GameData == null || !String.Equals(ent.GameData.Name, ent.EntityData.Name, StringComparison.InvariantCultureIgnoreCase))
                    {
                        var gd =
                            gameData.Classes.FirstOrDefault(
                                x => String.Equals(x.Name, ent.EntityData.Name, StringComparison.CurrentCultureIgnoreCase) && x.ClassType != ClassType.Base);
                        ent.GameData = gd;
                        ent.UpdateBoundingBox();
                    }
                }
                else if (obj is Solid)
                {
                    var s    = ((Solid)obj);
                    var disp = HideDisplacementSolids && s.Faces.Any(x => x is Displacement);
                    s.Faces.ForEach(f =>
                    {
                        if (f.Texture.Texture == null)
                        {
                            f.Texture.Texture = textureAccessor(f.Texture.Name.ToLowerInvariant());
                            f.CalculateTextureCoordinates(true);
                        }
                        if (disp && !(f is Displacement))
                        {
                            f.Opacity = 0;
                        }
                        else if (f.Texture.Texture != null)
                        {
                            f.Opacity = textureOpacity(f.Texture.Name.ToLowerInvariant());
                            if (!HideNullTextures && f.Opacity < 0.1)
                            {
                                f.Opacity = 1;
                            }
                        }
                    });
                }
            });
        }
示例#11
0
        //TODO: delete this function probably
        private Color ApplyLightning(GameData.GameData gameData, Color color, Vector fragPosition,
                                     Vector triangleNormal, LightSource lightSource)
        {
//            return new Color((ApplyAmbientLightning(triangle, lightSource) /*+
//                ApplyDiffuseLightning(triangle, fragPosition, triangleNormal, lightSource) +
//                ApplySpecularLightning(triangle, gameData.camera.cameraPosition, fragPosition,
//                    triangleNormal)*/).rgb /*.Normalize(2)*/);

//            return new Color((ApplyAmbientLightning(color, lightSource) +
//                              ApplyDiffuseLightning(color, fragPosition, triangleNormal, lightSource) +
//                              ApplySpecularLightning(gameData.camera.cameraPosition, fragPosition,
//                                  triangleNormal, lightSource)).rgb.Normalize());


            return(new Color(ApplyAmbientLightning(color, lightSource).rgb.Normalize()));

//            return new Color(ApplyDiffuseLightning(color, fragPosition, triangleNormal, lightSource).rgb
//                .Normalize());
            return(new Color(ApplySpecularLightning(gameData.camera.cameraPosition, fragPosition,
                                                    triangleNormal, lightSource).rgb.Normalize()));
        }
示例#12
0
        public static void PrintDebugGameData(Graphics graphics, GameData.GameData gameData /*, Mouse mouse*/)
        {
            using (Font myFont = new Font("Arial", fontSize))
            {
                graphics.DrawString("Model Position " + gameData.models[0].translationVector, myFont, Brushes.Red, debugStringPlacementPoints[0]);
                graphics.DrawString("Model Scale " + gameData.models[0].scaleVector, myFont, Brushes.Yellow, debugStringPlacementPoints[1]);
                graphics.DrawString("Model Rotation " + gameData.models[0].rotationVector, myFont, Brushes.Pink, debugStringPlacementPoints[2]);

                graphics.DrawString("Camera Position " + gameData.camera.cameraPosition, myFont, Brushes.Green, debugStringPlacementPoints[3]);
                graphics.DrawString("Camera Front" + gameData.camera.cameraFront, myFont, Brushes.Teal, debugStringPlacementPoints[4]);
                graphics.DrawString("Camera Up Axis" + gameData.camera.upAxis, myFont, Brushes.White, debugStringPlacementPoints[5]);
                graphics.DrawString("Camera Yaw = " + NoDataMessage /*mouse.yaw*/, myFont, Brushes.Lime, debugStringPlacementPoints[6]);
                graphics.DrawString("Camera Pitch = " + NoDataMessage /*mouse.pitch*/, myFont, Brushes.Cyan, debugStringPlacementPoints[7]);

                PrintFps(graphics, gameData, myFont);

                graphics.DrawString("First Vertex Normal = " + gameData.player.triangles[0].firstVertex.normal, myFont, Brushes.Cyan, debugStringPlacementPoints[15]);
                graphics.DrawString("Second Vertex Normal = " + gameData.player.triangles[0].secondVertex.normal, myFont, Brushes.Cyan, debugStringPlacementPoints[16]);
                graphics.DrawString("Third Vertex Normal = " + gameData.player.triangles[0].thirdVertex.normal, myFont, Brushes.Cyan, debugStringPlacementPoints[17]);
            }
        }
示例#13
0
 public Preset(string presetName, GameData.GameData gameData)
 {
     PresetName = presetName;
     _gameData  = gameData;
     PresetInfo = new PresetInfo();
 }
示例#14
0
 protected Overlay(GameData.GameData gameData)
 {
     GameData = gameData;
 }
示例#15
0
//        public static Color ApplyLightning(ILightningModel lightningModel, GameData.GameData gameData ,Triangle triangle, Vector fragPosition)
//        {
//            return lightningModel.ApplyLightning(gameData, triangle, fragPosition);
//        }

        public static Color ApplyLightning(GameData.GameData gameData, Color triangleColor, Vector fragPosition, Vector triangleNormal)
        {
            return(gameData.lightningModel.ApplyLightning(gameData, triangleColor, fragPosition, triangleNormal));
        }
示例#16
0
        private static void PrintFps(Graphics graphics, GameData.GameData gameData, Font myFont)
        {
            double fps = CalculateFps();

            graphics.DrawString("FPS = " + fps, myFont, Brushes.Goldenrod, debugStringPlacementPoints[8]);
        }
示例#17
0
 public TemperatureOverlay(GameData.GameData gameData) : base(gameData)
 {
 }