Advertisement
Guest User

Untitled

a guest
Feb 11th, 2021
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.94 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Microsoft.Xna.Framework;
  5. using Microsoft.Xna.Framework.Audio;
  6. using Microsoft.Xna.Framework.Content;
  7. //using Microsoft.Xna.Framework.GamerServices;
  8. using Microsoft.Xna.Framework.Graphics;
  9. using Microsoft.Xna.Framework.Input;
  10. using Microsoft.Xna.Framework.Media;
  11. using BootHillHeroes.GameScreens;
  12. using BootHillHeroes.Components;
  13. using Skyboxes;
  14. //using Microsoft.Xna.Framework.Net;
  15. //using Microsoft.Xna.Framework.Storage;
  16.  
  17. namespace BHB_Code.Hall.FirstShader
  18. {
  19. public enum EffectTechnique
  20. {
  21. Default,
  22. Ambient,
  23. Diffuse,
  24. Specular,
  25. SpecularTwo,
  26. Texture,
  27. NormalMap,
  28. Toon,
  29. }
  30.  
  31. /// <summary>
  32. /// This is the main type for your game
  33. /// </summary>
  34. public class FirstShader
  35. {
  36. GraphicsDeviceManager graphics;
  37. SpriteBatch spriteBatch;
  38.  
  39. Matrix world = Matrix.CreateTranslation(0, 0, 0);
  40. Matrix view = Matrix.CreateLookAt(new Vector3(0, 0, 10), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
  41. Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45), 800f / 600f, 0.1f, 100f);
  42. BasicEffect effect;
  43. Effect specularEffect;
  44. Effect specularTwoEffect;
  45. Effect ambientEffect;
  46. Effect diffuseEffect;
  47. Effect textureEffect;
  48. Effect normalMapEffect;
  49. Effect toonEffect;
  50. float angle = 0;
  51. float distance = 10;
  52.  
  53. Texture2D texture;
  54. Texture2D normalMap;
  55.  
  56. Model model;
  57. Vector3 viewVector;
  58. GraphicsDevice device;
  59. Vector3 camPosition = Vector3.Zero;
  60. List<EffectTechnique> effectTechniques = new List<EffectTechnique>() {
  61. EffectTechnique.Default,
  62. EffectTechnique.Ambient,
  63. EffectTechnique.Diffuse,
  64. EffectTechnique.Specular,
  65. EffectTechnique.SpecularTwo,
  66. EffectTechnique.Texture,
  67. EffectTechnique.NormalMap,
  68. EffectTechnique.Toon,
  69. };
  70. int effectIndex = 0;
  71.  
  72. //For skybox
  73. Skybox skybox;
  74.  
  75. //public FirstShader(GraphicsDeviceManager Graphics, SpriteBatch SpriteBatch)
  76. public FirstShader(GraphicsDevice Device)
  77. {
  78. device = Device;
  79.  
  80. effect = new BasicEffect(device);
  81. //graphics = new GraphicsDeviceManager(this);
  82. //spriteBatch = SpriteBatch;
  83. model = DataManager.GetModel("Helicopter6", BaseGameState.PlayerContent);
  84. ambientEffect = DataManager.GetEffect("Ambient", BaseGameState.PlayerContent);
  85. diffuseEffect = DataManager.GetEffect("Diffuse", BaseGameState.PlayerContent);
  86. specularEffect = DataManager.GetEffect("Specular", BaseGameState.PlayerContent);
  87. specularTwoEffect = DataManager.GetEffect("Specular2", BaseGameState.PlayerContent);
  88. textureEffect = DataManager.GetEffect("Texture", BaseGameState.PlayerContent);
  89. texture = DataManager.GetMansionTexture("helicopterTexture", BaseGameState.PlayerContent);
  90. normalMapEffect = DataManager.GetEffect("NormalMap", BaseGameState.PlayerContent);
  91. normalMap = DataManager.GetMansionTexture("helicopterNormalMap", BaseGameState.PlayerContent);
  92. toonEffect = DataManager.GetEffect("Toon", BaseGameState.PlayerContent);
  93.  
  94. //skybox
  95. skybox = new Skyboxes.Skybox();
  96.  
  97. }
  98.  
  99.  
  100.  
  101. public void Update(GameTime gameTime)
  102. {
  103. if (XRpgLibrary.InputHandler.KeyReleased(Keys.Right)) //move left
  104. {
  105. effectIndex++;
  106. if (effectIndex > effectTechniques.Count - 1)
  107. effectIndex = 0;
  108. }
  109. if (XRpgLibrary.InputHandler.KeyReleased(Keys.Left)) //move left
  110. {
  111. effectIndex--;
  112. if (effectIndex < 0)
  113. effectIndex = effectTechniques.Count - 1;
  114. }
  115.  
  116.  
  117. angle += 0.002f;
  118.  
  119. //view = Matrix.CreateLookAt(distance * new Vector3((float)Math.Sin(angle), 0, (float)Math.Cos(angle)), new Vector3(0, 0, 0), new Vector3(0, 1, 0));
  120.  
  121.  
  122. Vector3 cameraLocation = distance * new Vector3((float)Math.Sin(angle), 0, (float)Math.Cos(angle));
  123.  
  124. camPosition = cameraLocation;
  125.  
  126.  
  127. Vector3 cameraTarget = new Vector3(0, 0, 0);
  128. viewVector = Vector3.Transform(cameraTarget - cameraLocation, Matrix.CreateRotationY(0));
  129. viewVector.Normalize();
  130.  
  131. //these two views are essentially the same
  132. view = Matrix.CreateLookAt(camPosition, new Vector3(0, 0, 0), Vector3.UnitY);
  133. //view = Matrix.CreateLookAt(cameraLocation, cameraTarget, new Vector3(0, 1, 0));
  134.  
  135. }
  136. public void Draw(GameTime gameTime)
  137. {
  138. device.Clear(Color.Black);
  139. device.BlendState = BlendState.Opaque;
  140. device.DepthStencilState = DepthStencilState.Default;
  141.  
  142.  
  143. RasterizerState originalRasterizerState = device.RasterizerState;
  144. RasterizerState rasterizerState = new RasterizerState();
  145. rasterizerState.CullMode = CullMode.None;
  146. device.RasterizerState = rasterizerState;
  147. skybox.Draw(view, projection, camPosition);
  148. device.RasterizerState = originalRasterizerState;
  149.  
  150. switch (effectTechniques[effectIndex])
  151. {
  152. case EffectTechnique.Default:
  153. DrawModel(model, world, view, projection);
  154. break;
  155. case EffectTechnique.Ambient:
  156. DrawModelWithAmbientEffect(model, world, view, projection);
  157. break;
  158. case EffectTechnique.Diffuse:
  159. DrawModelWithDiffuseEffect(model, world, view, projection);
  160. break;
  161. case EffectTechnique.Specular:
  162. DrawModelWithSpecularEffect(model, world, view, projection);
  163. break;
  164. case EffectTechnique.SpecularTwo:
  165. DrawModelWithSpecularTwoEffect(model, world, view, projection);
  166. break;
  167. case EffectTechnique.Texture:
  168. DrawModelWithTextureEffect(model, world, view, projection);
  169. break;
  170. case EffectTechnique.NormalMap:
  171. DrawModelWithNormalMapEffect(model, world, view, projection);
  172. break;
  173. case EffectTechnique.Toon:
  174. DrawModelWithToonEffect(model, world, view, projection);
  175. break;
  176. default:
  177. throw new Exception("technique not found");
  178. }
  179.  
  180.  
  181. }
  182.  
  183. private void DrawModel(Model model, Matrix world, Matrix view, Matrix projection)
  184. {
  185. foreach (ModelMesh mesh in model.Meshes)
  186. {
  187. foreach (ModelMeshPart part in mesh.MeshParts)
  188. {
  189. part.Effect = effect;
  190. effect.EnableDefaultLighting();
  191. effect.PreferPerPixelLighting = true;
  192. //effect.TextureEnabled = true;
  193. //effect.Texture = texture;
  194. effect.World = world * mesh.ParentBone.Transform;
  195. effect.View = view;
  196. effect.Projection = projection;
  197. }
  198.  
  199. mesh.Draw();
  200. }
  201. }
  202.  
  203. private void DrawModelWithAmbientEffect(Model model, Matrix world, Matrix view, Matrix projection)
  204. {
  205.  
  206. device.DepthStencilState = DepthStencilState.Default;
  207.  
  208. foreach (ModelMesh mesh in model.Meshes)
  209. {
  210. foreach (ModelMeshPart part in mesh.MeshParts)
  211. {
  212. part.Effect = ambientEffect;
  213. ambientEffect.Parameters["World"].SetValue(world * mesh.ParentBone.Transform);
  214. ambientEffect.Parameters["View"].SetValue(view);
  215. ambientEffect.Parameters["Projection"].SetValue(projection);
  216. ambientEffect.Parameters["AmbientColor"].SetValue(Color.Green.ToVector4());
  217. ambientEffect.Parameters["AmbientIntensity"].SetValue(0.5f);
  218. }
  219. mesh.Draw();
  220. }
  221. }
  222.  
  223.  
  224. private void DrawModelWithDiffuseEffect(Model model, Matrix world, Matrix view, Matrix projection)
  225. {
  226.  
  227. device.DepthStencilState = DepthStencilState.Default;
  228.  
  229. foreach (ModelMesh mesh in model.Meshes)
  230. {
  231. foreach (ModelMeshPart part in mesh.MeshParts)
  232. {
  233. part.Effect = diffuseEffect;
  234. diffuseEffect.Parameters["World"].SetValue(world * mesh.ParentBone.Transform);
  235. diffuseEffect.Parameters["View"].SetValue(view);
  236. diffuseEffect.Parameters["Projection"].SetValue(projection);
  237. Matrix worldInverseTransposeMatrix = Matrix.Transpose(Matrix.Invert(mesh.ParentBone.Transform * world));
  238. diffuseEffect.Parameters["WorldInverseTranspose"].SetValue(worldInverseTransposeMatrix);
  239. }
  240. mesh.Draw();
  241. }
  242. }
  243.  
  244.  
  245. private void DrawModelWithSpecularEffect(Model model, Matrix world, Matrix view, Matrix projection)
  246. {
  247.  
  248.  
  249. foreach (ModelMesh mesh in model.Meshes)
  250. {
  251. foreach (ModelMeshPart part in mesh.MeshParts)
  252. {
  253.  
  254. part.Effect = specularEffect;
  255. specularEffect.Parameters["World"].SetValue(world * mesh.ParentBone.Transform);
  256. specularEffect.Parameters["View"].SetValue(view);
  257. specularEffect.Parameters["Projection"].SetValue(projection);
  258. specularEffect.Parameters["ViewVector"].SetValue(viewVector);
  259.  
  260. Matrix worldInverseTransposeMatrix = Matrix.Transpose(Matrix.Invert(mesh.ParentBone.Transform * world));
  261. specularEffect.Parameters["WorldInverseTranspose"].SetValue(worldInverseTransposeMatrix);
  262. }
  263. mesh.Draw();
  264. }
  265. }
  266.  
  267.  
  268.  
  269. private void DrawModelWithSpecularTwoEffect(Model model, Matrix world, Matrix view, Matrix projection)
  270. {
  271.  
  272.  
  273. foreach (ModelMesh mesh in model.Meshes)
  274. {
  275. foreach (ModelMeshPart part in mesh.MeshParts)
  276. {
  277.  
  278. part.Effect = specularTwoEffect;
  279. specularTwoEffect.Parameters["World"].SetValue(world * mesh.ParentBone.Transform);
  280. specularTwoEffect.Parameters["View"].SetValue(view);
  281. specularTwoEffect.Parameters["Projection"].SetValue(projection);
  282. specularTwoEffect.Parameters["CamPosition"].SetValue(camPosition);
  283.  
  284. Matrix worldInverseTransposeMatrix = Matrix.Transpose(Matrix.Invert(mesh.ParentBone.Transform * world));
  285. specularTwoEffect.Parameters["WorldInverseTranspose"].SetValue(worldInverseTransposeMatrix);
  286. }
  287. mesh.Draw();
  288. }
  289. }
  290.  
  291.  
  292.  
  293. private void DrawModelWithTextureEffect(Model model, Matrix world, Matrix view, Matrix projection)
  294. {
  295. foreach (ModelMesh mesh in model.Meshes)
  296. {
  297. foreach (ModelMeshPart part in mesh.MeshParts)
  298. {
  299.  
  300. part.Effect = textureEffect;
  301. textureEffect.Parameters["World"].SetValue(world * mesh.ParentBone.Transform);
  302. textureEffect.Parameters["View"].SetValue(view);
  303. textureEffect.Parameters["Projection"].SetValue(projection);
  304. textureEffect.Parameters["ViewVector"].SetValue(viewVector);
  305. textureEffect.Parameters["ModelTexture"].SetValue(texture);
  306.  
  307. Matrix worldInverseTransposeMatrix = Matrix.Transpose(Matrix.Invert(mesh.ParentBone.Transform * world));
  308. textureEffect.Parameters["WorldInverseTranspose"].SetValue(worldInverseTransposeMatrix);
  309. }
  310. mesh.Draw();
  311. }
  312. }
  313.  
  314. private void DrawModelWithNormalMapEffect(Model model, Matrix world, Matrix view, Matrix projection)
  315. {
  316. foreach (ModelMesh mesh in model.Meshes)
  317. {
  318. foreach (ModelMeshPart part in mesh.MeshParts)
  319. {
  320.  
  321. part.Effect = normalMapEffect;
  322. normalMapEffect.Parameters["World"].SetValue(world * mesh.ParentBone.Transform);
  323. normalMapEffect.Parameters["View"].SetValue(view);
  324. normalMapEffect.Parameters["Projection"].SetValue(projection);
  325. normalMapEffect.Parameters["ViewVector"].SetValue(viewVector);
  326. normalMapEffect.Parameters["ModelTexture"].SetValue(texture);
  327. normalMapEffect.Parameters["NormalMap"].SetValue(normalMap); //remember that if this brings it might be because the tangents frames are not generated. You can fix this by checking "GenerateTangentFrames" on the MG pipeline
  328. //although it may take a few rebuilds to work
  329. Matrix worldInverseTransposeMatrix = Matrix.Transpose(Matrix.Invert(mesh.ParentBone.Transform * world));
  330. normalMapEffect.Parameters["WorldInverseTranspose"].SetValue(worldInverseTransposeMatrix);
  331. }
  332. mesh.Draw();
  333. }
  334. }
  335.  
  336.  
  337.  
  338. private void DrawModelWithToonEffect(Model model, Matrix world, Matrix view, Matrix projection)
  339. {
  340. foreach (ModelMesh mesh in model.Meshes)
  341. {
  342. foreach (ModelMeshPart part in mesh.MeshParts)
  343. {
  344.  
  345. part.Effect = textureEffect;
  346. textureEffect.Parameters["World"].SetValue(world * mesh.ParentBone.Transform);
  347. textureEffect.Parameters["View"].SetValue(view);
  348. textureEffect.Parameters["Projection"].SetValue(projection);
  349. textureEffect.Parameters["ViewVector"].SetValue(viewVector);
  350. textureEffect.Parameters["ModelTexture"].SetValue(texture);
  351.  
  352. Matrix worldInverseTransposeMatrix = Matrix.Transpose(Matrix.Invert(mesh.ParentBone.Transform * world));
  353. textureEffect.Parameters["WorldInverseTranspose"].SetValue(worldInverseTransposeMatrix);
  354. }
  355. mesh.Draw();
  356. }
  357. }
  358. }
  359. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement