git-svn-id: svn://svn.ijw.co.nz/svn/OpenRa@1135 993157c7-ee19-0410-b2c4-bb4e9862e678

This commit is contained in:
chrisf
2007-07-07 07:57:35 +00:00
parent 3f052e425f
commit 91e573dcd4
2 changed files with 100 additions and 8 deletions

View File

@@ -21,6 +21,7 @@ namespace OpenRa.Game
string TileSuffix;
const string mapName = "scm12ea.ini";
const string shaderName = "diffuse.fx";
Dictionary<TileReference, SheetRectangle<Sheet>> tileMapping =
new Dictionary<TileReference, SheetRectangle<Sheet>>();
@@ -29,6 +30,11 @@ namespace OpenRa.Game
Dictionary<Sheet, IndexBuffer> drawBatches = new Dictionary<Sheet, IndexBuffer>();
Effect effect;
IntPtr textureParameter;
SpriteHelper spriteHelper;
FontHelper fontHelper;
void LoadTextures()
{
List<Sheet> tempSheets = new List<Sheet>();
@@ -62,6 +68,22 @@ namespace OpenRa.Game
s.LoadTexture(device);
}
float U(SheetRectangle<Sheet> s, float u)
{
float u0 = (float)s.origin.X / (float)s.sheet.bitmap.Width;
float u1 = (float)(s.origin.X + s.size.Width) / (float)s.sheet.bitmap.Width;
return (1 - u) * u0 + u * u1;
}
float V(SheetRectangle<Sheet> s, float v)
{
float v0 = (float)s.origin.Y / (float)s.sheet.bitmap.Height;
float v1 = (float)(s.origin.Y + s.size.Height) / (float)s.sheet.bitmap.Height;
return (1 - v) * v0 + v * v1;
}
void LoadVertexBuffer()
{
Dictionary<Sheet, List<ushort>> indexMap = new Dictionary<Sheet, List<ushort>>();
@@ -74,10 +96,10 @@ namespace OpenRa.Game
ushort offset = (ushort)(4 * (i * 128 + j));
vertices[offset] = new Vertex(24 * i, 24 * j, 0, 0, 0);
vertices[offset + 1] = new Vertex(24 + 24 * i, 24 * j, 0, 1, 0);
vertices[offset + 2] = new Vertex(24 * i, 24 + 24 * j, 0, 0, 1);
vertices[offset + 3] = new Vertex(24 + 24 * i, 24 + 24 * j, 0, 1, 1);
vertices[offset] = new Vertex(24 * i, 24 * j, 0, U(tile,0), V(tile,0));
vertices[offset + 1] = new Vertex(24 + 24 * i, 24 * j, 0, U(tile,1), V(tile,0));
vertices[offset + 2] = new Vertex(24 * i, 24 + 24 * j, 0, U(tile,0), V(tile,1));
vertices[offset + 3] = new Vertex(24 + 24 * i, 24 + 24 * j, 0, U(tile,1), V(tile,1));
List<ushort> indexList;
if (!indexMap.TryGetValue(tile.sheet, out indexList))
@@ -120,6 +142,12 @@ namespace OpenRa.Game
LoadTextures();
LoadVertexBuffer();
effect = new Effect(device, File.OpenRead("../../../" + shaderName));
textureParameter = effect.GetHandle("DiffuseTexture");
spriteHelper = new SpriteHelper(device);
fontHelper = new FontHelper(device, "Tahoma", 10, false);
}
internal void Run()
@@ -134,21 +162,32 @@ namespace OpenRa.Game
void Frame()
{
device.Begin();
device.Clear(0);
// render something :)
device.Clear( Color.Red.ToArgb(), Surfaces.Color );
vertexBuffer.Bind(0);
effect.Quality = ShaderQuality.Low;
effect.Begin();
effect.BeginPass(0);
foreach (KeyValuePair<Sheet, IndexBuffer> batch in drawBatches)
{
//todo: bind texture!
effect.SetTexture(textureParameter, batch.Key.texture);
effect.Commit();
batch.Value.Bind();
device.DrawIndexedPrimitives(PrimitiveType.TriangleList,
vertexBuffer.Size, batch.Value.Size / 3);
}
effect.EndPass();
effect.End();
spriteHelper.Begin();
fontHelper.Draw(spriteHelper, "fps: 1337", 0, 0, Color.White.ToArgb());
spriteHelper.End();
device.End();
device.Present();
}

53
diffuse.fx Normal file
View File

@@ -0,0 +1,53 @@
// OpenRA test shader
// Author: C. Forbes
//--------------------------------------------------------
shared texture DiffuseTexture;
sampler s_DiffuseTexture = sampler_state {
Texture = <DiffuseTexture>;
MinFilter = None;
MagFilter = None;
MipFilter = None;
AddressU = Wrap;
AddressV = Wrap;
AddressW = Wrap;
};
struct VertexIn {
float4 Position: POSITION;
float2 Tex0: TEXCOORD0;
};
struct VertexOut {
float4 Position: POSITION;
float2 Tex0: TEXCOORD0;
};
struct FragmentIn {
float2 Tex0: TEXCOORD0;
};
VertexOut Simple_vp(VertexIn v) {
VertexOut o;
o.Position = float4( v.Position.x / 320.0f - 0.5f - 2, 5-v.Position.y / 240.0f, 0, 1 );
o.Tex0 = v.Tex0;
return o;
}
float4 Simple_fp(FragmentIn f) : COLOR0 {
float4 color = tex2D(s_DiffuseTexture, f.Tex0);
return color;
}
technique low_quality {
pass p0 {
AlphaBlendEnable = false;
ZWriteEnable = true;
ZEnable = false;
CullMode = None;
VertexShader = compile vs_2_0 Simple_vp();
PixelShader = compile ps_2_0 Simple_fp();
}
}