UV Geometry Shader

Vux wrote a demo shader doing some simple UV mapping, planer, projected etc

Thought it would be really handy to have as a geometry shader with stream out.

I got a bit stuck though, technique invalid but no error msg, however if you put line 130 back in it’s valid again, so I guess the uv function is not fetching what it should…
//output.TexCd = input.TexCd;

Anyone can see what doing wrong?

float4x4 tW : WORLD;
float4x4 tWV : WORLDVIEW;
float4x4 tVP : VIEWPROJECTION;
float4x4 tWVP: WORLDVIEWPROJECTION;

float2 scale;
float2 offset;

- define PI 3.14159265f

- define HALFPI PI * 0.5f
- define TWOPI PI * 2.0f

//Interfaces and Classes definitions

interface iUVSpace
{
   float4 Get(float4 p);
};

interface iUVMap
{
   float2 GetUV(float4 p,float2 uv);
};

class cObjectUVSpace : iUVSpace
{
  float4 Get(float4 p)
	{
		return p;
	}
}; 

class cWorldUVSpace : iUVSpace
{
  float4 Get(float4 p)
	{
		return mul(p,tW);
	}
};


class cViewUVSpace : iUVSpace
{
  float4 Get(float4 p)
	{
		return mul(p,tWV);
	}
};

cObjectUVSpace objectuvspace;
cWorldUVSpace worlduvspace;
cViewUVSpace viewuvspace;

class cStandardUV : iUVMap
{
   float2 GetUV(float4 p,float2 uv)
	{
		return uv;
	}
}; 

class cPlanarXYUV : iUVMap
{
   float2 GetUV(float4 p,float2 uv) { return p.xy * scale + offset; }
}; 

class cPlanarXZUV : iUVMap
{
   float2 GetUV(float4 p,float2 uv) { return p.xz * scale + offset; }
}; 

class cPlanarYZUV : iUVMap
{
   float2 GetUV(float4 p,float2 uv) { return p.yz  * scale + offset; }
};

class cPerspectiveUV : iUVMap
{
   float2 GetUV(float4 p,float2 uv) 
	{
		float4 wvp = mul(p,tWVP);
		return (wvp.xy / wvp.w)  * scale + offset;
	}
}; 

cStandardUV standard;
cPlanarXYUV planarxy;
cPlanarXZUV planarxz;
cPlanarYZUV planaryz;
cPerspectiveUV perspective;

iUVSpace space <string linkclass="objectuvspace,worlduvspace,viewuvspace";>;
iUVMap uvmap <string linkclass="standard,planarxy,planarxz,planaryz,perspective";>;





struct VS_IN
{
	float4 PosO : POSITION;
	float3 NormO : NORMAL;
	float2 TexCd : TEXCOORD0;

};

struct VS_OUTPUT
{
	float4 cpoint : POSITION;
	float3 norm : NORMAL;
	float2 TexCd : TEXCOORD;
};



VS_OUTPUT VS(VS_IN input)
{
	//Here we simply passtrough the vertex data
    VS_OUTPUT output;
	
	float4 p = space.Get(input.PosO);
    output.cpoint = input.PosO;
	output.norm = input.NormO;
	
	output.TexCd = uvmap.GetUV(p,input.TexCd);
	//output.TexCd = input.TexCd;
	
    return output;
}



[maxvertexcount(3)](maxvertexcount(3))
void GS(triangle VS_OUTPUT input[3](3), inout TriangleStream<VS_OUTPUT>GSOut)
{
	VS_OUTPUT v;

	for(uint i=0;i<3;i++)
	{
		v=input[i](i);
		//v.position=v.position;
        //v.TexCd=v.TexCd;
		//v.normV=v.normV;
		GSOut.Append(v);
	}
}

GeometryShader StreamOutGS = ConstructGSWithSO( CompileShader( gs_5_0, GS() ), "POSITION.xyzw; NORMAL.xyz; TEXCOORD.xy", NULL, NULL, NULL, -1);

technique11 MeshSplit
{
	pass P0
	{
		
		SetVertexShader( CompileShader( vs_5_0, VS() ) );
		SetGeometryShader( CompileShader( gs_5_0, GS() ) );
	    SetGeometryShader( StreamOutGS );

	}
}

there were some troubles with streamout and UV coords

Thanks for looking antokhio. Did you mean troubles in general or with this code?