147 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
| /**********************************************************************
 | |
|  *<
 | |
| 	FILE: IDX8VertexShader.h
 | |
| 
 | |
| 	DESCRIPTION: DirectX 8 Vertex Shader Interface Definition
 | |
| 
 | |
| 	CREATED BY: Nikolai Snader and Norbert Jeske
 | |
| 
 | |
| 	HISTORY: Created 9/22/00
 | |
| 
 | |
|  *>	Copyright (c) 2000, All Rights Reserved.
 | |
|  **********************************************************************/
 | |
| 
 | |
| #include <d3dx8.h>
 | |
| #include "IHardwareShader.h"
 | |
| 
 | |
| #define DX8_VERTEX_SHADER_INTERFACE_ID Interface_ID(0x476a10d9, 0x7f531d40)
 | |
| 
 | |
| struct DX8VSConstant
 | |
| {
 | |
| 	float a,b,c,d;
 | |
| 	
 | |
| 	// Access operators
 | |
| 	float& operator[](int i) { return (&a)[i]; }     
 | |
| 	const float& operator[](int i) const { return (&a)[i]; }  
 | |
| };
 | |
| 
 | |
| class ID3DGraphicsWindow;
 | |
| class IDX8PixelShader;
 | |
| 
 | |
| class IDX8VertexShader : virtual public IVertexShader, public BaseInterface
 | |
| {
 | |
| public:
 | |
| 	virtual Interface_ID GetID() { return DX8_VERTEX_SHADER_INTERFACE_ID; }
 | |
| 
 | |
| 	// Confirm that the Direct3D Device can handle this VertexShader
 | |
| 	virtual HRESULT ConfirmDevice(ID3DGraphicsWindow *gw) = 0;
 | |
| 
 | |
| 	// Confirm that an associated PixelShader will work with this VertexShader
 | |
| 	virtual HRESULT ConfirmPixelShader(IDX8PixelShader *pps) = 0;
 | |
| 
 | |
| 	// Can try tristrips for drawing or must geometry using this VertexShader
 | |
| 	// be drawn as triangles?  This should return 'true' unless additional per
 | |
| 	// vertex data is generated by this VertexShader and this data does not map
 | |
| 	// to the Mesh vertices in the same way as existing data the Mesh knows
 | |
| 	// about such as texture coordinates.
 | |
| 	virtual bool CanTryStrips() = 0;
 | |
| 
 | |
| 	// Number of passes for the effect this VertexShader creates.  Note that
 | |
| 	// this value will depend on the hardware currently in use.
 | |
| 	virtual int GetNumMultiPass() = 0;
 | |
| 
 | |
| 	// Retrieve the VertexShader handle for the specified pass for use in GFX
 | |
| 	virtual DWORD GetVertexShaderHandle(int numPass) = 0;
 | |
| 
 | |
| 	// Set the VertexShader for the specified pass.  This call will be made at
 | |
| 	// least once per object to set the per object data for the VertexShader
 | |
| 	// such as the VertexShader constants.
 | |
| 	virtual HRESULT SetVertexShader(ID3DGraphicsWindow *gw, int numPass) = 0;
 | |
| 
 | |
| 
 | |
| 	// Drawing functions.  These functions are necessary as something other
 | |
| 	// than a simple default body if:
 | |
| 	//
 | |
| 	// 1. The VertexShader needs to add additional per vertex data unknown to
 | |
| 	//    the Mesh to the VertexBuffer.
 | |
| 	//
 | |
| 	// 2. The VertexShader needs to have per vertex data ordered differently
 | |
| 	//    than the standard position, normal, {color, tex coords ordering}.
 | |
| 	//
 | |
| 	// 3. The VertexShader is being used to create cached VertexBuffers or
 | |
| 	//    using higher order surfaces.
 | |
| 	//
 | |
| 	// In the first two cases, the VertexShader has the option of not only
 | |
| 	// locking and filling the VertexBuffer with data, but also of making the
 | |
| 	// actual DrawPrimitive call.  In the third case, the VertexShader must
 | |
| 	// make the DrawPrimitive call.  The VertexShader indicates that it has
 | |
| 	// done the drawing by returning 'true' in the Draw() functions below.
 | |
| 	//
 | |
| 	// In the case where the VertexShader does not want to do the drawing but
 | |
| 	// does want to fill in a VertexBuffer with data, the VertexShader can
 | |
| 	// request the GFX to create a VertexBuffer (and possibly an IndexBuffer)
 | |
| 	// of appropriate size.  The GetVertexBuffer and GetIndexBuffer calls on
 | |
| 	// the ID3DGraphicsWindow object will do this and return the allocated
 | |
| 	// buffers in subsequent calls or reallocate them if necessary.
 | |
| 	//
 | |
| 	// Please note that if a PixelShader or PixelShaders are in use, these
 | |
| 	// Draw() functions may need to set them for the appropriate passes of a
 | |
| 	// multipass rendering if the drawing is done in these Draw() functions.
 | |
| 	// If the GFX is doing the drawing, then these Draw() functions are only
 | |
| 	// being used to fill in the VertexBuffer with data; the GFX will be doing
 | |
| 	// the drawing and will be setting the PixelShaders as appropriate.
 | |
| 
 | |
| 
 | |
| 	// Draw 3D Mesh as TriStrips.  Fill in the VertexBuffer with data in the
 | |
| 	// order desired by the VertexShader.  Return 'true' if the Mesh has
 | |
| 	// actually been drawn in this call, 'false' if the GFX is required to make
 | |
| 	// the DrawPrimitive call.
 | |
| 	virtual bool	DrawMeshStrips(ID3DGraphicsWindow *gw, MeshData *data) = 0;
 | |
| 
 | |
| 	// Draw 3D Mesh as wireframe.  Fill in the VertexBuffer with data in the
 | |
| 	// order desired by the VertexShader.  Return 'true' if the Mesh has
 | |
| 	// actually been drawn in this call, 'false' if the GFX is required to make
 | |
| 	// the DrawPrimitive call.
 | |
| 	virtual bool	DrawWireMesh(ID3DGraphicsWindow *gw, WireMeshData *data) = 0;
 | |
| 
 | |
| 
 | |
| 	// Draw 3D lines.  A Mesh is being drawn by having line segments handed
 | |
| 	// down one at a time.
 | |
| 
 | |
| 	// Pass in the Mesh data in preparation for drawing 3D lines.
 | |
| 	virtual void	StartLines(ID3DGraphicsWindow *gw, WireMeshData *data) = 0;
 | |
| 
 | |
| 	// Add the connectivity information for one two point line segment.
 | |
| 	virtual void	AddLine(ID3DGraphicsWindow *gw, DWORD *vert, int vis) = 0;
 | |
| 
 | |
| 	// Draw the line segments accumulated.  This should restart the filling of
 | |
| 	// a VertexBuffer with the next AddLine call if additional data needs to
 | |
| 	// be drawn before EndLines is called.  Return 'true' if the Mesh line
 | |
| 	// segments have actually been drawn in this call, 'false' if the GFX is
 | |
| 	// required to make the DrawPrimitive call.
 | |
| 	virtual bool	DrawLines(ID3DGraphicsWindow *gw) = 0;
 | |
| 
 | |
| 	// Let the Mesh know that all drawing and data access is finished.
 | |
| 	virtual void	EndLines(ID3DGraphicsWindow *gw, GFX_ESCAPE_FN fn) = 0;
 | |
| 
 | |
| 
 | |
| 	// Draw 3D triangles.  A Mesh is being drawn by having triangles handed
 | |
| 	// down one at a time.
 | |
| 
 | |
| 	// Pass in the Mesh data in preparation for drawing 3D triangles.
 | |
| 	virtual void	StartTriangles(ID3DGraphicsWindow *gw, MeshFaceData *data) = 0;
 | |
| 
 | |
| 	// Add the connectivity information for one triangle.
 | |
| 	virtual void	AddTriangle(ID3DGraphicsWindow *gw, DWORD index, int *edgeVis) = 0;
 | |
| 
 | |
| 	// Draw the triangles accumulated.  This should restart the filling of a
 | |
| 	// VertexBuffer with the next AddTriangle call if additional data needs to
 | |
| 	// be drawn before EndTriangles is called.  Return 'true' if the Mesh
 | |
| 	// triangles have actually been drawn in this call, 'false' if the GFX is
 | |
| 	// required to make the DrawPrimitive call.
 | |
| 	virtual bool	DrawTriangles(ID3DGraphicsWindow *gw) = 0;
 | |
| 
 | |
| 	// Let the Mesh know that all drawing and data access is finished.
 | |
| 	virtual void	EndTriangles(ID3DGraphicsWindow *gw, GFX_ESCAPE_FN fn) = 0;
 | |
| };
 | 
