works :D
This commit is contained in:
@@ -48,11 +48,19 @@ namespace OpenRa.Graphics
|
|||||||
device.Begin();
|
device.Begin();
|
||||||
device.Clear(Color.Black);
|
device.Clear(Color.Black);
|
||||||
|
|
||||||
SpriteShader.SetValue("Palette", PaletteTexture);
|
SetShaderParams( SpriteShader, r1, r2, scroll );
|
||||||
SpriteShader.SetValue("Scroll", scroll.X, scroll.Y);
|
SetShaderParams( LineShader, r1, r2, scroll );
|
||||||
SpriteShader.SetValue("r1", r1.X, r1.Y);
|
SetShaderParams( RgbaSpriteShader, r1, r2, scroll );
|
||||||
SpriteShader.SetValue("r2", r2.X, r2.Y);
|
SetShaderParams( WorldSpriteShader, r1, r2, scroll );
|
||||||
SpriteShader.Commit();
|
}
|
||||||
|
|
||||||
|
private void SetShaderParams( Shader s, float2 r1, float2 r2, float2 scroll )
|
||||||
|
{
|
||||||
|
s.SetValue( "Palette", PaletteTexture );
|
||||||
|
s.SetValue( "Scroll", scroll.X, scroll.Y );
|
||||||
|
s.SetValue( "r1", r1.X, r1.Y );
|
||||||
|
s.SetValue( "r2", r2.X, r2.Y );
|
||||||
|
s.Commit();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void EndFrame()
|
public void EndFrame()
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ namespace OpenRa.Graphics
|
|||||||
if (sprites > 0)
|
if (sprites > 0)
|
||||||
{
|
{
|
||||||
shader.Quality = quality;
|
shader.Quality = quality;
|
||||||
|
shader.SetValue( "DiffuseTexture", currentSheet.Texture );
|
||||||
shader.Render(() =>
|
shader.Render(() =>
|
||||||
{
|
{
|
||||||
vertexBuffer.SetData(vertices);
|
vertexBuffer.SetData(vertices);
|
||||||
|
|||||||
@@ -79,6 +79,7 @@ namespace OpenRa.Graphics
|
|||||||
}
|
}
|
||||||
|
|
||||||
renderer.SpriteShader.Quality = ShaderQuality.Low;
|
renderer.SpriteShader.Quality = ShaderQuality.Low;
|
||||||
|
renderer.SpriteShader.SetValue( "DiffuseTexture", terrainSheet.Texture );
|
||||||
renderer.SpriteShader.Render(() =>
|
renderer.SpriteShader.Render(() =>
|
||||||
renderer.DrawBatch(vertexBuffer, indexBuffer,
|
renderer.DrawBatch(vertexBuffer, indexBuffer,
|
||||||
new Range<int>(verticesPerRow * firstRow, verticesPerRow * lastRow),
|
new Range<int>(verticesPerRow * firstRow, verticesPerRow * lastRow),
|
||||||
|
|||||||
@@ -50,7 +50,7 @@ namespace OpenRa.GlRenderer
|
|||||||
Wgl.wglMakeCurrent(dc, rc);
|
Wgl.wglMakeCurrent(dc, rc);
|
||||||
|
|
||||||
cgContext = Cg.cgCreateContext();
|
cgContext = Cg.cgCreateContext();
|
||||||
//Cg.cgSetErrorCallback(CgErrorCallback);
|
Cg.cgSetErrorCallback(CgErrorCallback);
|
||||||
|
|
||||||
CgGl.cgGLRegisterStates(cgContext);
|
CgGl.cgGLRegisterStates(cgContext);
|
||||||
CgGl.cgGLSetManageTextureParameters(cgContext, true);
|
CgGl.cgGLSetManageTextureParameters(cgContext, true);
|
||||||
@@ -59,20 +59,22 @@ namespace OpenRa.GlRenderer
|
|||||||
|
|
||||||
Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);
|
Gl.glEnableClientState(Gl.GL_VERTEX_ARRAY);
|
||||||
CheckGlError();
|
CheckGlError();
|
||||||
Gl.glEnableClientState(Gl.GL_INDEX_ARRAY);
|
Gl.glEnableClientState(Gl.GL_TEXTURE_COORD_ARRAY);
|
||||||
CheckGlError();
|
CheckGlError();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CgErrorCallback()
|
static Cg.CGerrorCallbackFuncDelegate CgErrorCallback = () =>
|
||||||
{
|
{
|
||||||
var err = Cg.cgGetError();
|
var err = Cg.cgGetError();
|
||||||
var str = Cg.cgGetErrorString(err);
|
var str = Cg.cgGetErrorString( err );
|
||||||
throw new InvalidOperationException(
|
throw new InvalidOperationException(
|
||||||
string.Format("CG Error: {0}: {1}", err, str));
|
string.Format( "CG Error: {0}: {1}", err, str ) );
|
||||||
}
|
};
|
||||||
|
|
||||||
public void EnableScissor(int left, int top, int width, int height)
|
public void EnableScissor(int left, int top, int width, int height)
|
||||||
{
|
{
|
||||||
|
if( width < 0 ) width = 0;
|
||||||
|
if( height < 0 ) height = 0;
|
||||||
Gl.glScissor(left, top, width, height);
|
Gl.glScissor(left, top, width, height);
|
||||||
CheckGlError();
|
CheckGlError();
|
||||||
Gl.glEnable(Gl.GL_SCISSOR_TEST);
|
Gl.glEnable(Gl.GL_SCISSOR_TEST);
|
||||||
@@ -90,7 +92,7 @@ namespace OpenRa.GlRenderer
|
|||||||
|
|
||||||
public void Clear(Color c)
|
public void Clear(Color c)
|
||||||
{
|
{
|
||||||
Gl.glClearColor(1, 1, 1, 1);
|
Gl.glClearColor(0, 0, 0, 0);
|
||||||
CheckGlError();
|
CheckGlError();
|
||||||
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
|
Gl.glClear(Gl.GL_COLOR_BUFFER_BIT);
|
||||||
CheckGlError();
|
CheckGlError();
|
||||||
@@ -110,9 +112,20 @@ namespace OpenRa.GlRenderer
|
|||||||
|
|
||||||
public void DrawIndexedPrimitives(PrimitiveType pt, int numVerts, int numPrimitives)
|
public void DrawIndexedPrimitives(PrimitiveType pt, int numVerts, int numPrimitives)
|
||||||
{
|
{
|
||||||
Gl.glDrawElements((int)pt, numPrimitives, Gl.GL_UNSIGNED_SHORT, IntPtr.Zero);
|
Gl.glDrawElements((int)pt, numPrimitives * IndicesPerPrimitive( pt ), Gl.GL_UNSIGNED_SHORT, IntPtr.Zero);
|
||||||
CheckGlError();
|
CheckGlError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int IndicesPerPrimitive( PrimitiveType pt )
|
||||||
|
{
|
||||||
|
switch( pt )
|
||||||
|
{
|
||||||
|
case PrimitiveType.PointList: return 1;
|
||||||
|
case PrimitiveType.LineList: return 2;
|
||||||
|
case PrimitiveType.TriangleList: return 3;
|
||||||
|
}
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public struct Range<T>
|
public struct Range<T>
|
||||||
@@ -135,7 +148,7 @@ namespace OpenRa.GlRenderer
|
|||||||
{
|
{
|
||||||
Bind();
|
Bind();
|
||||||
Gl.glBufferData(Gl.GL_ARRAY_BUFFER,
|
Gl.glBufferData(Gl.GL_ARRAY_BUFFER,
|
||||||
new IntPtr(Marshal.SizeOf(typeof(T))), data, Gl.GL_DYNAMIC_DRAW);
|
new IntPtr(Marshal.SizeOf(typeof(T))*data.Length), data, Gl.GL_DYNAMIC_DRAW);
|
||||||
GraphicsDevice.CheckGlError();
|
GraphicsDevice.CheckGlError();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -209,7 +222,9 @@ namespace OpenRa.GlRenderer
|
|||||||
public Shader(GraphicsDevice dev, Stream s)
|
public Shader(GraphicsDevice dev, Stream s)
|
||||||
{
|
{
|
||||||
this.dev = dev;
|
this.dev = dev;
|
||||||
var code = new StreamReader(s).ReadToEnd();
|
string code;
|
||||||
|
using (var file = new StreamReader(s))
|
||||||
|
code = file.ReadToEnd();
|
||||||
effect = Cg.cgCreateEffect(dev.cgContext, code, null);
|
effect = Cg.cgCreateEffect(dev.cgContext, code, null);
|
||||||
|
|
||||||
if (effect == IntPtr.Zero)
|
if (effect == IntPtr.Zero)
|
||||||
@@ -230,6 +245,11 @@ namespace OpenRa.GlRenderer
|
|||||||
|
|
||||||
if (highTechnique == IntPtr.Zero && lowTechnique == IntPtr.Zero)
|
if (highTechnique == IntPtr.Zero && lowTechnique == IntPtr.Zero)
|
||||||
throw new InvalidOperationException("No valid techniques");
|
throw new InvalidOperationException("No valid techniques");
|
||||||
|
|
||||||
|
if( highTechnique == IntPtr.Zero )
|
||||||
|
highTechnique = lowTechnique;
|
||||||
|
if( lowTechnique == IntPtr.Zero )
|
||||||
|
lowTechnique = highTechnique;
|
||||||
}
|
}
|
||||||
|
|
||||||
public ShaderQuality Quality { get; set; }
|
public ShaderQuality Quality { get; set; }
|
||||||
@@ -255,13 +275,15 @@ namespace OpenRa.GlRenderer
|
|||||||
|
|
||||||
public void SetValue(string name, Texture texture)
|
public void SetValue(string name, Texture texture)
|
||||||
{
|
{
|
||||||
var param = Cg.cgGetNamedEffectParameter(effect, name);
|
var param = Cg.cgGetNamedEffectParameter( effect, name );
|
||||||
CgGl.cgGLSetupSampler(param, texture.texture);
|
if( param != IntPtr.Zero && texture != null )
|
||||||
|
CgGl.cgGLSetupSampler( param, texture.texture );
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SetValue(string name, float x, float y)
|
public void SetValue(string name, float x, float y)
|
||||||
{
|
{
|
||||||
var param = Cg.cgGetNamedEffectParameter(effect, name);
|
var param = Cg.cgGetNamedEffectParameter(effect, name);
|
||||||
|
if( param != IntPtr.Zero )
|
||||||
CgGl.cgGLSetParameter2f(param, x, y);
|
CgGl.cgGLSetParameter2f(param, x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,6 +303,9 @@ namespace OpenRa.GlRenderer
|
|||||||
|
|
||||||
public void SetData(Bitmap bitmap)
|
public void SetData(Bitmap bitmap)
|
||||||
{
|
{
|
||||||
|
Gl.glBindTexture( Gl.GL_TEXTURE_2D, texture );
|
||||||
|
GraphicsDevice.CheckGlError();
|
||||||
|
|
||||||
var bits = bitmap.LockBits(
|
var bits = bitmap.LockBits(
|
||||||
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
|
new Rectangle(0, 0, bitmap.Width, bitmap.Height),
|
||||||
ImageLockMode.ReadOnly,
|
ImageLockMode.ReadOnly,
|
||||||
@@ -291,7 +316,7 @@ namespace OpenRa.GlRenderer
|
|||||||
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAX_LEVEL, 0);
|
Gl.glTexParameteri(Gl.GL_TEXTURE_2D, Gl.GL_TEXTURE_MAX_LEVEL, 0);
|
||||||
GraphicsDevice.CheckGlError();
|
GraphicsDevice.CheckGlError();
|
||||||
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, bits.Width, bits.Height,
|
Gl.glTexImage2D(Gl.GL_TEXTURE_2D, 0, Gl.GL_RGBA8, bits.Width, bits.Height,
|
||||||
0, Gl.GL_RGBA, Gl.GL_UNSIGNED_BYTE, bits.Scan0); // todo: weird strides
|
0, Gl.GL_BGRA, Gl.GL_UNSIGNED_BYTE, bits.Scan0); // todo: weird strides
|
||||||
GraphicsDevice.CheckGlError();
|
GraphicsDevice.CheckGlError();
|
||||||
|
|
||||||
bitmap.UnlockBits(bits);
|
bitmap.UnlockBits(bits);
|
||||||
|
|||||||
@@ -32,9 +32,8 @@ VertexOut Simple_vp(VertexIn v) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
float4 Simple_fp(FragmentIn f) : COLOR0 {
|
float4 Simple_fp(FragmentIn f) : COLOR0 {
|
||||||
return float4( 1,0,0,1 );
|
float4 r = tex2D(DiffuseTexture, f.Tex0);
|
||||||
// float4 r = tex2D(DiffuseTexture, f.Tex0);
|
return r;
|
||||||
// return r;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
technique high_quality {
|
technique high_quality {
|
||||||
@@ -44,8 +43,8 @@ technique high_quality {
|
|||||||
// CullFace = NONE;
|
// CullFace = NONE;
|
||||||
// CullMode = None;
|
// CullMode = None;
|
||||||
// FillMode = Solid;
|
// FillMode = Solid;
|
||||||
VertexProgram = compile arbvp1 Simple_vp();
|
VertexProgram = compile latest Simple_vp();
|
||||||
FragmentProgram = compile arbfp1 Simple_fp();
|
FragmentProgram = compile latest Simple_fp();
|
||||||
|
|
||||||
//SrcBlend = SrcAlpha;
|
//SrcBlend = SrcAlpha;
|
||||||
//DestBlend = InvSrcAlpha;
|
//DestBlend = InvSrcAlpha;
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ technique low_quality {
|
|||||||
BlendEnable = false;
|
BlendEnable = false;
|
||||||
DepthTestEnable = false;
|
DepthTestEnable = false;
|
||||||
CullFaceEnable = false;
|
CullFaceEnable = false;
|
||||||
VertexProgram = compile arbvp1 Simple_vp();
|
VertexProgram = compile latest Simple_vp();
|
||||||
FragmentProgram = compile arbfp1 Palette_fp();
|
FragmentProgram = compile latest Palette_fp();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
4
line.fx
4
line.fx
@@ -34,8 +34,8 @@ technique high_quality {
|
|||||||
DepthTestEnable = false;
|
DepthTestEnable = false;
|
||||||
//CullMode = None;
|
//CullMode = None;
|
||||||
//FillMode = Wireframe;
|
//FillMode = Wireframe;
|
||||||
VertexProgram = compile arbvp1 Simple_vp();
|
VertexProgram = compile latest Simple_vp();
|
||||||
FragmentProgram = compile arbfp1 Simple_fp();
|
FragmentProgram = compile latest Simple_fp();
|
||||||
|
|
||||||
//SrcBlend = SrcAlpha;
|
//SrcBlend = SrcAlpha;
|
||||||
//DestBlend = InvSrcAlpha;
|
//DestBlend = InvSrcAlpha;
|
||||||
|
|||||||
@@ -57,10 +57,13 @@ float4 Palette_fp(VertexOut f) : COLOR0 {
|
|||||||
|
|
||||||
technique low_quality {
|
technique low_quality {
|
||||||
pass p0 {
|
pass p0 {
|
||||||
BlendEnable = false;
|
BlendEnable = true;
|
||||||
DepthTestEnable = false;
|
DepthTestEnable = false;
|
||||||
CullFaceEnable = false;
|
CullFaceEnable = false;
|
||||||
VertexProgram = compile arbvp1 Simple_vp();
|
VertexProgram = compile latest Simple_vp();
|
||||||
FragmentProgram = compile arbfp1 Palette_fp();
|
FragmentProgram = compile latest Palette_fp();
|
||||||
|
|
||||||
|
BlendEquation = FuncAdd;
|
||||||
|
BlendFunc = int2( SrcAlpha, OneMinusSrcAlpha );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user