rem 3DMaths Showcase rem A COMPLETE FVF, USAGE and rem TYPE list at end of program ObjectNumber=1 VertexShaderNumber=1 rem Constants for vertex shader #constant CSCALE 1 #constant CTRANSLATION 2 #constant CXROTATE 3 #constant CYROTATE 4 #constant CZROTATE 5 #constant CROTATION 6 #constant CWORLD 7 #constant CVIEW 8 #constant CPROJECTION 9 #constant CTEMP 10 #constant CLIGHT 11 #constant CDEGTORAD ( 3.14 / 180.0 ) rem Provide vertex shader with stream count set vertex shader streamcount VertexShaderNumber, 4 rem Provide vertex shader with stream VSDT_FLOAT2=0x01 : VSDT_FLOAT3=0x02 : VSDT_D3DCOLOR=0x04 VSDE_POSITION=0 : VSDE_NORMAL=3 : VSDE_DIFFUSE=10 : VSDE_TEXCOORD0=5 set vertex shader stream VertexShaderNumber, 1, VSDE_POSITION, VSDT_FLOAT3 set vertex shader stream VertexShaderNumber, 2, VSDE_NORMAL, VSDT_FLOAT3 set vertex shader stream VertexShaderNumber, 3, VSDE_DIFFUSE, VSDT_D3DCOLOR set vertex shader stream VertexShaderNumber, 4, VSDE_TEXCOORD0, VSDT_FLOAT2 rem Create a vertex shader from a text file create vertex shader from file VertexShaderNumber, "vshader.vsh" rem Make simple object make object sphere ObjectNumber,100 rem Convert object to correct mesh format FVF_XYZ=0x002 : FVF_NORMAL=0x010 : FVF_DIFFUSE=0x040 : FVF_TEX1=0x100 FVF_FINAL=FVF_XYZ || FVF_NORMAL || FVF_DIFFUSE || FVF_TEX1 convert object fvf ObjectNumber,FVF_FINAL rem Check if vertex shader was created if vertex shader exist(VertexShaderNumber)=1 rem Apply vertex shader to object set vertex shader on ObjectNumber, VertexShaderNumber rem Create required matrices r=make matrix4(CVIEW) r=make matrix4(CPROJECTION) r=make matrix4(CSCALE) r=make matrix4(CTRANSLATION) r=make matrix4(CXROTATE) r=make matrix4(CYROTATE) r=make matrix4(CZROTATE) r=make matrix4(CROTATION) r=make matrix4(CWORLD) r=make matrix4(CTEMP) rem required light vector r=make vector4(CLIGHT) rem setup camera and light vector position sync on : position camera 0,0,-500 set vector4 CLIGHT,50,20,-200,0 rem Simple loop while mouseclick()=0 rem get view and projection matrices view matrix4 CVIEW projection matrix4 CPROJECTION rem setup a scale matrix scale matrix4 CSCALE, 2.0, 2.0, 2.0 rem now setup the position translate matrix4 CTRANSLATION, 0.0, 10.0, 0.0 rem setup rotation rotate x matrix4 CXROTATE, 0.0 * CDEGTORAD rotate y matrix4 CYROTATE, 0.0 * CDEGTORAD rotate z matrix4 CZROTATE, 45.0 * CDEGTORAD rem multiply all 3 rotation matrices together multiply matrix4 CROTATION, CXROTATE, CYROTATE multiply matrix4 CROTATION, CROTATION, CZROTATE rem multiply all final matrices multiply matrix4 CTEMP, CROTATION, CSCALE multiply matrix4 CWORLD, CTEMP, CSCALE multiply matrix4 CWORLD, CWORLD, CVIEW multiply matrix4 CWORLD, CWORLD, CPROJECTION rem transpose the matrix transpose matrix4 CWORLD, CWORLD rem we send the light vector3 to the vertex shader normalize vector3 CLIGHT, CLIGHT set vertex shader vector VertexShaderNumber, 4, CLIGHT, 4 rem this is an important part รป we send the world matrix to the vertex shader set vertex shader matrix VertexShaderNumber, 0, CWORLD, 4 rem camera look rotate camera camera angle x()+mousemovey(),camera angle y()+mousemovex(),0 rem update screen sync rem end loop endwhile rem Deactivate vertex shader of the object set vertex shader off ObjectNumber rem Delete a vertex shader delete vertex shader VertexShaderNumber endif rem fvf `D3DFVF_RESERVED0 0x001 `D3DFVF_POSITION_MASK 0x00E `D3DFVF_XYZ 0x002 `D3DFVF_XYZRHW 0x004 `D3DFVF_XYZB1 0x006 `D3DFVF_XYZB2 0x008 `D3DFVF_XYZB3 0x00a `D3DFVF_XYZB4 0x00c `D3DFVF_XYZB5 0x00e `D3DFVF_NORMAL 0x010 `D3DFVF_PSIZE 0x020 `D3DFVF_DIFFUSE 0x040 `D3DFVF_SPECULAR 0x080 `D3DFVF_TEX0 0x000 `D3DFVF_TEX1 0x100 `D3DFVF_TEX2 0x200 `D3DFVF_TEX3 0x300 `D3DFVF_TEX4 0x400 `D3DFVF_TEX5 0x500 `D3DFVF_TEX6 0x600 `D3DFVF_TEX7 0x700 `D3DFVF_TEX8 0x800 `D3DFVF_LASTBETA_UBYTE4 0x1000 rem usages `D3DDECLUSAGE_POSITION = 0, `D3DDECLUSAGE_BLENDWEIGHT = 1, `D3DDECLUSAGE_BLENDINDICES = 2, `D3DDECLUSAGE_NORMAL = 3, `D3DDECLUSAGE_PSIZE = 4, `D3DDECLUSAGE_TEXCOORD = 5, `D3DDECLUSAGE_TANGENT = 6, `D3DDECLUSAGE_BINORMAL = 7, `D3DDECLUSAGE_TESSFACTOR = 8, `D3DDECLUSAGE_POSITIONT = 9, `D3DDECLUSAGE_COLOR = 10, `D3DDECLUSAGE_FOG = 11, `D3DDECLUSAGE_DEPTH = 12, `D3DDECLUSAGE_SAMPLE = 13 rem type values `D3DDECLTYPE_FLOAT1 = 0, // 1D float expanded to (value, 0., 0., 1.) `D3DDECLTYPE_FLOAT2 = 1, // 2D float expanded to (value, value, 0., 1.) `D3DDECLTYPE_FLOAT3 = 2, // 3D float expanded to (value, value, value, 1.) `D3DDECLTYPE_FLOAT4 = 3, // 4D float `D3DDECLTYPE_D3DCOLOR = 4, // 4D packed unsigned bytes mapped to 0. to 1. range `D3DDECLTYPE_UBYTE4 = 5, // 4D unsigned byte `D3DDECLTYPE_SHORT2 = 6, // 2D signed short expanded to (value, value, 0., 1.) `D3DDECLTYPE_SHORT4 = 7, // 4D signed short `D3DDECLTYPE_UBYTE4N = 8, // Each of 4 bytes is normalized by dividing to 255.0 `D3DDECLTYPE_SHORT2N = 9, // 2D signed short normalized (v[0]/32767.0,v[1]/32767.0,0,1) `D3DDECLTYPE_SHORT4N = 10, // 4D signed short normalized (v[0]/32767.0,v[1]/32767.0,v[2]/32767.0,v[3]/32767.0) `D3DDECLTYPE_USHORT2N = 11, // 2D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,0,1) `D3DDECLTYPE_USHORT4N = 12, // 4D unsigned short normalized (v[0]/65535.0,v[1]/65535.0,v[2]/65535.0,v[3]/65535.0) `D3DDECLTYPE_UDEC3 = 13, // 3D unsigned 10 10 10 format expanded to (value, value, value, 1) `D3DDECLTYPE_DEC3N = 14, // 3D signed 10 10 10 format expanded to (v[0]/511.0, v[1]/511.0, v[2]/511.0, `1) `D3DDECLTYPE_FLOAT16_2 = 15, // Two 16-bit floating point values, expanded to (value, value, 0, 1) `D3DDECLTYPE_FLOAT16_4 = 16, // Four 16-bit floating point values `D3DDECLTYPE_UNUSED = 17, // When the type field in a decl is unused.