2 using System.Collections.Generic;
4 using System.Threading.Tasks;
5 using System.Xml.Serialization;
6 using SiliconStudio.Paradox.DataModel;
7 using SiliconStudio.Paradox.Effects.Modules;
8 using SiliconStudio.Paradox.Engine;
9 using SiliconStudio.Paradox.EntityModel;
10 using SiliconStudio.Paradox.Games;
11 using SiliconStudio.Paradox;
12 using SiliconStudio.Paradox.Effects;
13 using SiliconStudio.Paradox.Configuration;
14 using SiliconStudio.Core.Extensions;
15 using SiliconStudio.Paradox.Graphics;
16 using SiliconStudio.Paradox.Games.IO;
17 using SiliconStudio.Paradox.Graphics.Data;
18 using SiliconStudio.Paradox.Games.MicroThreading;
19 using SiliconStudio.Paradox.Games.Mathematics;
20 using SiliconStudio.Paradox.Particles;
21 using SiliconStudio.Shaders;
22 using ScriptShader.Effects;
37 for (
int i = 0; i < 100; i++)
39 await Scheduler.Current.NextFrame();
41 System.Threading.Thread.Sleep(20);
46 public static async
Task Run2(EngineContext engineContext)
48 for (
int i = 0; i < 10; i++)
49 Scheduler.Current.Add(
Run3);
54 VirtualFileSystem.MountFileSystem(
"/global_data",
"..\\..\\deps\\data\\");
55 VirtualFileSystem.MountFileSystem(
"/global_data2",
"..\\..\\data\\");
56 VirtualFileSystem.MountFileSystem(
"/shaders",
"..\\..\\sources\\shaders\\");
62 engineContext.EntityManager.Systems.Add(
new TransformationUpdateProcessor());
63 engineContext.EntityManager.Systems.Add(
new SkinningProcessor());
66 engineContext.AssetManager.RegisterSerializer(
new GpuTextureSerializer(engineContext.RenderContext.GraphicsDevice));
67 engineContext.AssetManager.RegisterSerializer(
new GpuSamplerStateSerializer(engineContext.RenderContext.GraphicsDevice));
68 engineContext.AssetManager.RegisterSerializer(
new ImageSerializer());
71 public static void PipelineSetup(EngineContext engineContext,
string effectFilename = null)
73 var config = AppConfig.GetConfiguration<
Config>(
"Script1");
75 var optionalFeatures = config.PipelineFeatures.Split(
new[] {
' ' }, StringSplitOptions.RemoveEmptyEntries);
76 renderingSetup.Initialize(engineContext, effectFilename, optionalFeatures);
80 public static async
Task Run(EngineContext engineContext)
82 var config = AppConfig.GetConfiguration<
Config>(
"Script1");
88 await ScriptCube.Run(engineContext);
96 if (configDebug.DebugManager)
99 engineContext.Scheduler.Add(async () =>
101 if (config.Scene ==
"cave")
103 VirtualFileSystem.MountFileSystem(
"/sync",
".");
104 await ScriptCave.Run(engineContext);
106 else if (config.Scene ==
"sync")
108 ScriptSceneSerialization.gitFolder =
"..\\..\\gittest\\" + config.SyncFolder +
"\\";
110 await ScriptCube.GenerateSimpleCubeEffect(engineContext);
112 else if (config.Scene ==
"factory")
115 await LightScript.MoveLights(engineContext);
117 else if (config.Scene ==
"particles")
121 else if (config.Scene ==
"cputest")
123 await ScriptMulticore.Run(engineContext);
125 else if (config.Scene ==
"permutation")
127 await ScriptPermutation.Run(engineContext);
136 var mainPlugin = engineContext.RenderContext.RenderPassPlugins.OfType<
MainPlugin>().FirstOrDefault();
137 EffectOld effect = engineContext.RenderContext.BuildEffect(
"SimpleSkinning")
138 .Using(
new BasicShaderPlugin(
"ShaderBase") {
RenderPassPlugin = mainPlugin })
139 .Using(
new BasicShaderPlugin(
"TransformationWVP") {
RenderPassPlugin = mainPlugin })
140 .Using(
new BasicShaderPlugin(
new ShaderMixinSource() {
141 new ShaderClassSource(
"AlbedoDiffuseBase"),
142 new ShaderComposition(
"albedoDiffuse",
new ShaderClassSource(
"ComputeColorTexture",
TexturingKeys.DiffuseTexture,
"TEXCOORD")),
143 new ShaderComposition(
"albedoSpecular",
new ShaderClassSource(
"ComputeColor")),
145 .Using(
new BasicShaderPlugin(
"AlbedoFlatShading") {
RenderPassPlugin = mainPlugin })
148 var characterEntity = await AnimScript.LoadFBXModel(engineContext,
"/global_data/fbx/test_mesh.hotei#");
149 await AnimScript.AnimateFBXModel(engineContext, characterEntity);
153 public static async
Task SetupFactory(EngineContext engineContext,
string effectName =
"Simple")
157 renderingSetup.RegisterLighting(engineContext);
161 if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast(
"LightingPlugin", out lightingPlugin))
163 var shadowMapEntity =
new Entity();
164 shadowMapEntity.Set(TransformationComponent.Key, TransformationTRS.CreateComponent());
165 shadowMapEntity.Set(LightComponent.Key,
new LightComponent { Type = LightType.Directional, Intensity = 0.9f,
Color =
new Color3(1.0f, 1.0f, 1.0f), LightDirection =
new Vector3(-1.0f, -1.0f, -1.0f),
ShadowMap =
true, DecayStart = 40000.0f });
166 engineContext.EntityManager.AddEntity(shadowMapEntity);
170 var entity = await engineContext.AssetManager.LoadAsync<
Entity>(
"/global_data/factoryfbx.hotei#");
173 var transformationComponent = (TransformationTRS)entity.
Transformation.Value;
174 transformationComponent.
Scaling *= 0.1f;
177 await engineContext.EntityManager.AddEntityAsync(entity);
180 private static void SetupParticles(EngineContext engineContext)
186 particleSystem.GetOrCreateFieldWithDefault(ParticleFields.Size, 10.0f);
192 particleSystem.Plugins.Add(
new Gravity());
196 var particleEffect = engineContext.RenderContext.Effects.First(x => x.Name ==
"DefaultParticle");
197 var particleMesh =
new EffectMesh(particleEffect);
198 particleMesh.Parameters.Set(ParticleRendererPlugin.ParticleSystemKey, particleSystem);
201 var smokeVolTexture = (
Texture2D)engineContext.AssetManager.Load<
Texture>(
"/global_data/gdc_demo/fx/smokevol.dds");
202 particleMesh.Parameters.Set(TexturingKeys.DiffuseTexture, smokeVolTexture);
205 engineContext.RenderContext.GlobalMeshes.AddMesh(particleMesh);
211 var config = AppConfig.GetConfiguration<
Config>(
"Script1");
214 renderingSetup.Initialize(engineContext);
216 bool bloom = config.Bloom;
217 bool fxaa = config.FXAA;
219 bool useHBAO =
false;
221 bool mixAOWithColorImage =
false;
222 bool halfResAO =
true;
224 var effectMeshGroup =
new RenderPassListEnumerator();
225 engineContext.RenderContext.RenderPassEnumerators.Add(effectMeshGroup);
228 if (engineContext.DataContext.RenderPassPlugins.TryGetValueCast(
"PostEffectPlugin", out postEffectPlugin)
229 && (bloom || fxaa || useHBAO))
234 EffectOld brightPassFilter = engineContext.RenderContext.BuildEffect(
"BrightPass")
236 .Using(
new BasicShaderPlugin(
"ShadingTexturing"))
237 .Using(
new BasicShaderPlugin(
"PostEffectBrightFilter"));
239 EffectOld blurEffect = engineContext.RenderContext.BuildEffect(
"Blur")
241 .Using(
new BasicShaderPlugin(
"PostEffectBlur"));
243 EffectOld downsampleEffect = engineContext.RenderContext.BuildEffect(
"DownSample")
245 .Using(
new BasicShaderPlugin(
"ShadingTexturing"));
247 EffectOld mixEffect = engineContext.RenderContext.BuildEffect(
"Mix")
249 .Using(
new BasicShaderPlugin(
"ShadingTexturing"))
250 .Using(
new BasicShaderPlugin(
"PosteffectTexturing2"));
252 EffectOld fxaaEffect = engineContext.RenderContext.BuildEffect(
"Fxaa")
254 .Using(
new BasicShaderPlugin(
"PostEffectFXAA.pdxsl"));
259 var downsampleMeshes =
new EffectMesh[bloomLevels];
260 var lastBlurs =
new EffectMesh[bloomLevels];
261 for (
int i = 0; i < bloomLevels; ++i)
263 downsampleMeshes[i] =
new EffectMesh(i == 0 ? brightPassFilter : downsampleEffect, name:
"Downsample " + i);
264 postEffectPlugin.AddEffectMesh(downsampleMeshes[i]);
267 var blurQuadMesh =
new EffectMesh[2];
268 for (
int j = 0; j < 2; ++j)
270 blurQuadMesh[j] =
new EffectMesh(blurEffect, name:
string.Format(
"Blur level {0}:{1}", i, j));
271 blurQuadMesh[j].Parameters.Set(PostEffectBlurKeys.Coefficients,
new[] { 0.30f, 0.20f, 0.20f, 0.15f, 0.15f });
272 var unit = j == 0 ? Vector2.UnitX : Vector2.UnitY;
273 blurQuadMesh[j].Parameters.Set(PostEffectBlurKeys.Offsets,
new[] { Vector2.Zero, unit * -1.3862832f, unit * +1.3862832f, unit * -3.2534592f, unit * +3.2534592f });
274 postEffectPlugin.AddEffectMesh(blurQuadMesh[j]);
276 lastBlurs[i] = blurQuadMesh[1];
277 postEffectPlugin.AddLink(downsampleMeshes[i], RenderTargetKeys.RenderTarget, blurQuadMesh[0], TexturingKeys.Texture0,
new TextureDescription { Width = 1024 >> (i + 1), Height = 768 >> (i + 1), Format = PixelFormat.R8G8B8A8_UNorm });
278 postEffectPlugin.AddLink(blurQuadMesh[0], RenderTargetKeys.RenderTarget, blurQuadMesh[1], TexturingKeys.Texture0);
280 postEffectPlugin.AddLink(downsampleMeshes[i - 1], RenderTargetKeys.RenderTarget, downsampleMeshes[i], TexturingKeys.Texture0);
284 EffectMesh lastMix = null;
285 for (
int i = 0; i < bloomLevels; ++i)
287 var mixMesh =
new EffectMesh(mixEffect, name:
"Mix " + (bloomLevels - 1 - i));
288 mixMesh.Parameters.Set(PostEffectKeys.MixCoefficients, (i < bloomLevels - 1) ?
new[] { 0.10f, 0.90f } :
new[] { 1.0f, 3.0f });
289 postEffectPlugin.AddEffectMesh(mixMesh);
292 if (i < bloomLevels - 1)
293 postEffectPlugin.AddLink(lastBlurs[bloomLevels - 2 - i], RenderTargetKeys.RenderTarget, mixMesh, TexturingKeys.Texture0);
294 postEffectPlugin.AddLink(lastMix ?? lastBlurs[bloomLevels - 1], RenderTargetKeys.RenderTarget, mixMesh, TexturingKeys.Texture2);
299 EffectMesh lastEffectMesh = lastMix;
304 var fxaaQuadMesh =
new EffectMesh(fxaaEffect, name:
"FXAA level");
305 postEffectPlugin.AddEffectMesh(fxaaQuadMesh);
306 postEffectPlugin.AddLink(lastMix, RenderTargetKeys.RenderTarget, fxaaQuadMesh, TexturingKeys.Texture0,
new TextureDescription { Width = 1024, Height = 768, Format = PixelFormat.R8G8B8A8_UNorm });
307 lastEffectMesh = fxaaQuadMesh;
310 engineContext.RenderContext.GraphicsResizeContext.SetupResize((resizeContext) =>
312 var renderTarget = renderingSetup.MainTargetPlugin.RenderTarget;
315 downsampleMeshes[0].Parameters.SetWithResize(resizeContext, TexturingKeys.Texture0, (
Texture2D)renderTarget.Texture);
316 lastMix.Parameters.SetWithResize(resizeContext, TexturingKeys.Texture0, (
Texture2D)renderTarget.Texture);
317 lastMix.Parameters.SetWithResize(resizeContext, RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget);
319 lastEffectMesh.Parameters.SetWithResize(resizeContext, RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget);
325 EffectOld fxaaEffect = engineContext.RenderContext.BuildEffect(
"Fxaa")
327 .Using(
new BasicShaderPlugin(
"..\\..\\sources\\shaders\\posteffect_fxaa.pdxsl"));
329 var fxaaQuadMesh =
new EffectMesh(fxaaEffect, name:
"FXAA level");
331 fxaaQuadMesh.Parameters.Set(TexturingKeys.Texture0, (
Texture2D)renderingSetup.MainTargetPlugin.RenderTarget.Texture);
332 fxaaQuadMesh.Parameters.Set(RenderTargetKeys.RenderTarget, engineContext.RenderContext.RenderTarget);
335 postEffectPlugin.AddEffectMesh(fxaaQuadMesh);
340 foreach (var mesh
in postEffectPlugin.Meshes)
341 effectMeshGroup.AddMesh(mesh);
345 engineContext.RenderContext.GraphicsResizeContext.SetupResize((resizeContext) =>
348 postEffectPlugin.Resolve();
365 [XmlAttribute(
"pipeline_features")]
368 [XmlAttribute(
"tessellation")]
371 [XmlAttribute(
"scene")]
374 [XmlAttribute(
"syncfolder")]
377 [XmlAttribute(
"synthetic")]
380 [XmlAttribute(
"particles")]
383 [XmlAttribute(
"bloom")]
387 public bool AO {
get; set; }
389 [XmlAttribute(
"yebis")]
392 [XmlAttribute(
"lightshafts")]
395 [XmlAttribute(
"fxaa")]
404 public static async
Task Run(EngineContext engineContext)
406 await TaskEx.Delay(1000);
414 public static async
Task Run(EngineContext engineContext)
416 await TaskEx.Delay(1000);
static async Task Run(EngineContext engineContext)
Add a light to an Entity, that will be used during rendering.
A particle system, containing particles and their updaters.
Game entity. It usually aggregates multiple EntityComponent
SiliconStudio.Paradox.Engine.MeshProcessor MeshProcessor
Scene as exported by third-party exporters (FBX, Assimp, etc...)
static async Task LoadDude(EngineContext engineContext)
static async Task Run(EngineContext engineContext)
System.Threading.Tasks.Task Task
TransformationComponent Transformation
Gets or sets the Transformation associated to this entity. Added for convenience over usual Get/Set m...
This processor will take care of adding/removing children of every Entity added/removed in the Entity...
static readonly RenderingSetup Singleton
static void PipelineSetup(EngineContext engineContext, string effectFilename=null)
A Common description for all textures.
static async Task Run(EngineContext engineContext)
SiliconStudio.Core.Mathematics.Color Color
Plugin used for the main rendering view.
A Texture 2D frontend to SharpDX.Direct3D11.Texture2D.
static async Task SetupPostEffects(EngineContext engineContext)
static async Task SetupFactory(EngineContext engineContext, string effectName="Simple")
static async Task RunDebug(EngineContext engineContext)
static async Task Run2(EngineContext engineContext)
static void CommonSetup(EngineContext engineContext)
SiliconStudio.Core.Mathematics.Vector3 Vector3
Base class for texture resources.