// Init is called on startup. public override void Init() { Font fontLato = AssetStorage.Get <Font>("Lato-Black.ttf"); FontMap fontLatoMap = new FontMap(fontLato, 32); string vsTex = AssetStorage.Get <string>("texture.vert"); string psTex = AssetStorage.Get <string>("texture.frag"); Icosphere icosphereWithTangents = new Icosphere(5); icosphereWithTangents.Tangents = icosphereWithTangents.CalculateTangents(); icosphereWithTangents.BiTangents = icosphereWithTangents.CalculateBiTangents(); icosphereWithTangents.BoundingBox = new AABBf(icosphereWithTangents.Vertices); float canvasWidth = Width / 100f; float canvasHeight = Height / 100f; var albedoTex = new Texture(AssetStorage.Get <ImageData>("albedoTex.jpg")); var normalTex = new Texture(AssetStorage.Get <ImageData>("normalTex.jpg")); SceneContainer guiDescriptionScene = new SceneContainer { Children = new List <SceneNode> { new CanvasNode("Canvas", CanvasRenderMode.World, new MinMaxRect { Min = new float2(-canvasWidth / 2, -canvasHeight / 2f), Max = new float2(canvasWidth / 2, canvasHeight / 2f) }) { Children = new ChildList { new TextNode( "How-To:\n############################\n- Move with WASD\n- Left mouse button rotates spheres\n- Mouse wheel zooms", "howTo", vsTex, psTex, UIElementPosition.GetAnchors(AnchorPos.DownDownLeft), UIElementPosition.CalcOffsets(AnchorPos.DownDownLeft, new float2(-11, -5), canvasHeight, canvasWidth, new float2(12, 1)), fontLatoMap, new float4(1, 1, 0, 1).LinearColorFromSRgb(), HorizontalTextAlignment.Left, VerticalTextAlignment.Center) } }, new CanvasNode("Complete", CanvasRenderMode.World, MinMaxRect.FromCenterSize(float2.Zero, float2.One)) { Components = new List <SceneComponent> { new Transform { Name = "TextTransform", Translation = new float3(-15, 2.5f, 0) } }, Children = new ChildList { new TextNode( "Complete", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect(), fontLatoMap, (float4)ColorUint.Black, HorizontalTextAlignment.Left, VerticalTextAlignment.Center), new TextNode( "NOT YET IMPLEMENTED", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect { Max = new float2(0, 0), Min = new float2(0, -1.25f) }, fontLatoMap, new float4(1, 0, 0, 0.5f), HorizontalTextAlignment.Left, VerticalTextAlignment.Center) } }, new CanvasNode("Albedo and specular", CanvasRenderMode.World, MinMaxRect.FromCenterSize(float2.Zero, float2.One)) { Components = new List <SceneComponent> { new Transform { Name = "TextTransform", Translation = new float3(-10, 2.5f, 0) } }, Children = new ChildList { new TextNode( "Albedo and Specular", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect(), fontLatoMap, (float4)ColorUint.Black, HorizontalTextAlignment.Left, VerticalTextAlignment.Center) } }, new CanvasNode("Albedo, specular and albedo texture", CanvasRenderMode.World, MinMaxRect.FromCenterSize(float2.Zero, float2.One)) { Components = new List <SceneComponent> { new Transform { Name = "TextTransform", Translation = new float3(-5, 2.5f, 0) } }, Children = new ChildList { new TextNode( "Albedo, specular and\nalbedo texture", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect(), fontLatoMap, (float4)ColorUint.Black, HorizontalTextAlignment.Left, VerticalTextAlignment.Center) } }, new CanvasNode("Specular texture", CanvasRenderMode.World, MinMaxRect.FromCenterSize(float2.Zero, float2.One)) { Components = new List <SceneComponent> { new Transform { Name = "TextTransform", Translation = new float3(0, 2.5f, 0) } }, Children = new ChildList { new TextNode( "Specular texture", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect(), fontLatoMap, (float4)ColorUint.Black, HorizontalTextAlignment.Left, VerticalTextAlignment.Center), new TextNode( "NOT YET IMPLEMENTED", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect { Max = new float2(0, 0), Min = new float2(0, -1.25f) }, fontLatoMap, new float4(1, 0, 0, 0.75f).LinearColorFromSRgb(), HorizontalTextAlignment.Left, VerticalTextAlignment.Center) } }, new CanvasNode("Normal map", CanvasRenderMode.World, MinMaxRect.FromCenterSize(float2.Zero, float2.One)) { Components = new List <SceneComponent> { new Transform { Name = "TextTransform", Translation = new float3(5, 2.5f, 0) } }, Children = new ChildList { new TextNode( "Normal map", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect(), fontLatoMap, (float4)ColorUint.Black, HorizontalTextAlignment.Left, VerticalTextAlignment.Center) } }, new CanvasNode("Albedo and emissive", CanvasRenderMode.World, MinMaxRect.FromCenterSize(float2.Zero, float2.One)) { Components = new List <SceneComponent> { new Transform { Name = "TextTransform", Translation = new float3(10, 2.5f, 0) } }, Children = new ChildList { new TextNode( "Albedo and emissive", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect(), fontLatoMap, (float4)ColorUint.Black, HorizontalTextAlignment.Left, VerticalTextAlignment.Center), new TextNode( "NOT YET IMPLEMENTED", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect { Max = new float2(0, 0), Min = new float2(0, -1.25f) }, fontLatoMap, new float4(1, 0, 0, 0.75f).LinearColorFromSRgb(), HorizontalTextAlignment.Left, VerticalTextAlignment.Center) } }, new CanvasNode("Albedo and emissive with texture", CanvasRenderMode.World, MinMaxRect.FromCenterSize(float2.Zero, float2.One)) { Components = new List <SceneComponent> { new Transform { Name = "TextTransform", Translation = new float3(15, 3, 0) } }, Children = new ChildList { new TextNode( "Albedo, emissive and\nemissive texture", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect(), fontLatoMap, (float4)ColorUint.Black, HorizontalTextAlignment.Left, VerticalTextAlignment.Center), new TextNode( "NOT YET IMPLEMENTED", "desc", vsTex, psTex, MinMaxRect.FromCenterSize(float2.Zero, float2.One), new MinMaxRect { Max = new float2(0, 0), Min = new float2(0, -1.75f) }, fontLatoMap, new float4(1, 0, 0, 0.75f).LinearColorFromSRgb(), HorizontalTextAlignment.Left, VerticalTextAlignment.Center) } } } }; _scene = new SceneContainer { Header = new SceneHeader { CreatedBy = "MR", CreationDate = DateTime.Now.ToString(), Generator = "by hand" }, Children = new List <SceneNode> { new SceneNode { Children = new ChildList { new SceneNode { Components = new List <SceneComponent> { new Transform { Name = "complete", Translation = new float3(-15, 0, 0) }, MakeEffect.FromDiffuseSpecularTexture( albedoColor: (float4.One * 0.25f).LinearColorFromSRgb(), emissionColor: float4.Zero, shininess: 25f, albedoTex: albedoTex, normalTex: normalTex, albedoMix: 1f, texTiles: float2.One, specularStrength: 1f, normalMapStrength: 1f //SpecularMix = 1f, //SpecularTexture = "specularTex.jpg", //EmissiveColor = new float4(0, 1, 1, 1), //EmissiveMix = 0.5f, //EmissiveTexture = "emissiveTex.jpg" ), icosphereWithTangents, } }, new SceneNode { Components = new List <SceneComponent> { new Transform { Name = "albedo and specular", Translation = new float3(-10, 0, 0) }, MakeEffect.FromDiffuseSpecular( albedoColor: new float4(0.39f, 0.19f, 0, 1).LinearColorFromSRgb(), emissionColor: float4.Zero, shininess: 25.0f, specularStrength: 1f), icosphereWithTangents } }, new SceneNode { Components = new List <SceneComponent> { new Transform { Name = "albedo, specular, albedo texture", Translation = new float3(-5, 0, 0) }, MakeEffect.FromDiffuseSpecularAlbedoTexture ( albedoColor: new float4(0.39f, 0.19f, 0, 1).LinearColorFromSRgb(), emissionColor: float4.Zero, albedoTex: albedoTex, albedoMix: 1f, texTiles: float2.One, shininess: 256.0f, specularStrength: 1.0f ), icosphereWithTangents } }, // ---- Specular Textures are not implemented yet. There is no fitting shader! ---- // //new SceneNode //{ // Components = new List<SceneComponent> // { // new Transform // { // Name = "specular texture", // Translation = new float3(0, 0, 0) // }, // ShaderCodeBuilder.MakeShaderEffectFromShaderEffectPropsProto(new ShaderEffectProps // { // MatProbs = // { // HasAlbedo = true, // HasAlbedoTexture = true, // HasSpecular = true, // HasSpecularTexture = true // }, // MatType = MaterialType.Standard, // MatValues = // { // AlbedoColor = new float4(0.39f, 0.19f, 0, 1), // SpecularColor = float4.One, // SpecularIntensity = 2f, // SpecularShininess = 25f, // SpecularMix = 1f, // TODO: Implement in ShaderShards // SpecularTexture = "specularTex.jpg" // TODO: Implement in ShaderShards // } // }), // icosphereWithTangents // } //}, new SceneNode { Components = new List <SceneComponent> { new Transform { Name = "specular texture - not impl.", Translation = new float3(0, 0, 0) }, MakeEffect.FromDiffuseSpecular(float4.One, float4.Zero, 85, 0.5f), icosphereWithTangents } }, new SceneNode { Components = new List <SceneComponent> { new Transform { Name = "normal map", Translation = new float3(5, 0, 0) }, MakeEffect.FromDiffuseSpecularTexture( albedoColor: (float4.One * 0.25f).LinearColorFromSRgb(), emissionColor: float4.Zero, shininess: 200f, albedoTex: albedoTex, normalTex: normalTex, albedoMix: 1f, texTiles: float2.One, specularStrength: 1f, normalMapStrength: 1f ), icosphereWithTangents } }, new SceneNode { Components = new List <SceneComponent> { new Transform { Name = "albedo, emissive - not impl.", Translation = new float3(10, 0, 0) }, MakeEffect.FromDiffuseSpecularAlbedoTexture( albedoColor: new float4(0.39f, 0.19f, 0, 1).LinearColorFromSRgb(), emissionColor: float4.Zero, albedoTex: albedoTex, albedoMix: 1f, texTiles: float2.One, shininess: 256.0f, specularStrength: 1f), icosphereWithTangents } }, new SceneNode { Components = new List <SceneComponent> { new Transform { Name = "albedo, emissive, emissive texture - not impl.", Translation = new float3(15, 0, 0) }, MakeEffect.FromDiffuseSpecularAlbedoTexture( albedoColor: new float4(0.39f, 0.19f, 0, 1).LinearColorFromSRgb(), emissionColor: float4.Zero, albedoTex: albedoTex, albedoMix: 1f, texTiles: float2.One, shininess: 256.0f, specularStrength: 1.0f), icosphereWithTangents } } } } } }; _guiDescRenderer = new SceneRendererForward(guiDescriptionScene); _renderer = new SceneRendererDeferred(_scene); }
// Init is called on startup. public override void Init() { // Initial "Zoom" value (it's rather the distance in view direction, not the camera's focal distance/opening angle) _zoom = 2; _angleRoll = 0; _angleRollInit = 0; _twoTouchRepeated = false; _offset = float2.Zero; _offsetInit = float2.Zero; // Set the clear color for the backbuffer to white (100% intensity in all color channels R, G, B, A). RC.ClearColor = new float4(1, 1, 1, 1); _meshTransform = new Transform(); _scene = new SceneContainer() { Children = new List <SceneNode>() { new SceneNode() { Components = new List <SceneComponent>() { _meshTransform, new Plane() } } } }; var albedoTex = new Texture(AssetStorage.Get <ImageData>("Bricks_1K_Color.png")); var normalTex = new Texture(AssetStorage.Get <ImageData>("Bricks_1K_Normal.png")); var normalMappingEffect = MakeEffect.FromDiffuseSpecularTexture(float4.One, float4.Zero, albedoTex, normalTex, 1.0f, new float2(2, 2), 85, 0.2f, 0.3f); normalMappingEffect.RendererStates.AlphaBlendEnable = true; normalMappingEffect.RendererStates.SourceBlend = Blend.SourceAlpha; normalMappingEffect.RendererStates.DestinationBlend = Blend.InverseSourceAlpha; normalMappingEffect.RendererStates.BlendOperation = BlendOperation.Add; _mesh = _scene.Children[0].GetComponent <Plane>(); _mesh.Tangents = _mesh.CalculateTangents(); _mesh.BiTangents = _mesh.CalculateBiTangents(); _scene.Children[0].Components.Insert(1, normalMappingEffect); AABBCalculator aabbc = new AABBCalculator(_scene); AABBf? bbox = aabbc.GetBox(); if (bbox != null) { // If the model origin is more than one third away from its bounding box, // recenter it to the bounding box. Do this check individually per dimension. // This way, small deviations will keep the model's original center, while big deviations // will make the model rotate around its geometric center. float3 bbCenter = bbox.Value.Center; float3 bbSize = bbox.Value.Size; float3 center = float3.Zero; if (System.Math.Abs(bbCenter.x) > bbSize.x * 0.3) { center.x = bbCenter.x; } if (System.Math.Abs(bbCenter.y) > bbSize.y * 0.3) { center.y = bbCenter.y; } if (System.Math.Abs(bbCenter.z) > bbSize.z * 0.3) { center.z = bbCenter.z; } _sceneCenter = float4x4.CreateTranslation(-center); // Adjust the model size float maxScale = System.Math.Max(bbSize.x, System.Math.Max(bbSize.y, bbSize.z)); if (maxScale != 0) { _sceneScale = float4x4.CreateScale(200.0f / maxScale); } else { _sceneScale = float4x4.Identity; } } // Wrap a SceneRenderer around the model. _sceneRenderer = new SceneRendererForward(_scene); }