Ejemplo n.º 1
0
        //--------------------------------------
        // PUBLIC CONSTRUCTORS
        //--------------------------------------

        /// <summary>Initializes a new environment map.</summary>
        /// <param name="renderer">The renderer to use when rendering the environment maps.</param>
        /// <param name="eid">The id of the entity to which the environment map belongs.</param>
        /// <param name="transf">The transform component of the entity to environment map.</param>
        /// <param name="material">The effect to use as material. Normally this should be set to a cube
        ///                        map shader.</param>
        /// <param name="skybox">The skybox renderer.</param>
        public EnvMapMaterial(RenderingSystem renderer,
                              int eid,
                              CTransform transf,
                              Effect material,
                              SkyBoxSystem skybox = null)
            : base(material)
        {
            mEid      = eid;
            mRenderer = renderer;
            mTransf   = transf;
            mSkybox   = skybox;

            var device = Game1.Inst.GraphicsDevice;

            for (var i = 0; i < 6; i++)
            {
                mEnvRTs[i] = new RenderTarget2D(device,
                                                512,
                                                512,
                                                false,
                                                device.PresentationParameters.BackBufferFormat,
                                                DepthFormat.None,
                                                1,
                                                RenderTargetUsage.PreserveContents); // TODO: Needed?
            }

            var bumpTex = Game1.Inst.Content.Load <Texture2D>("Textures/Bumpmap0");

            mEffect.Parameters["BumpMap"].SetValue(bumpTex);
        }
        //--------------------------------------
        // PUBLIC METHODS
        //--------------------------------------

        /// <summary>Initializes the scene.</summary>
        public override void Init()
        {
            AddSystems(new                    LogicSystem(),
                       new                  PhysicsSystem(),
                       new                   CameraSystem(),
                       mSkybox   = new SkyBoxSystem(),
                       mRenderer = new RenderingSystem());

#if DEBUG
            AddSystem(new DebugOverlay());
#endif

            base.Init();

            InitCam();

            // Spawn a few balls.
            for (var i = 0; i < 10; i++)
            {
                CreateBall(new Vector3(0.9f * i - 3.5f, 0.3f * i, 0.0f), // Position
                           new Vector3(1.0f, 0.0f, 0.0f),                // Velocity
                           1.0f);                                        // Radius
            }

            mRT = GfxUtil.CreateRT();

            mDistortFX = Game1.Inst.Content.Load <Effect>("Effects/Distort");
            mDistortFX.Parameters["SrcTex"].SetValue(mRT);
        }
Ejemplo n.º 3
0
 /// <summary>Initializes a new environment map.</summary>
 /// <param name="renderer">The renderer to use when rendering the environment maps.</param>
 /// <param name="eid">The id of the entity to which the environment map belongs.</param>
 /// <param name="transf">The transform component of the entity to environment map.</param>
 /// <param name="skybox">The skybox renderer.</param>
 public EnvMapMaterial(RenderingSystem renderer,
                       int eid,
                       CTransform transf,
                       SkyBoxSystem skybox = null)
     : this(renderer, eid, transf, Game1.Inst.Content.Load <Effect>("Effects/CubeMap"), skybox)
 {
 }
Ejemplo n.º 4
0
 /// <summary>Initializes a new environment map.</summary>
 /// <param name="renderer">The renderer to use when rendering the environment maps.</param>
 /// <param name="eid">The id of the entity to which the environment map belongs.</param>
 /// <param name="transf">The transform component of the entity to environment map.</param>
 public EnvMapMaterial(RenderingSystem renderer,
                       int eid,
                       CTransform transf,
                       Texture2D bumpTex = null)
     : this(renderer, eid, transf, Game1.Inst.Content.Load <Effect>("Effects/CubeMap"), bumpTex)
 {
 }
        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // Create game systems
            InputSystem           = new InputSystem(this);
            NetworkSystem         = new NetworkSystem(this);
            RenderingSystem       = new RenderingSystem(this);
            MovementSystem        = new MovementSystem(this);
            WeaponSystem          = new WeaponSystem(this);
            EnemyAISystem         = new EnemyAISystem(this);
            NpcAISystem           = new NpcAISystem(this);
            GarbagemanSystem      = new GarbagemanSystem(this);
            CollisionSystem       = new Systems.CollisionSystem(this);
            RoomChangingSystem    = new RoomChangingSystem(this);
            QuestLogSystem        = new QuestLogSystem(this);
            SpriteAnimationSystem = new SpriteAnimationSystem(this);
            SkillSystem           = new SkillSystem(this);
            TextSystem            = new TextSystem(this);


            // Testing code.
            LevelManager.LoadContent();
            LevelManager.LoadLevel("D01F01R01");
            //End Testing Code
        }
Ejemplo n.º 6
0
        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // Create game systems
            InputSystem              = new InputSystem(this);
            NetworkSystem            = new NetworkSystem(this);
            RenderingSystem          = new RenderingSystem(this);
            MovementSystem           = new MovementSystem(this);
            WeaponSystem             = new WeaponSystem(this);
            EnemyAISystem            = new EnemyAISystem(this);
            NpcAISystem              = new NpcAISystem(this);
            GarbagemanSystem         = new GarbagemanSystem(this);
            CollisionSystem          = new Systems.CollisionSystem(this);
            RoomChangingSystem       = new RoomChangingSystem(this);
            QuestLogSystem           = new QuestLogSystem(this);
            SpriteAnimationSystem    = new SpriteAnimationSystem(this);
            SkillSystem              = new SkillSystem(this);
            TextSystem               = new TextSystem(this);
            EngineeringOffenseSystem = new EngineeringOffenseSystem(this);
            HUDSystem = new HUDSystem(this);

            InputHelper.Load();
            HUDSystem.LoadContent();

            // Testing code.
            LevelManager.LoadContent();
            LevelManager.LoadLevel("D01F01R01");
            //Song bg = Content.Load<Song>("Audio/Main_Loop");
            //MediaPlayer.Stop();
            //MediaPlayer.IsRepeating = true;
            //MediaPlayer.Play(bg);
            //End Testing Code
        }
Ejemplo n.º 7
0
        protected override void Initialize()
        {
            base.Initialize();

            Tasks.TaskQueue = new ThreadPoolTaskQueue(8);

            var dm = graphics.GraphicsDevice.DisplayMode;

            Window.Position = new Point((dm.Width - Width) / 2, (dm.Height - Height) / 2);

            renderUtil = new RenderUtil(GraphicsDevice);

            renderingSystem = new RenderingSystem(Content);
            entityFactory   = new EntityFactory(renderingSystem, entityWorld);

            inputSystem = new InputSystem(eventBus);

            AddSystem(renderingSystem);
            AddSystem(new VelocitySystem());
            AddSystem(new CollisionSystem());
            AddSystem(new CollisionResolverSystem());
            AddSystem(new HudSystem());
            AddSystem(new PlayerControllerSystem());
            AddSystem(new BoundsSystem(Width / 2 - 250, Height / 2 - 250, 500, 500, renderUtil));
        }
        //--------------------------------------
        // PUBLIC METHODS
        //--------------------------------------

        /// <summary>Initializes the scene.</summary>
        public override void Init()
        {
            AddSystems(new LogicSystem(),
                       new PhysicsSystem()
            {
                Gravity = Vector3.Zero
            },
                       new CameraSystem(),
                       mSkybox   = new SkyBoxSystem(),
                       mRenderer = new RenderingSystem(),

                       new InputSystem());

#if DEBUG
            AddSystem(new DebugOverlay());
#endif

            base.Init();

            InitCam();

            // Spawn a few balls.
            for (var i = 0; i < 30; i++)
            {
                var r = i == 0 ? 6.0f : 1.0f;
                CreateBall(new Vector3(0.9f * i - 3.5f, 0.3f * i, 0.7f * i), // Position
                           new Vector3(0f, 0f, 0f),                          // Velocity
                           r,                                                // Radius
                           i == 0);                                          // Reflective
            }
        }
Ejemplo n.º 9
0
        //--------------------------------------
        // PUBLIC METHODS
        //--------------------------------------

        /// <summary>Initializes the scene.</summary>
        public override void Init()
        {
            AddSystems(new                    LogicSystem(),
                       new                  PhysicsSystem()
            {
                Gravity = Vector3.Zero
            },
                       mRenderer = new RenderingSystem());

#if DEBUG
            AddSystem(new DebugOverlay());
#endif

            base.Init();

            mCamID = InitCam();

            // Spawn a few balls.
            for (var i = 0; i < 2; i++)
            {
                var r = i == 0 ? 6.0f : 1.0f;
                CreateBall(new Vector3(0.9f * i - 3.5f, 0.3f * i, 0.7f * i), // Position
                           new Vector3(3.0f * (i - 4), 2.0f * i, 3.0f - i),  // Velocity
                           r,                                                // Radius
                           i == 0);                                          // Reflective
            }
        }
Ejemplo n.º 10
0
 void Setup()
 {
     creationSystem  = new ParticleCreationSystem(world, this, ParticleMesh, ParticleMaterial);
     anchorSystem    = new AnchorMoveSystem(world);
     moveSystem      = new ParticleMoveSystem(world);
     velocitySystem  = new ApplyVelocitySystem(world);
     transformSystem = new TransformWriteSystem(world);
     renderSystem    = new RenderingSystem(world);
 }
Ejemplo n.º 11
0
        private void ResetGame()
        {
            ComponentManager.Get().ClearComponents();

            renderingSystem          = new RenderingSystem();
            physicsSystem            = new PhysicsSystem();
            collisionDetectionSystem = new CollisionDetectionSystem();
            inputSystem = new InputSystem();
            spawnSystem = new SpawnSystem();
            textSystem  = new TextSystem();
            CreateEntities();
        }
Ejemplo n.º 12
0
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            renderingSystem          = new RenderingSystem();
            physicsSystem            = new PhysicsSystem();
            collisionDetectionSystem = new CollisionDetectionSystem();
            inputSystem = new InputSystem();
            spawnSystem = new SpawnSystem();
            textSystem  = new TextSystem();
            scoreSystem = new ScoreSystem();
        }
Ejemplo n.º 13
0
        /// <summary>
        /// LoadContent will be called once per game and is the place to load
        /// all of your content.
        /// </summary>
        protected override void LoadContent()
        {
            // Create a new SpriteBatch, which can be used to draw textures.
            spriteBatch = new SpriteBatch(GraphicsDevice);

            // Create game systems
            InputSystem     = new InputSystem(this);
            NetworkSystem   = new NetworkSystem(this);
            RenderingSystem = new RenderingSystem(this);
            MovementSystem  = new MovementSystem(this);

            // Testing code
            AggregateFactory.CreateFromAggregate(Aggregate.FairyPlayer);
        }
Ejemplo n.º 14
0
        private void Initialize()
        {
            audioManager = new AudioManager();
            renderer     = new ImmediateModeRenderer();
            sprites      = new List <Sprite>();
            sources      = new List <Source>();
            entities     = new List <Entity>();

            string script = "";

            using (StreamReader file = new StreamReader("Assets/Scripts/movement_script.lua"))
            {
                script = file.ReadToEnd();
            }

            Entity entity = new Entity(0);

            entity.AddComponent(new Position(0, 0));
            entity.AddComponent(new Input(new KeyboardAndMouse()));
            entity.AddComponent(new Velocity(0, 0));
            entity.AddComponent(new SpriteComponent(new Sprite(0, 0, 20, 20, SceneManager.AssetManager.LoadTexture("Assets/Images/heart.png"))));
            entity.AddComponent(new Player());
            entities.Add(entity);

            for (int i = 1; i < 2000; i++)
            {
                entity = new Entity(i);
                entity.AddComponent(new Position(i * 40, 0));
                entity.AddComponent(new Velocity(0, 1));
                //entity.AddComponent(new SpriteComponent(new Sprite(0, 0, 20, 20, SceneManager.AssetManager.LoadTexture("Assets/Images/heart.png"))));
                entity.AddComponent(new Rain());
                entities.Add(entity);
            }

            movementSystem   = new MovementSystem();
            scriptingSystem  = new ScriptingSystem();
            renderingSystem  = new RenderingSystem(renderer);
            inputSystem      = new InputSystem();
            collisionSystem  = new CollisionSystem();
            collisionHandler = new CollisionHandler();

            sources.Add(new Source(SceneManager.AssetManager.LoadWave("Assets/Audio/main game.wav")));
            sources[0].Play();
            sources[0].SetPosition(350, 200);
            sources[0].ReferenceDistance = 200f;
            //sources[0].SetVelocity(0, 0);
        }
Ejemplo n.º 15
0
        public MapViewport(int width, int height) : base(GameConstants.MapWidth, GameConstants.MapHeight)
        {
            Engine.ActiveConsole = this;
            Engine.UseMouse      = true;

            Engine.Keyboard.RepeatDelay        = 0.07f;
            Engine.Keyboard.InitialRepeatDelay = 0.1f;

            TextSurface.RenderArea = new Microsoft.Xna.Framework.Rectangle(0, 0, width, height);

            Fill(null, Colors.DefaultBG, null);

            renderer = new RenderingSystem(this);

            map = new MapSystem(GameConstants.MapWidth, GameConstants.MapHeight);
            //ComponentManager.AddComponent( EntityManager.Map, map );
        }
Ejemplo n.º 16
0
        bool CreateRenderTarget()
        {
            DestroyRenderTarget();

            if (EngineApp.Instance == null)
            {
                return(false);
            }

            Vector2I size = new Vector2I(ClientRectangle.Size.Width, ClientRectangle.Size.Height);

            if (size.X < 1 || size.Y < 1)
            {
                return(false);
            }

            renderWindow = RenderingSystem.CreateRenderWindow(Handle, size);
            if (renderWindow == null)
            {
                return(false);
            }

            viewport = renderWindow.AddViewport(true, true);
            viewport.MousePositionSetImpl     = MousePositionSet;
            viewport.MouseRelativeModeSetImpl = MouseRelativeModeSet;

            ViewportCreated?.Invoke(this);

            //apply DpiScaleFactor to canvas default font size
            var defaultSize = 0.017;

            try
            {
                defaultSize *= DpiHelper.Default.DpiScaleFactor;
            }
            catch { }
            viewport.CanvasRenderer.DefaultFontSize = defaultSize;
            //viewport.CanvasRenderer.DefaultFontSize = 0.02 * DpiHelper.Default.DpiScaleFactor;
            //var fontHeight = viewport.CanvasRenderer.DefaultFontSize * DpiHelper.Default.DpiScaleFactor;
            //viewport.CanvasRenderer.DefaultFont = EngineFontManager.Instance.LoadFont( "Default", fontHeight );
            //if( viewport.CanvasRenderer.DefaultFont == null )
            //	viewport.CanvasRenderer.DefaultFont = EngineFontManager.Instance.LoadFont( "Default", "English", fontHeight );

            return(true);
        }
Ejemplo n.º 17
0
        public World(Game game, Renderer renderer)
        {
            this.Game     = game;
            this.Renderer = renderer;

            Entities        = new SparseArray <Entity>();
            Transformations = new SparseArray <Transformation>();
            Primitives      = new SparseArray <Primitive>();
            Newtonians      = new SparseArray <Newtonian>();
            Models          = new SparseArray <Microsoft.Xna.Framework.Graphics.Model>();
            Players         = new SparseArray <Player>();
            PlayerControls  = new SparseArray <PlayerControl>();

            newtonianSystem = new NewtonianSystem(this);
            renderingSystem = new RenderingSystem(this, renderer);
            networkSystem   = new NetworkSystem(this);
            inputSystem     = new InputManager(this);
        }
Ejemplo n.º 18
0
        static void Main(string[] args)
        {
            var resourcesSystem = new ResourcesSystem();
            var renderingSystem = new RenderingSystem();
            var inputSystem     = new InputSystem();
            var timeSystem      = new TimeSystem();

            resourcesSystem.Setup();
            timeSystem.Setup();
            inputSystem.Setup();
            renderingSystem.Setup(inputSystem, resourcesSystem);
            while (true)
            {
                timeSystem.Update();
                renderingSystem.Update();
                inputSystem.Update();
            }
        }
Ejemplo n.º 19
0
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            graphics.IsFullScreen              = true;
            graphics.PreferredBackBufferWidth  = 800;
            graphics.PreferredBackBufferHeight = 480;
            graphics.SupportedOrientations     = DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight;

            renderingSystem          = new RenderingSystem();
            physicsSystem            = new PhysicsSystem();
            collisionDetectionSystem = new CollisionDetectionSystem();
            inputSystem = new InputSystem();
            spawnSystem = new SpawnSystem();
            textSystem  = new TextSystem();
            scoreSystem = new ScoreSystem();
        }
Ejemplo n.º 20
0
        public void TestRenderingSystem()
        {
            var state = new GameState();

            for (int i = 0; i < NUMBER_OF_ENTITIES; ++i)
            {
                //state.Textures[i] =
                state.GameData.Transforms[i] = new Transform(new Vector2(50.0f, 600.0f), 0.0f, new Vector2(1.0f), new Vector2(16.0f, 16.0f));

                state.EntityCount++;
            }

            Console.WriteLine($"Number of entities: {state.EntityCount}");
            for (int i = 1; i < 33; ++i)
            {
                var system = new RenderingSystem("Rendering", state);
                RunSystem(system, i);
            }
            state.ClearState();
        }
Ejemplo n.º 21
0
        public static GameContext GetIngameContext(NamelessGame game)
        {
            if (IngameContext != null)
            {
                return(IngameContext);
            }
            else
            {
                var systems = new List <ISystem>();
                systems.Add(new InputSystem(new IngameKeyIntentTraslator(), game));
                systems.Add(new IngameIntentSystem());
                systems.Add(new AiSystem());
                systems.Add(new TurnManagementSystem());
                systems.Add(new CombatSystem());
                systems.Add(new InventorySystem());
                systems.Add(new SwitchSystem());
                systems.Add(new DamageHandlingSystem());
                systems.Add(new DeathSystem());
                systems.Add(new HudSystem());
                systems.Add(new ChunkManagementSystem());

                var renderingSystem = new RenderingSystem(game.GetSettings());
                var uiSystem        = new UIRenderSystem();

                // create and init the UI manager
                UiFactory.CreateHud(game);

                IngameContext = new GameContext(systems, new List <ISystem>()
                {
                    uiSystem, renderingSystem
                },
                                                UiFactory.HudInstance);

                return(IngameContext);
            }
        }
        //--------------------------------------
        // PUBLIC METHODS
        //--------------------------------------

        /// <summary>Initializes the scene.</summary>
        public override void Init()
        {
            AddSystems(new                    LogicSystem(),
                       new                  PhysicsSystem(),
                       new                   CameraSystem(),
                       mRenderer = new RenderingSystem());

#if DEBUG
            AddSystem(new DebugOverlay());
#endif

            base.Init();

            InitCam();

            // Spawn a few balls.
            for (var i = 0; i < 10; i++)
            {
                var r = 1.0f;                                            // TODO: Random size and mass.
                CreateBall(new Vector3(0.9f * i - 3.5f, 0.3f * i, 0.0f), // Position
                           new Vector3(1.0f, 0.0f, 0.0f),                // Velocity
                           r);                                           // Reflective
            }
        }
Ejemplo n.º 23
0
        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            graphics.PreferredBackBufferWidth  = 1920;
            graphics.PreferredBackBufferHeight = 1080;
            IsMouseVisible = true;

            Content.RootDirectory = "Content";

            var gameStateManager = new GameStateManager(this);

            //gameStateManager.AddGameState(new GameplayState());
            gameStateManager.AddGameState(new LastMinuteGame());

            Components.Add(gameStateManager);

            var bs = new BehaviorSystem(this, gameStateManager);

            Components.Add(bs);

            var rs = new RenderingSystem(this, gameStateManager);

            Components.Add(rs);
        }
        protected override void Viewport_UpdateBeforeOutput(Viewport viewport)
        {
            base.Viewport_UpdateBeforeOutput(viewport);

            if (Mesh != null && needResultCompile)
            {
                Mesh.ResultCompile();
                needResultCompile = false;
            }

            if (Mesh != null && Mesh.Result != null)
            {
                var meshBounds  = Mesh.Result.SpaceBounds;
                var selectedLOD = GetSelectedLOD();

                //center axes
                if (Mesh.EditorDisplayPivot)
                {
                    var sizeInPixels = 35 * DpiHelper.Default.DpiScaleFactor;
                    var size         = viewport.Simple3DRenderer.GetThicknessByPixelSize(Vector3.Zero, sizeInPixels);
                    //var size3 = meshBounds.CalculatedBoundingBox.GetSize();
                    //var size = Math.Max( size3.X, Math.Max( size3.Y, size3.Z ) ) / 20;

                    var thickness  = size / 20;
                    var headHeight = size / 3;
                    var headRadius = headHeight / 3;
                    var alpha      = 1.0;               // 0.5;

                    //viewport.Simple3DRenderer.SetColor( new ColorValue( 1, 0, 0, alpha ), false, true );
                    //viewport.Simple3DRenderer.AddLine( Vector3.Zero, Vector3.XAxis * size );
                    //viewport.Simple3DRenderer.SetColor( new ColorValue( 0, 1, 0, alpha ), false, true );
                    //viewport.Simple3DRenderer.AddLine( Vector3.Zero, Vector3.YAxis * size );
                    //viewport.Simple3DRenderer.SetColor( new ColorValue( 0, 0, 1, alpha ), false, true );
                    //viewport.Simple3DRenderer.AddLine( Vector3.Zero, Vector3.ZAxis * size );

                    viewport.Simple3DRenderer.SetColor(new ColorValue(1, 0, 0, alpha), false);                        //, true );
                    viewport.Simple3DRenderer.AddArrow(Vector3.Zero, Vector3.XAxis * size, headHeight, headRadius, true, thickness);
                    viewport.Simple3DRenderer.SetColor(new ColorValue(0, 1, 0, alpha), false);                        //, true );
                    viewport.Simple3DRenderer.AddArrow(Vector3.Zero, Vector3.YAxis * size, headHeight, headRadius, true, thickness);
                    viewport.Simple3DRenderer.SetColor(new ColorValue(0, 0, 1, alpha), false);                        //, true );
                    viewport.Simple3DRenderer.AddArrow(Vector3.Zero, Vector3.ZAxis * size, headHeight, headRadius, true, thickness);
                }

                //vertex color
                if (Mesh.EditorDisplayVertexColor)
                {
                    var vertices = new Simple3DRenderer.Vertex[selectedLOD.ExtractedVertices.Length];
                    for (int n = 0; n < vertices.Length; n++)
                    {
                        var sourceVertex = selectedLOD.ExtractedVertices[n];

                        var vertex = new Simple3DRenderer.Vertex();
                        vertex.position = sourceVertex.Position;

                        vertex.color = RenderingSystem.ConvertColorValue(ref sourceVertex.Color);
                        //vertex.color = sourceVertex.Color;

                        //vertex.colorInvisibleBehindObjects = sourceVertex.color;
                        vertices[n] = vertex;
                    }

                    viewport.Simple3DRenderer.AddTriangles(vertices, selectedLOD.ExtractedIndices, false, true);
                }

                //triangles
                if (Mesh.EditorDisplayTriangles)
                {
                    //!!!!цвета настраивать в опциях
                    viewport.Simple3DRenderer.SetColor(new ColorValue(0, 0, 1, 0.7));
                    //viewport.DebugGeometry.SetColor( new ColorValue( 0, 0, 1, 0.3 ) );
                    viewport.Simple3DRenderer.AddTriangles(selectedLOD.ExtractedVerticesPositions, selectedLOD.ExtractedIndices, true, false);
                }

                //vertices
                if (Mesh.EditorDisplayVertices)
                {
                    var size3 = meshBounds.CalculatedBoundingBox.GetSize();
                    var scale = (float)Math.Max(size3.X, Math.Max(size3.Y, size3.Z)) / 200;
                    viewport.Simple3DRenderer.SetColor(new ColorValue(1, 0, 0, 0.7));
                    //viewport.DebugGeometry.SetColor( new ColorValue( 0, 1, 0, 0.7 ) );
                    foreach (var vertex in selectedLOD.ExtractedVerticesPositions)
                    {
                        viewport.Simple3DRenderer.AddLineThin(vertex - new Vector3F(scale, 0, 0), vertex + new Vector3F(scale, 0, 0));
                        viewport.Simple3DRenderer.AddLineThin(vertex - new Vector3F(0, scale, 0), vertex + new Vector3F(0, scale, 0));
                        viewport.Simple3DRenderer.AddLineThin(vertex - new Vector3F(0, 0, scale), vertex + new Vector3F(0, 0, scale));
                    }
                }

                //normals
                if (Mesh.EditorDisplayNormals)
                {
                    var size3 = meshBounds.CalculatedBoundingBox.GetSize();
                    var scale = (float)Math.Max(size3.X, Math.Max(size3.Y, size3.Z)) / 30;
                    viewport.Simple3DRenderer.SetColor(new ColorValue(0, 1, 0, 0.7));
                    foreach (var vertex in selectedLOD.ExtractedVertices)
                    {
                        if (vertex.Normal != Vector3F.Zero)
                        {
                            viewport.Simple3DRenderer.AddLineThin(vertex.Position, vertex.Position + vertex.Normal * scale);
                        }
                    }
                }

                //tangents
                if (Mesh.EditorDisplayTangents)
                {
                    var size3 = meshBounds.CalculatedBoundingBox.GetSize();
                    var scale = (float)Math.Max(size3.X, Math.Max(size3.Y, size3.Z)) / 30;
                    viewport.Simple3DRenderer.SetColor(new ColorValue(1, 0, 0, 0.7));
                    foreach (var vertex in selectedLOD.ExtractedVertices)
                    {
                        if (vertex.Tangent != Vector4F.Zero)
                        {
                            viewport.Simple3DRenderer.AddLineThin(vertex.Position, vertex.Position + vertex.Tangent.ToVector3F() * scale);
                        }
                    }
                }

                //binormals
                if (Mesh.EditorDisplayBinormals)
                {
                    var size3 = meshBounds.CalculatedBoundingBox.GetSize();
                    var scale = (float)Math.Max(size3.X, Math.Max(size3.Y, size3.Z)) / 30;
                    viewport.Simple3DRenderer.SetColor(new ColorValue(0, 0, 1, 0.7));
                    foreach (var vertex in selectedLOD.ExtractedVertices)
                    {
                        if (vertex.Normal != Vector3F.Zero && vertex.Tangent != Vector4F.Zero)
                        {
                            var v = Vector3.Cross(vertex.Tangent.ToVector3F(), vertex.Normal) * vertex.Tangent.W;
                            viewport.Simple3DRenderer.AddLineThin(vertex.Position, vertex.Position + v * scale);
                        }
                    }
                }

                //collision
                if (Mesh.EditorDisplayCollision)
                {
                    var collision = Mesh.GetComponent("Collision Definition") as Component_RigidBody;
                    if (collision != null)
                    {
                        ColorValue color = new ColorValue(0, 0, 1, 0.7);
                        //if( MotionType.Value == MotionTypeEnum.Static )
                        //	color = ProjectSettings.Get.SceneShowPhysicsStaticColor;
                        //else if( rigidBody.IsActive )
                        //	color = ProjectSettings.Get.SceneShowPhysicsDynamicActiveColor;
                        //else
                        //	color = ProjectSettings.Get.SceneShowPhysicsDynamicInactiveColor;
                        viewport.Simple3DRenderer.SetColor(color, color * ProjectSettings.Get.HiddenByOtherObjectsColorMultiplier);

                        int verticesRendered = 0;
                        foreach (var shape in collision.GetComponents <Component_CollisionShape>(false, true, true))
                        {
                            shape.Render(viewport, Transform.Identity, false, ref verticesRendered);
                        }
                    }
                }

                //update PlayAnimation
                if (!string.IsNullOrEmpty(Mesh.EditorPlayAnimation))
                {
                    var animation = Mesh.ParentRoot.GetComponentByPath(Mesh.EditorPlayAnimation) as Component_Animation;
                    skeletonAnimationController.PlayAnimation = animation;
                    //viewport.CanvasRenderer.AddText( animation != null ? animation.ToString() : "null", new Vec2( .5, .5 ) );
                }
                else
                {
                    skeletonAnimationController.PlayAnimation = null;
                }

                //skeleton
                if (Mesh.EditorDisplaySkeleton)
                {
                    var skeleton = Mesh.Skeleton.Value;
                    if (skeleton != null)
                    {
                        var color = new ColorValue(0, 0.5, 1, 0.7);
                        viewport.Simple3DRenderer.SetColor(color, color * ProjectSettings.Get.HiddenByOtherObjectsColorMultiplier);

                        var skeletonArrows = skeletonAnimationController.GetCurrentAnimatedSkeletonArrows();
                        if (skeletonArrows != null)
                        {
                            foreach (var arrow in skeletonArrows)
                            {
                                viewport.Simple3DRenderer.AddArrow(arrow.Start, arrow.End);
                            }
                        }
                        else
                        {
                            foreach (var bone in skeleton.GetBones())
                            {
                                var pos    = bone.Transform.Value.Position;
                                var parent = bone.Parent as Component_SkeletonBone;
                                if (parent != null)
                                {
                                    var from = parent.Transform.Value.Position;

                                    viewport.Simple3DRenderer.AddArrow(from, pos);
                                }
                            }
                        }
                    }
                }

                //bounds
                if (Mesh.EditorDisplayBounds)
                {
                    viewport.Simple3DRenderer.SetColor(new ColorValue(1, 1, 0, 0.7));
                    //viewport.DebugGeometry.SetColor( new ColorValue( 1, 1, 0, 0.5 ) );
                    if (meshBounds.BoundingBox.HasValue)
                    {
                        viewport.Simple3DRenderer.AddBounds(meshBounds.BoundingBox.Value);
                    }
                    if (meshBounds.BoundingSphere.HasValue)
                    {
                        viewport.Simple3DRenderer.AddSphere(meshBounds.BoundingSphere.Value);
                    }
                }

                //select triangle
                int triangleIndex = -1;
                if (!viewport.MouseRelativeMode)
                {
                    var ray = viewport.CameraSettings.GetRayByScreenCoordinates(viewport.MousePosition);
                    if (selectedLOD.RayCast(ray, Component_Mesh.CompiledData.RayCastMode.BruteforceNoCache, false, out double scale2, out int triangleIndex2))
                    {
                        triangleIndex = triangleIndex2;
                    }
                }

                //selected triangle data
                if (triangleIndex != -1)
                {
                    var vertices = selectedLOD.ExtractedVertices;
                    var indices  = selectedLOD.ExtractedIndices;

                    int      index0       = indices[triangleIndex * 3 + 0];
                    int      index1       = indices[triangleIndex * 3 + 1];
                    int      index2       = indices[triangleIndex * 3 + 2];
                    var      showVertices = new int[] { index0, index1, index2 };
                    Vector3F p0           = vertices[index0].Position;
                    Vector3F p1           = vertices[index1].Position;
                    Vector3F p2           = vertices[index2].Position;

                    ////draw connected triangles
                    //{
                    //	ESet<Vector3I> triangles = new ESet<Vector3I>();

                    //	//find triangles with indexes
                    //	for( int nTriangle = 0; nTriangle < indices.Length / 3; nTriangle++ )
                    //	{
                    //		var i0 = indices[ nTriangle * 3 + 0 ];
                    //		var i1 = indices[ nTriangle * 3 + 1 ];
                    //		var i2 = indices[ nTriangle * 3 + 2 ];

                    //		int c = 0;
                    //		if( index0 == i0 || index1 == i0 || index2 == i0 )
                    //			c++;
                    //		if( index0 == i1 || index1 == i1 || index2 == i1 )
                    //			c++;
                    //		if( index0 == i2 || index1 == i2 || index2 == i2 )
                    //			c++;

                    //		//if( index0 == i0 || index0 == i1 || index0 == i2 ||
                    //		//	index1 == i0 || index1 == i1 || index1 == i2 ||
                    //		//	index2 == i0 || index2 == i1 || index2 == i2 )
                    //		if( c == 2 )
                    //		{
                    //			Vector3I triangle = new Vector3I( i0, i1, i2 );
                    //			if( triangle[ 1 ] < triangle[ 0 ] ) { var v = triangle[ 0 ]; triangle[ 0 ] = triangle[ 1 ]; triangle[ 1 ] = v; }
                    //			if( triangle[ 2 ] < triangle[ 0 ] ) { var v = triangle[ 0 ]; triangle[ 0 ] = triangle[ 2 ]; triangle[ 2 ] = v; }
                    //			if( triangle[ 2 ] < triangle[ 1 ] ) { var v = triangle[ 1 ]; triangle[ 1 ] = triangle[ 2 ]; triangle[ 2 ] = v; }

                    //			triangles.AddWithCheckAlreadyContained( triangle );
                    //		}
                    //	}

                    //	foreach( var triangle in triangles )
                    //	{
                    //		var v0 = vertices[ triangle[ 0 ] ].Position;
                    //		var v1 = vertices[ triangle[ 1 ] ].Position;
                    //		var v2 = vertices[ triangle[ 2 ] ].Position;

                    //		//viewport.Simple3DRenderer.SetColor( new ColorValue( 0, 0, 1, 0.3 ) );
                    //		//viewport.Simple3DRenderer.AddTriangles( new Vector3F[] { v0, v1, v2 }, Matrix4.Identity, false, false );
                    //		viewport.Simple3DRenderer.SetColor( new ColorValue( 0, 0, 1 ) );
                    //		viewport.Simple3DRenderer.AddLine( v0, v1 );
                    //		viewport.Simple3DRenderer.AddLine( v1, v2 );
                    //		viewport.Simple3DRenderer.AddLine( v2, v0 );
                    //	}
                    //}

                    //draw triangle
                    {
                        viewport.Simple3DRenderer.SetColor(new ColorValue(1, 1, 0, 0.3));
                        viewport.Simple3DRenderer.AddTriangles(new Vector3F[] { p0, p1, p2 }, false, false);
                        viewport.Simple3DRenderer.SetColor(new ColorValue(1, 1, 0));
                        viewport.Simple3DRenderer.AddLine(p0, p1);
                        viewport.Simple3DRenderer.AddLine(p1, p2);
                        viewport.Simple3DRenderer.AddLine(p2, p0);
                    }

                    float maxLength    = Math.Max((p0 - p1).Length(), Math.Max((p1 - p2).Length(), (p2 - p0).Length()));
                    float arrowLength  = maxLength / 5;
                    float vertexRadius = maxLength / 40;

                    //!!!!можно еще буквами подписать как в transform tool
                    //normals, tangents
                    foreach (int nVertex in showVertices)
                    {
                        var      v = vertices[nVertex];
                        Vector3F p = v.Position;

                        if (v.Normal != Vector3F.Zero)
                        {
                            viewport.Simple3DRenderer.SetColor(new ColorValue(0, 0, 1));
                            viewport.Simple3DRenderer.AddArrow(p, p + v.Normal * arrowLength, 0, 0, true);

                            if (v.Tangent != Vector4F.Zero)
                            {
                                viewport.Simple3DRenderer.SetColor(new ColorValue(1, 0, 0));
                                viewport.Simple3DRenderer.AddArrow(p, p + v.Tangent.ToVector3F() * arrowLength, 0, 0, true);

                                var bitangent = Vector3F.Cross(v.Tangent.ToVector3F(), v.Normal) * v.Tangent.W;
                                viewport.Simple3DRenderer.SetColor(new ColorValue(0, 1, 0));
                                viewport.Simple3DRenderer.AddArrow(p, p + bitangent * arrowLength, 0, 0, true);
                            }
                        }
                    }

                    //positions
                    {
                        viewport.Simple3DRenderer.SetColor(new ColorValue(1, 0, 0));
                        //SimpleMeshGenerator.GenerateSphere( vertexRadius, 10, 10, false, out Vec3F[] spherePositions, out int[] sphereIndices );

                        foreach (int nVertex in showVertices)
                        {
                            var      v = vertices[nVertex];
                            Vector3F p = v.Position;
                            viewport.Simple3DRenderer.AddSphere(new Sphere(p, vertexRadius), 10, true);
                            //viewport.DebugGeometry.AddTriangles( spherePositions, sphereIndices, Mat4.FromTranslate( p ), false, false );
                        }
                    }
                }

                //highlight selected mesh geometries, materials
                if (GetSelectedLODIndex() == 0)
                {
                    var geometriesToHighlight = new ESet <Component_MeshGeometry>();
                    foreach (var geometry in Mesh.GetComponents <Component_MeshGeometry>())                    // checkChildren: true ) )
                    {
                        if (SelectedObjectsSet.Contains(geometry))
                        {
                            geometriesToHighlight.AddWithCheckAlreadyContained(geometry);
                        }

                        var material = geometry.Material.Value;
                        if (material != null && SelectedObjectsSet.Contains(material))
                        {
                            geometriesToHighlight.AddWithCheckAlreadyContained(geometry);
                        }
                    }

                    foreach (var geometry in geometriesToHighlight)
                    {
                        var structure = geometry.VertexStructure.Value;
                        var vertices  = geometry.Vertices.Value;
                        var indices   = geometry.Indices.Value;

                        if (vertices != null & indices != null)
                        {
                            structure.GetInfo(out var vertexSize, out var holes);
                            var vertexCount = vertices.Length / vertexSize;

                            try
                            {
                                if (structure.GetElementBySemantic(VertexElementSemantic.Position, out var element) && element.Type == VertexElementType.Float3)
                                {
                                    if (vertices != null && indices != null)
                                    {
                                        //!!!!кешировать?

                                        var positions = ExtractChannel <Vector3F>(vertices, vertexSize, vertexCount, element.Offset);

                                        viewport.Simple3DRenderer.SetColor(ProjectSettings.Get.SelectedColor);
                                        viewport.Simple3DRenderer.AddTriangles(positions, indices, true, true);
                                    }
                                }
                            }
                            catch (Exception e)
                            {
                                Log.Warning(e.Message);
                            }
                        }
                    }
                }

                //update selected LOD
                if (Scene.RenderingPipeline.Value != null)
                {
                    Scene.RenderingPipeline.Value.LODRange = new RangeI(Mesh.EditorDisplayLOD, Mesh.EditorDisplayLOD);
                }
            }
        }
Ejemplo n.º 25
0
        static void RenderViewports(Form form, out bool existActiveViewports)
        {
            existActiveViewports = false;

            //!!!!каким-то не нужно часто обновляться

            if (form.Visible && form.WindowState != FormWindowState.Minimized)
            {
                //get available controls
                List <EngineViewportControl> toRender  = new List <EngineViewportControl>();
                List <EngineViewportControl> unvisible = new List <EngineViewportControl>();

                foreach (var control in EngineViewportControl.allInstances)
                {
                    if (control.IsAllowRender())
                    {
                        if (control.AutomaticUpdateFPS != 0)
                        {
                            toRender.Add(control);
                        }
                    }
                    else
                    {
                        unvisible.Add(control);
                    }
                }

                bool callFrame = false;

                //destroy render targets for unvisible controls
                foreach (var control in unvisible)
                {
                    var context = control.Viewport?.RenderingContext;
                    if (context != null)
                    {
                        if (context.DynamicTexturesAreExists())
                        {
                            context.MultiRenderTarget_DestroyAll();
                            context.DynamicTexture_DestroyAll();

                            callFrame = true;
                        }
                    }
                }

                if (callFrame)
                {
                    RenderingSystem.CallBgfxFrame();
                    RenderingSystem.CallBgfxFrame();
                }

                //render
                if (toRender.Count != 0)
                {
                    existActiveViewports = true;

                    foreach (var control in toRender)
                    {
                        control.TryRender();
                    }
                }
            }
        }
Ejemplo n.º 26
0
        public void RenderViewports(out bool existActiveViewports)
        {
            existActiveViewports = false;

            //!!!!

            //!!!!каким-то не нужно часто обновляться

            if (Visible && WindowState != FormWindowState.Minimized)
            {
                //get available controls
                List <EngineViewportControl> toRender  = new List <EngineViewportControl>();
                List <EngineViewportControl> unvisible = new List <EngineViewportControl>();

                foreach (var control in EngineViewportControl.allInstances)
                {
                    if (control.IsAllowRender())
                    {
                        if (control.AutomaticUpdateFPS != 0)
                        {
                            toRender.Add(control);
                        }
                    }
                    else
                    {
                        unvisible.Add(control);
                    }
                }

                bool callFrame = false;

                //destroy render targets for unvisible controls
                foreach (var control in unvisible)
                {
                    var context = control.Viewport?.RenderingContext;
                    if (context != null)
                    {
                        if (context.DynamicTexturesAreExists())
                        {
                            context.MultiRenderTarget_DestroyAll();
                            context.DynamicTexture_DestroyAll();

                            callFrame = true;
                        }
                    }
                }

                if (callFrame)
                {
                    RenderingSystem.CallBgfxFrame();
                    RenderingSystem.CallBgfxFrame();
                }

                //render
                if (toRender.Count != 0)
                {
                    existActiveViewports = true;

                    foreach (var control in toRender)
                    {
                        control.TryRender();
                    }
                }
            }

            //bool allowRender = MainForm.Instance.Visible &&
            //	MainForm.Instance.WindowState != FormWindowState.Minimized &&
            //	MainForm.Instance.IsAllowRenderScene();

            //internal bool IsAllowRenderScene()
            //{
            //	if( runMapProcess != null )
            //		return false;
            //	if( !timer1.Enabled )
            //		return false;

            //	Form activeForm = ActiveForm;
            //	if( activeForm == null )
            //		return false;

            //	string fullName = activeForm.GetType().FullName;
            //	if( fullName == "System.Windows.Forms.PropertyGridInternal.PropertyGridView+DropDownHolder" )
            //		return true;
            //	if( fullName == "WeifenLuo.WinFormsUI.Docking.FloatWindow" )
            //		return true;

            //	//MapCompositorManager form
            //	{
            //		string helper = activeForm.Tag as string;
            //		if( helper != null && helper == "MapCompositorManagerForm" )
            //			return true;
            //	}

            //	Form form = activeForm;
            //	while( form != null )
            //	{
            //		if( form == this )
            //			return true;
            //		if( form.Modal )
            //			return false;
            //		form = form.Owner;
            //	}

            //	return false;
            //}
        }
Ejemplo n.º 27
0
        void RenderScreenshot(Component_Camera camera, string destRealFileName)
        {
            var renderToFile = RenderToFile;
            var scene        = renderToFile.ParentRoot as Component_Scene;

            Component_Image texture     = null;
            Component_Image textureRead = null;

            try
            {
                //create
                var resolution = renderToFile.Resolution.Value;

                //!!!!impl
                var         hdr    = false;     //HDR.Value;
                PixelFormat format = hdr ? PixelFormat.Float16RGBA : PixelFormat.A8R8G8B8;
                //PixelFormat format = hdr ? PixelFormat.Float32RGBA : PixelFormat.A8R8G8B8;

                texture               = ComponentUtility.CreateComponent <Component_Image>(null, true, false);
                texture.CreateType    = Component_Image.TypeEnum._2D;
                texture.CreateSize    = resolution;
                texture.CreateMipmaps = false;
                texture.CreateFormat  = format;
                texture.CreateUsage   = Component_Image.Usages.RenderTarget;
                texture.CreateFSAA    = 0;
                texture.Enabled       = true;

                var renderTexture = texture.Result.GetRenderTarget(0, 0);
                var viewport      = renderTexture.AddViewport(true, true);
                viewport.AttachedScene = scene;

                textureRead               = ComponentUtility.CreateComponent <Component_Image>(null, true, false);
                textureRead.CreateType    = Component_Image.TypeEnum._2D;
                textureRead.CreateSize    = resolution;
                textureRead.CreateMipmaps = false;
                textureRead.CreateFormat  = format;
                textureRead.CreateUsage   = Component_Image.Usages.ReadBack | Component_Image.Usages.BlitDestination;
                textureRead.CreateFSAA    = 0;
                textureRead.Enabled       = true;
                //!!!!
                textureRead.Result.PrepareNativeObject();

                //render
                //var image2D = new ImageUtility.Image2D( PixelFormat.Float32RGB, new Vector2I( size * 4, size * 3 ) );

                //var position = Transform.Value.Position;

                //for( int face = 0; face < 6; face++ )
                //{

                //Vector3 dir = Vector3.Zero;
                //Vector3 up = Vector3.Zero;

                ////flipped
                //switch( face )
                //{
                //case 0: dir = -Vector3.YAxis; up = Vector3.ZAxis; break;
                //case 1: dir = Vector3.YAxis; up = Vector3.ZAxis; break;
                //case 2: dir = Vector3.ZAxis; up = -Vector3.XAxis; break;
                //case 3: dir = -Vector3.ZAxis; up = Vector3.XAxis; break;
                //case 4: dir = Vector3.XAxis; up = Vector3.ZAxis; break;
                //case 5: dir = -Vector3.XAxis; up = Vector3.ZAxis; break;
                //}

                try
                {
                    scene.GetDisplayDevelopmentDataInThisApplicationOverride += Scene_GetDisplayDevelopmentDataInThisApplicationOverride;

                    var cameraSettings = new Viewport.CameraSettingsClass(viewport, camera);

                    //var cameraSettings = new Viewport.CameraSettingsClass( viewport, 1, 90, NearClipPlane.Value, FarClipPlane.Value, position, dir, up, ProjectionType.Perspective, 1, 1, 1 );

                    viewport.Update(true, cameraSettings);

                    //clear temp data
                    viewport.RenderingContext.MultiRenderTarget_DestroyAll();
                    viewport.RenderingContext.DynamicTexture_DestroyAll();
                }
                finally
                {
                    scene.GetDisplayDevelopmentDataInThisApplicationOverride -= Scene_GetDisplayDevelopmentDataInThisApplicationOverride;
                }

                texture.Result.GetRealObject(true).BlitTo(viewport.RenderingContext.CurrentViewNumber, textureRead.Result.GetRealObject(true), 0, 0);


                //!!!!pitch

                //get data
                var totalBytes = PixelFormatUtility.GetNumElemBytes(format) * resolution.X * resolution.Y;
                var data       = new byte[totalBytes];
                unsafe
                {
                    fixed(byte *pBytes = data)
                    {
                        var demandedFrame = textureRead.Result.GetRealObject(true).Read((IntPtr)pBytes, 0);

                        while (RenderingSystem.CallBgfxFrame() < demandedFrame)
                        {
                        }
                    }
                }

                var image = new ImageUtility.Image2D(format, resolution, data);

                //reset alpha channel
                for (int y = 0; y < image.Size.Y; y++)
                {
                    for (int x = 0; x < image.Size.X; x++)
                    {
                        var pixel = image.GetPixel(new Vector2I(x, y));
                        pixel.W = 1.0f;
                        image.SetPixel(new Vector2I(x, y), pixel);
                    }
                }

                //image.Data
                //image2D.Blit( index * size, faceImage );

                //Vector2I index = Vector2I.Zero;
                //switch( face )
                //{
                //case 0: index = new Vector2I( 2, 1 ); break;
                //case 1: index = new Vector2I( 0, 1 ); break;
                //case 2: index = new Vector2I( 1, 0 ); break;
                //case 3: index = new Vector2I( 1, 2 ); break;
                //case 4: index = new Vector2I( 1, 1 ); break;
                //case 5: index = new Vector2I( 3, 1 ); break;
                //}

                //var faceImage = new ImageUtility.Image2D( format, new Vector2I( size, size ), data );
                //image2D.Blit( index * size, faceImage );
                //}

                if (!Directory.Exists(Path.GetDirectoryName(destRealFileName)))
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(destRealFileName));
                }

                if (!ImageUtility.Save(destRealFileName, image.Data, image.Size, 1, image.Format, 1, 0, out var error))
                {
                    throw new Exception(error);
                }
            }
            catch (Exception e)
            {
                EditorMessageBox.ShowWarning(e.Message);
                return;
            }
            finally
            {
                texture?.Dispose();
                textureRead?.Dispose();
            }

            ScreenNotifications.Show("Rendering completed successfully.");
        }
Ejemplo n.º 28
0
        void RenderMaterial(Component_Camera camera, string destRealFileName)
        {
            var renderToFile = RenderToFile;
            var scene        = renderToFile.ParentRoot as Component_Scene;

            var textureFileNames = new string[5];

            //ImageUtility.Image2D opacityImage = null;
            Vector2I[,] opacityImageNearestCellTable = null;

            //write textures
            for (int nChannel = 0; nChannel < 5; nChannel++)
            {
                var channel = (MaterialChannel)nChannel;

                Component_Image texture     = null;
                Component_Image textureRead = null;

                try
                {
                    //!!!!все каналы
                    //!!!!какие еще параметры?

                    var prefix = Path.GetFileNameWithoutExtension(destRealFileName) + "_";

                    string fileName = "";
                    switch (nChannel)
                    {
                    case 0: fileName = prefix + "Opacity.png"; break;

                    case 1: fileName = prefix + "BaseColor.png"; break;

                    case 2: fileName = prefix + "Metallic.png"; break;

                    case 3: fileName = prefix + "Roughness.png"; break;

                    case 4: fileName = prefix + "Normal.png"; break;
                    }

                    var fullPath = Path.Combine(Path.GetDirectoryName(destRealFileName), fileName);

                    //create
                    var resolution = renderToFile.Resolution.Value;

                    PixelFormat format = PixelFormat.A8R8G8B8;

                    texture               = ComponentUtility.CreateComponent <Component_Image>(null, true, false);
                    texture.CreateType    = Component_Image.TypeEnum._2D;
                    texture.CreateSize    = resolution;
                    texture.CreateMipmaps = false;
                    texture.CreateFormat  = format;
                    texture.CreateUsage   = Component_Image.Usages.RenderTarget;
                    texture.CreateFSAA    = 0;
                    texture.Enabled       = true;

                    var renderTexture = texture.Result.GetRenderTarget(0, 0);
                    var viewport      = renderTexture.AddViewport(true, true);
                    viewport.AttachedScene = scene;

                    textureRead               = ComponentUtility.CreateComponent <Component_Image>(null, true, false);
                    textureRead.CreateType    = Component_Image.TypeEnum._2D;
                    textureRead.CreateSize    = resolution;
                    textureRead.CreateMipmaps = false;
                    textureRead.CreateFormat  = format;
                    textureRead.CreateUsage   = Component_Image.Usages.ReadBack | Component_Image.Usages.BlitDestination;
                    textureRead.CreateFSAA    = 0;
                    textureRead.Enabled       = true;
                    //!!!!
                    textureRead.Result.PrepareNativeObject();


                    var restorePipeline = scene.RenderingPipeline;

                    var pipeline = ComponentUtility.CreateComponent <Component_RenderingPipeline_Default>(null, true, true);
                    switch (nChannel)
                    {
                    case 0: pipeline.DebugMode = Component_RenderingPipeline_Basic.DebugModeEnum.Normal; break;

                    case 1: pipeline.DebugMode = Component_RenderingPipeline_Basic.DebugModeEnum.BaseColor; break;

                    case 2: pipeline.DebugMode = Component_RenderingPipeline_Basic.DebugModeEnum.Metallic; break;

                    case 3: pipeline.DebugMode = Component_RenderingPipeline_Basic.DebugModeEnum.Roughness; break;

                    case 4: pipeline.DebugMode = Component_RenderingPipeline_Basic.DebugModeEnum.Normal; break;
                    }

                    try
                    {
                        scene.RenderingPipeline = pipeline;
                        scene.GetDisplayDevelopmentDataInThisApplicationOverride += Scene_GetDisplayDevelopmentDataInThisApplicationOverride;

                        var cameraSettings = new Viewport.CameraSettingsClass(viewport, camera);

                        viewport.Update(true, cameraSettings);

                        //clear temp data
                        viewport.RenderingContext.MultiRenderTarget_DestroyAll();
                        viewport.RenderingContext.DynamicTexture_DestroyAll();
                    }
                    finally
                    {
                        scene.RenderingPipeline = restorePipeline;
                        scene.GetDisplayDevelopmentDataInThisApplicationOverride -= Scene_GetDisplayDevelopmentDataInThisApplicationOverride;
                    }

                    texture.Result.GetRealObject(true).BlitTo(viewport.RenderingContext.CurrentViewNumber, textureRead.Result.GetRealObject(true), 0, 0);


                    //!!!!pitch

                    //get data
                    var totalBytes = PixelFormatUtility.GetNumElemBytes(format) * resolution.X * resolution.Y;
                    var data       = new byte[totalBytes];
                    unsafe
                    {
                        fixed(byte *pBytes = data)
                        {
                            var demandedFrame = textureRead.Result.GetRealObject(true).Read((IntPtr)pBytes, 0);

                            while (RenderingSystem.CallBgfxFrame() < demandedFrame)
                            {
                            }
                        }
                    }

                    var image = new ImageUtility.Image2D(format, resolution, data);

                    if (channel == MaterialChannel.Opacity)
                    {
                        //convert pixels
                        for (int y = 0; y < image.Size.Y; y++)
                        {
                            for (int x = 0; x < image.Size.X; x++)
                            {
                                var pixel = image.GetPixel(new Vector2I(x, y));

                                if (pixel.ToVector3F() != Vector3F.Zero)
                                {
                                    pixel = Vector4F.One;
                                }
                                else
                                {
                                    pixel = Vector4F.Zero;
                                }

                                image.SetPixel(new Vector2I(x, y), pixel);
                            }
                        }

                        //opacityImageNearestCellTable
                        if (renderToFile.FillTransparentPixelsByNearPixels)
                        {
                            var boolOpacityImage = new bool[image.Size.X, image.Size.Y];
                            for (int y = 0; y < image.Size.Y; y++)
                            {
                                for (int x = 0; x < image.Size.X; x++)
                                {
                                    var c = image.GetPixelByte(new Vector2I(x, y));
                                    boolOpacityImage[x, y] = c.Red == 0;
                                }
                            }

                            var distanceMap = GetDistanceMap(image);

                            opacityImageNearestCellTable = new Vector2I[image.Size.X, image.Size.Y];
                            for (int y = 0; y < image.Size.Y; y++)
                            {
                                for (int x = 0; x < image.Size.X; x++)
                                {
                                    opacityImageNearestCellTable[x, y] = new Vector2I(x, y);
                                }
                            }

                            var table = opacityImageNearestCellTable;

                            //!!!!slowly

                            Parallel.For(0, image.Size.Y, delegate(int y)                                //for( int y = 0; y < image.Size.Y; y++ )
                            {
                                for (int x = 0; x < image.Size.X; x++)
                                {
                                    var transparent = boolOpacityImage[x, y];
                                    if (transparent)
                                    {
                                        for (int n = 0; n < distanceMap.Length; n++)                                         //foreach( var indexItem in distanceMap )
                                        {
                                            ref var indexItem = ref distanceMap[n];

                                            var takeFrom = new Vector2I(x, y) + indexItem.offset;
                                            if (takeFrom.X >= 0 && takeFrom.X < image.Size.X && takeFrom.Y >= 0 && takeFrom.Y < image.Size.Y)
                                            {
                                                var transparent2 = boolOpacityImage[takeFrom.X, takeFrom.Y];
                                                if (!transparent2)
                                                {
                                                    table[x, y] = takeFrom;
                                                    break;
                                                }
                                            }
                                        }
                                    }
                                }
                            });
                        }
                    }
Ejemplo n.º 29
0
 public EntityFactory(RenderingSystem renderingSystem, IEntityWorld entityManager)
 {
     this.renderingSystem = renderingSystem;
     this.entityManager   = entityManager;
 }
Ejemplo n.º 30
0
        public unsafe void UpdateTexture(bool clearWholeTexture)
        {
            if (size == Vector2I.Zero)
            {
                return;
            }
            if (RenderingSystem.IsDeviceLost())
            {
                return;
            }

            if (texture != null && texture.Disposed)
            {
                texture = null;
            }

            //create texture
            if (texture == null)
            {
                if (!CreateTexture())
                {
                    return;
                }
            }

            if (textureFormat != PixelFormat.A8R8G8B8 && textureFormat != PixelFormat.A8B8G8R8)
            {
                return;
            }

            GpuTexture gpuTexture = texture.Result;

            int totalSize = PixelFormatUtility.GetNumElemBytes(gpuTexture.ResultFormat) * gpuTexture.ResultSize.X * gpuTexture.ResultSize.Y;

            //!!!!можно каждый раз не создавать массив
            byte[] data = new byte[totalSize];

            //HardwarePixelBuffer pixelBuffer = texture.GetBuffer();
            //pixelBuffer.Lock( HardwareBuffer.LockOptions.Discard );
            //PixelBox pixelBox = pixelBuffer.GetCurrentLock();

            //if( clearWholeTexture )
            //	NativeUtility.ZeroMemory( data, pixelBox.SlicePitch * 4 );

            byte *pointer = (byte *)buffer;

            for (int y = 0; y < size.Y; y++)
            {
                //!!!!всегда так?
                int rowPitch = PixelFormatUtility.GetNumElemBytes(gpuTexture.ResultFormat) * gpuTexture.ResultSize.X;

                Marshal.Copy((IntPtr)pointer, data, y * rowPitch, size.X * 4);
                //NativeUtility.CopyMemory( pointer, source, length );
                //pixelBox.WriteDataUnmanaged( y * pixelBox.RowPitch * 4, pointer, size.X * 4 );

                pointer += size.X * 4;
            }

            //pixelBuffer.Unlock();

            var d = new GpuTexture.SurfaceData[] { new GpuTexture.SurfaceData(0, 0, data) };

            gpuTexture.SetData(d);

            needUpdateTexture = false;
        }