2.11.8. Complete source code
using System;
using System.Collections.Generic;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Net;
using Microsoft.Xna.Framework.Storage;
using BetaCell.Debug;
using BetaCell.Util.GlobalInfo.Content;
using BetaCell.Environment.Camera;
using BetaCell.Util.GlobalInfo;
using BetaCell.Util.RenderStates;
using BetaCell.Environment.Mesh.Visitors;
using BetaCell.Environment;
using BetaCell.Environment.Light;
using BetaCell.Effects;
using BetaCell.Util.Procedural;
using BetaCell.Common.Vertex;
using BetaCell.Environment.Texture.Feeder;
using BetaCell.Environment.Texture;
using BetaCell.Dynamic.Billboard;
using BetaCell.Effects.Composer;
using BetaCell.Environment.Mesh;
namespace Starter
{
/// <summary>
/// This is the main type for your game
/// </summary>
public class Game1 : Microsoft.Xna.Framework.Game
{
//Game attributes
GraphicsDeviceManager
graphics;
GraphicsDevice device;
ContentManager content;
BCFirstPersonHumanCamera
camera;
//end game attributes
//This tutorial's attributes
BCMesh plane;
BCMesh trees;
BCAlphaGreaterRenderStrategy
alphaBlock;
public Game1()
{
graphics = new GraphicsDeviceManager(this);
graphics.PreferredDepthStencilFormat = DepthFormat.Depth24Stencil8;
content = new ContentManager(Services);
#if(XBOX360)
graphics.PreferredBackBufferWidth = 1280;
graphics.PreferredBackBufferHeight = 720;
#else
graphics.PreferredBackBufferWidth = 852;
graphics.PreferredBackBufferHeight = 480;
#endif
}
protected override void
Initialize()
{
//base initialization
device = graphics.GraphicsDevice;
BCLogger.instance.init(device, content);
BCInitializationManager.initialize(content);
OnActivated(null, null);
alphaBlock = new BCAlphaGreaterRenderStrategy();
recreateScene();
base.Initialize();
}
private void recreateScene()
{
BCMaterialBase material = new BCMaterialBase();
material.specRange = 0.8f;
material.diff = new Color(255, 255, 255, 128);
material.spec = Color.White;
material.amb = Color.LightGray;
BCMaterialVisitor materialSetter = new BCMaterialVisitor(material);
BCColorSet colorSet = new BCColorSet(Color.Black);
BCDynamicEffectVisitor colorSetter =
new BCDynamicEffectVisitor(colorSet.getFunction("Shader.ColorSet"),
colorSet, 0);
BCBasicLight light = new BCBasicLight();
light.range = 2000;
light.transform = Matrix.CreateTranslation(-1, -1, -1);
light.constAtten = 1;
light.linAtten = 0;
light.cubAtten = 0;
light.spotRange = 0.9f;
light.useShadows = false;
BCDynamicEffectVisitor lightSetter = new BCDynamicEffectVisitor(
light.getFunction("Shader.Light.Classic.PixelDirectionLight"),
light,
BCDynamicEffect.MAX_FUNCTIONS
);
Vector3[] billboardPositions = new Vector3[5];
billboardPositions[0] = new Vector3(10, 5, 0);
billboardPositions[1] = new Vector3(10, 5, 10);
billboardPositions[2] = new Vector3(20, 5, -10);
billboardPositions[3] = new Vector3(30, 5, -30);
billboardPositions[4] = new Vector3(10, 5, 20);
trees =
ProceduralModelers.BILLBOARD_MODELER.createStaticBillboard(
billboardPositions,
10, 7,
new BCVertexPosNorTexContainer());
BCMeshGraphicUtil.init(trees, device);
//Setting texture
BCTextureVisitor textureSetter = new BCTextureVisitor(
"tex",
new
BCMemoryTextureStrategy(content.Load<Texture2D>("Content/gameAssets/tree"))
);
BCBillboardFeeder billboard = new BCBillboardFeeder();
BCFunction billboardFunction =
billboard.getFunction("Actuator.Billboard.Billboard");
BCDynamicEffectVisitor billboardSetter =
new BCDynamicEffectVisitor(billboardFunction, billboard, 0
);
BCTextureFeeder texFeeder = new BCTextureFeeder();
texFeeder.addSampler(
"tex",
new BCSampler(
"LINEAR", "LINEAR", "LINEAR", "4",
"WRAP", "WRAP", "0xffffffff"
)
);
BCDynamicEffectVisitor textureEffectSetter = new BCDynamicEffectVisitor(
texFeeder.getFunction("Shader.Texture.Texture"),
texFeeder,
BCDynamicEffect.MAX_FUNCTIONS
);
trees.visit(materialSetter);
trees.visit(textureSetter);
trees.visit(billboardSetter);
trees.visit(colorSetter);
trees.visit(lightSetter);
trees.visit(textureEffectSetter);
//-----
//plane
//-----
textureSetter.strategy = new
BCMemoryTextureStrategy("Content/gameAssets/ground0", content);
plane = ProceduralModelers.PLANE_MODELER.createPlane(
10, 10, 10, 10, new Vector3(0, 0, 0),
new BCVertexPosNorTexContainer(),
4);
BCMeshGraphicUtil.init(plane, device);
plane.visit(materialSetter);
plane.visit(textureSetter);
plane.visit(colorSetter);
plane.visit(lightSetter);
plane.visit(textureEffectSetter);
}
protected override void
OnActivated(object sender, EventArgs args)
{
buildViewMatrix();
base.OnActivated(sender, args);
}
void buildViewMatrix()
{
Vector3 pos = new Vector3(40, 5, 40);
Vector3 look = new Vector3(-4, -0.5f, -4);
look.Normalize();
camera = new BCFirstPersonHumanCamera(look, pos,
MathHelper.PiOver4,
(float)this.Window.ClientBounds.Width /
(float)this.Window.ClientBounds.Height,
1f, 200);
BCGlobalInfo.instance.setMatrix(
BCGlobalInfo.VIEW_INDEX,
camera.getViewMatrix(-1)
);
BCGlobalInfo.instance.setMatrix(
BCGlobalInfo.PROJECTION_INDEX,
camera.getProjectionMatrix(-1)
);
}
protected override void
Update(GameTime gameTime)
{
}
protected override void
Draw(GameTime gameTime)
{
graphics.GraphicsDevice.Clear(ClearOptions.Target |
ClearOptions.DepthBuffer, Color.White, 1.0f, 0);
plane.Draw(gameTime);
alphaBlock.push(device);
trees.Draw(gameTime);
alphaBlock.pop(device);
BCLogger.instance.printFPS(gameTime);
BCLogger.instance.flush();
base.Draw(gameTime);
}
}
}