Exemple #1
0
        private async void Page_Loaded(object sender, RoutedEventArgs e)
        {
            WriteableBitmap bmp = new WriteableBitmap(640, 480);

            frontBuffer.Source = bmp;

            cameraMode     = CameraMode.Static;
            shadingMode    = ShadingMode.Flat;
            reflectionMode = ReflectionMode.Blin;

            device = new Device(bmp, shadingMode, reflectionMode);
            SetStaticCamera();

            var carLoaded = await device.LoadJSONFileAsync("ms-appx:///Assets/car6.babylon");

            var donutLoaded = await device.LoadJSONFileAsync("ms-appx:///Assets/torus.babylon");

            car    = carLoaded[0];
            donut  = donutLoaded[0];
            meshes = new Mesh[] { car, donut };

            Time = 0;

            CompositionTarget.Rendering += CompositionTarget_Rendering;
        }
 public PlacedTetraStick(TetraStick tetraStick, Coords location, Orientation orientation, ReflectionMode reflectionMode)
 {
     TetraStick = tetraStick;
     Location = location;
     Orientation = orientation;
     ReflectionMode = reflectionMode;
     _lazyWidth = new Lazy<int>(CalculateWidth);
     _lazyHeight = new Lazy<int>(CalculateHeight);
     _lazyInteriorJunctionPoints = new Lazy<IImmutableList<Coords>>(CalculateInteriorJunctionPoints);
     _lazyLines = new Lazy<IEnumerable<IImmutableList<Coords>>>(CalculateLines);
 }
Exemple #3
0
 public Device(WriteableBitmap bmp, ShadingMode sMode, ReflectionMode rMode)
 {
     this.bmp       = bmp;
     screenWidth    = bmp.PixelWidth;
     ScreenHeight   = bmp.PixelHeight;
     backBuffer     = new byte[screenWidth * ScreenHeight * 4];
     zBuffer        = new double[screenWidth * ScreenHeight];
     lockBuffer     = new object[screenWidth * ScreenHeight];
     shadingMode    = sMode;
     reflectionMode = rMode;
     for (var i = 0; i < lockBuffer.Length; i++)
     {
         lockBuffer[i] = new object();
     }
 }
Exemple #4
0
 public override void Render(StringBuilder sb)
 {
     AddProperty("DEF", DEF);
     AddProperty("Name", Name);
     AddProperty("skyBox", SkyBox);
     AddProperty("groundColor", Vector3.ToString(GroundColor));
     AddProperty("skyColor", Vector3.ToString(SkyColor));
     AddProperty("slm:lightingColor", LightingColor);
     if (LightingMode != LightingMode.NotSet)
     {
         AddProperty("slm:lightingSource", LightingMode.ToString());
     }
     if (ReflectionMode != ReflectionMode.NotSet)
     {
         AddProperty("slm:reflectionMode", ReflectionMode.ToString());
     }
     base.Render(sb);
 }
Exemple #5
0
    public void CopyCurrentSettings()
    {
        sun = RenderSettings.sun;
        switch (RenderSettings.ambientMode)
        {
        case UnityEngine.Rendering.AmbientMode.Skybox:
            ambientMode = AmbientMode.Skybox;

            //makes sure the skybox gets set correctly

            if (skyboxes.Contains(RenderSettings.skybox))
            {
                for (int i = 0; i < skyboxes.Count; i++)
                {
                    if (skyboxes[i].Equals(RenderSettings.skybox))
                    {
                        currentSkybox = i;
                        break;
                    }
                }
                RenderSettings.skybox = skyboxes[currentSkybox];
            }
            else
            {
                skyboxes.Add(RenderSettings.skybox);
                currentSkybox = skyboxes.Count - 1;
            }

            skyBoxColor = RenderSettings.skybox.GetColor("_Tint");
            skyboxIntensityMultiplier = RenderSettings.ambientIntensity;
            break;

        case UnityEngine.Rendering.AmbientMode.Flat:
            RenderSettings.skybox = null;
            ambientMode           = AmbientMode.Color;
            ambientColor          = RenderSettings.ambientSkyColor;
            break;

        case UnityEngine.Rendering.AmbientMode.Trilight:
            RenderSettings.skybox = null;
            ambientMode           = AmbientMode.Gradient;
            skyColor     = RenderSettings.ambientSkyColor;
            equatorColor = RenderSettings.ambientEquatorColor;
            groundColor  = RenderSettings.ambientGroundColor;
            break;
        }

        switch (RenderSettings.defaultReflectionMode)
        {
        case DefaultReflectionMode.Skybox:
            reflectionMode       = ReflectionMode.Skybox;
            reflectionResolution = (ReflectionResolution)RenderSettings.defaultReflectionResolution;
            reflectionIntensity  = RenderSettings.reflectionIntensity;
            reflectionBounces    = RenderSettings.reflectionBounces;
            break;

        case DefaultReflectionMode.Custom:
            reflectionMode      = ReflectionMode.Custom;
            reflectionCubeMap   = RenderSettings.customReflection;
            reflectionIntensity = RenderSettings.reflectionIntensity;
            reflectionBounces   = RenderSettings.reflectionBounces;
            break;
        }

        cameraBackground = mainCamera.backgroundColor;
    }
        static void Main(string[] args)
        {
            Texture offscreenColorTexture = null;
            Texture offscreenDepthTexture = null;

            Filament.RenderTarget offscreenRenderTarget = null;
            View   offscreenView   = null;
            Scene  offscreenScene  = null;
            Camera offscreenCamera = null;

            int              lightEntity     = -1;
            Material         meshMaterial    = null;
            MaterialInstance meshMatInstance = null;
            Mesh             monkeyMesh      = null;
            int              reflectedMonkey = -1;
            Matrix4x4        transform       = Matrix4x4.Identity;

            int              quadEntity      = -1;
            Vector3          quadCenter      = Vector3.Zero;
            Vector3          quadNormal      = Vector3.Zero;
            VertexBuffer     quadVb          = null;
            IndexBuffer      quadIb          = null;
            Material         quadMaterial    = null;
            MaterialInstance quadMatInstance = null;
            ReflectionMode   mode            = ReflectionMode.Camera;

            var app = new Application(
                new WindowConfig()
            {
                Title = "rendertarget",
            },
                new ApplicationConfig()
                );

            app.Setup = (engine, view, scene) => {
                var tcm = engine.TransformManager;
                var rcm = engine.RenderableManager;
                var vp  = view.Viewport;

                var resourceData = new SampleDataLoader();
                var monkeyData   = new MonkeyDataLoader();

                // Instantiate offscreen render target.
                offscreenScene = engine.CreateScene();

                offscreenView       = engine.CreateView();
                offscreenView.Scene = offscreenScene;
                offscreenView.PostProcessingEnabled = false;

                offscreenColorTexture = TextureBuilder.Create()
                                        .WithWidth(vp.Width)
                                        .WithHeight(vp.Height)
                                        .WithLevels(1)
                                        .WithUsage(TextureUsage.ColorAttachment | TextureUsage.Sampleable)
                                        .WithFormat(TextureFormat.Rgba8)
                                        .Build(engine);

                offscreenDepthTexture = TextureBuilder.Create()
                                        .WithWidth(vp.Width)
                                        .WithHeight(vp.Height)
                                        .WithLevels(1)
                                        .WithUsage(TextureUsage.DepthAttachment)
                                        .WithFormat(TextureFormat.Depth24)
                                        .Build(engine);

                offscreenRenderTarget = RenderTargetBuilder.Create()
                                        .WithTexture(AttachmentPoint.Color, offscreenColorTexture)
                                        .WithTexture(AttachmentPoint.Depth, offscreenDepthTexture)
                                        .Build(engine);

                offscreenView.RenderTarget = offscreenRenderTarget;
                offscreenView.Viewport     = new Viewport(0, 0, vp.Width, vp.Height);

                offscreenCamera      = engine.CreateCamera(EntityManager.Create());
                offscreenView.Camera = offscreenCamera;

                app.AddOffscreenView(offscreenView);

                // Position and orient the mirror in an interesting way.
                var c = quadCenter = new Vector3(-2, 0, -5);
                var n = quadNormal = Vector3.Normalize(new Vector3(1, 0, 2));
                var u = Vector3.Normalize(Vector3.Cross(quadNormal, new Vector3(0, 1, 0)));
                var v = Vector3.Cross(n, u);
                u = 1.5f * u;
                v = 1.5f * v;

                Vertex[] kQuadVertices =
                {
                    new() { Position = c - u - v, Uv = new Vector2(1, 0) },
                    new() { Position = c + u - v, Uv = new Vector2(0, 0) },
                    new() { Position = c - u + v, Uv = new Vector2(1, 1) },
                    new() { Position = c + u + v, Uv = new Vector2(0, 1) },
                };

                var vbo = new byte[20 * 4];

                MemoryStream vboStream = new MemoryStream(vbo);
                BinaryWriter vboWriter = new BinaryWriter(vboStream);
                vboWriter.Write(kQuadVertices[0].Position.X);
                vboWriter.Write(kQuadVertices[0].Position.Y);
                vboWriter.Write(kQuadVertices[0].Position.Z);
                vboWriter.Write(kQuadVertices[0].Uv.X);
                vboWriter.Write(kQuadVertices[0].Uv.Y);
                vboWriter.Write(kQuadVertices[1].Position.X);
                vboWriter.Write(kQuadVertices[1].Position.Y);
                vboWriter.Write(kQuadVertices[1].Position.Z);
                vboWriter.Write(kQuadVertices[1].Uv.X);
                vboWriter.Write(kQuadVertices[1].Uv.Y);
                vboWriter.Write(kQuadVertices[2].Position.X);
                vboWriter.Write(kQuadVertices[2].Position.Y);
                vboWriter.Write(kQuadVertices[2].Position.Z);
                vboWriter.Write(kQuadVertices[2].Uv.X);
                vboWriter.Write(kQuadVertices[2].Uv.Y);
                vboWriter.Write(kQuadVertices[3].Position.X);
                vboWriter.Write(kQuadVertices[3].Position.Y);
                vboWriter.Write(kQuadVertices[3].Position.Z);
                vboWriter.Write(kQuadVertices[3].Uv.X);
                vboWriter.Write(kQuadVertices[3].Uv.Y);

                // Create quad vertex buffer.
                quadVb = VertexBufferBuilder.Create()
                         .WithVertexCount(4)
                         .WithBufferCount(1)
                         .WithAttribute(VertexAttribute.Position, 0, ElementType.Float3, 0, 20)
                         .WithAttribute(VertexAttribute.Uv0, 0, ElementType.Float2, 12, 20)
                         .Build(engine);
                quadVb.SetBufferAt(engine, 0, vbo);

                // Create quad index buffer.
                var kQuadIndices = new ushort[] { 0, 1, 2, 3, 2, 1 };

                quadIb = IndexBufferBuilder.Create()
                         .WithIndexCount(6)
                         .WithBufferType(IndexType.UShort)
                         .Build(engine);
                quadIb.SetBuffer(engine, kQuadIndices);

                // Create quad material and renderable.
                quadMaterial = MaterialBuilder.Create()
                               .WithPackage(resourceData.LoadMirror())
                               .Build(engine);
                quadMatInstance = quadMaterial.CreateInstance();

                var sampler = new TextureSampler(SamplerMinFilter.Linear, SamplerMagFilter.Linear);

                quadMatInstance.SetParameter("albedo", offscreenColorTexture, sampler);
                quadEntity = EntityManager.Create();

                RenderableBuilder.Create()
                .WithBoundingBox(
                    new Box(
                        new Vector3(-1, -1, -1),
                        new Vector3(1, 1, 1)
                        )
                    )
                .WithMaterial(0, quadMatInstance)
                .WithGeometry(0, PrimitiveType.Triangles, quadVb, quadIb, 0, 6)
                .WithCulling(false)
                .WithReceiveShadows(false)
                .WithCastShadows(false)
                .Build(engine, quadEntity);

                scene.AddEntity(quadEntity);

                // Instantiate mesh material.
                meshMaterial = MaterialBuilder.Create()
                               .WithPackage(resourceData.LoadAiDefaultMat())
                               .Build(engine);

                var mi = meshMatInstance = meshMaterial.CreateInstance();
                mi.SetParameter("baseColor", RgbType.Linear, new Color(0.8f, 1.0f, 1.0f));
                mi.SetParameter("metallic", 0.0f);
                mi.SetParameter("roughness", 0.4f);
                mi.SetParameter("reflectance", 0.5f);

                // Add monkey into the scene.
                monkeyMesh = MeshReader.LoadFromBuffer(engine, monkeyData.LoadSuzanne(), mi);

                var ti = tcm.GetInstance(monkeyMesh.Renderable);

                transform = Matrix4x4.CreateTranslation(0, 0, -4) * tcm.GetWorldTransform(ti);
                rcm.SetCastShadows(rcm.GetInstance(monkeyMesh.Renderable), false);
                scene.AddEntity(monkeyMesh.Renderable);

                // Create a reflected monkey, which is used only for ReflectionMode::RENDERABLES.
                reflectedMonkey = EntityManager.Create();

                RenderableBuilder.Create()
                .WithBoundingBox(
                    new Box(
                        new Vector3(-2, -2, -2),
                        new Vector3(2, 2, 2)
                        )
                    )
                .WithMaterial(0, mi)
                .WithGeometry(0, PrimitiveType.Triangles, monkeyMesh.VertexBuffer, monkeyMesh.IndexBuffer)
                .WithReceiveShadows(true)
                .WithCastShadows(false)
                .Build(engine, reflectedMonkey);
                mode = SetReflectionMode(offscreenScene, offscreenView, reflectedMonkey, monkeyMesh, ReflectionMode.Camera);

                // Add light source to both scenes.
                // NOTE: this is slightly wrong when the reflection mode is RENDERABLES.
                lightEntity = EntityManager.Create();

                LightBuilder.Create(LightType.Sun)
                .WithColor(Color.ToLinearAccurate(new sRGBColor(0.98f, 0.92f, 0.89f)))
                .WithIntensity(110000)
                .WithDirection(new Vector3(0.7f, -1, -0.8f))
                .WithSunAngularRadius(1.9f)
                .WithCastShadows(false)
                .Build(engine, lightEntity);

                scene.AddEntity(lightEntity);
                offscreenScene.AddEntity(lightEntity);
            };