/*
 *
 *  Copyright (C) Microsoft Corporation.  All Rights Reserved.
 *
 *  File:       d3dx8shapes.h
 *  Content:    D3DX simple shapes
 *
 */

#include "d3dx8.h"

#ifndef __D3DX8SHAPES_H__
#define __D3DX8SHAPES_H__

/*
 * Functions:
 */

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/*
 * D3DXCreatePolygon:
 * ------------------
 * Creates a mesh containing an n-sided polygon.  The polygon is centered
 * at the origin.
 *
 * Parameters:
 *
 *  pDevice     The D3D device with which the mesh is going to be used.
 *  Length      Length of each side.
 *  Sides       Number of sides the polygon has.  (Must be >= 3)
 *  ppMesh      The mesh object which will be created
 *  ppAdjacency Returns a buffer containing adjacency info.  Can be NULL.
 *-------------------------------------------------------------------------
 */
HRESULT WINAPI
    D3DXCreatePolygon(
        LPDIRECT3DDEVICE8   pDevice,
        FLOAT               Length,
        UINT                Sides,
        LPD3DXMESH*         ppMesh,
        LPD3DXBUFFER*       ppAdjacency);

/*
 * D3DXCreateBox:
 * --------------
 * Creates a mesh containing an axis-aligned box.  The box is centered at
 * the origin.
 *
 * Parameters:
 *
 *  pDevice     The D3D device with which the mesh is going to be used.
 *  Width       Width of box (along X-axis)
 *  Height      Height of box (along Y-axis)
 *  Depth       Depth of box (along Z-axis)
 *  ppMesh      The mesh object which will be created
 *  ppAdjacency Returns a buffer containing adjacency info.  Can be NULL.
 */
HRESULT WINAPI
    D3DXCreateBox(
        LPDIRECT3DDEVICE8   pDevice,
        FLOAT               Width,
        FLOAT               Height,
        FLOAT               Depth,
        LPD3DXMESH*         ppMesh,
        LPD3DXBUFFER*       ppAdjacency);

/*
 * D3DXCreateCylinder:
 * -------------------
 * Creates a mesh containing a cylinder.  The generated cylinder is
 * centered at the origin, and its axis is aligned with the Z-axis.
 *
 * Parameters:
 *
 *  pDevice     The D3D device with which the mesh is going to be used.
 *  Radius1     Radius at -Z end (should be >= 0.0f)
 *  Radius2     Radius at +Z end (should be >= 0.0f)
 *  Length      Length of cylinder (along Z-axis)
 *  Slices      Number of slices about the main axis
 *  Stacks      Number of stacks along the main axis
 *  ppMesh      The mesh object which will be created
 *  ppAdjacency Returns a buffer containing adjacency info.  Can be NULL.
 *-------------------------------------------------------------------------
 */
HRESULT WINAPI
    D3DXCreateCylinder(
        LPDIRECT3DDEVICE8   pDevice,
        FLOAT               Radius1,
        FLOAT               Radius2,
        FLOAT               Length,
        UINT                Slices,
        UINT                Stacks,
        LPD3DXMESH*         ppMesh,
        LPD3DXBUFFER*       ppAdjacency);

/*-------------------------------------------------------------------------
 * D3DXCreateSphere:
 * -----------------
 * Creates a mesh containing a sphere.  The sphere is centered at the
 * origin.
 *
 * Parameters:
 *
 *  pDevice     The D3D device with which the mesh is going to be used.
 *  Radius      Radius of the sphere (should be >= 0.0f)
 *  Slices      Number of slices about the main axis
 *  Stacks      Number of stacks along the main axis
 *  ppMesh      The mesh object which will be created
 *  ppAdjacency Returns a buffer containing adjacency info.  Can be NULL.
 *-------------------------------------------------------------------------
 */
HRESULT WINAPI
    D3DXCreateSphere(
        LPDIRECT3DDEVICE8  pDevice,
        FLOAT              Radius,
        UINT               Slices,
        UINT               Stacks,
        LPD3DXMESH*        ppMesh,
        LPD3DXBUFFER*      ppAdjacency);

/*-------------------------------------------------------------------------
 * D3DXCreateTorus:
 * ----------------
 * Creates a mesh containing a torus.  The generated torus is centered at
 * the origin, and its axis is aligned with the Z-axis.
 *
 * Parameters:
 *
 *  pDevice     The D3D device with which the mesh is going to be used.
 *  InnerRadius Inner radius of the torus (should be >= 0.0f)
 *  OuterRadius Outer radius of the torue (should be >= 0.0f)
 *  Sides       Number of sides in a cross-section (must be >= 3)
 *  Rings       Number of rings making up the torus (must be >= 3)
 *  ppMesh      The mesh object which will be created
 *  ppAdjacency Returns a buffer containing adjacency info.  Can be NULL.
 *-------------------------------------------------------------------------
 */
HRESULT WINAPI
    D3DXCreateTorus(
        LPDIRECT3DDEVICE8   pDevice,
        FLOAT               InnerRadius,
        FLOAT               OuterRadius,
        UINT                Sides,
        UINT                Rings,
        LPD3DXMESH*         ppMesh,
        LPD3DXBUFFER*       ppAdjacency);

/*-------------------------------------------------------------------------
 * D3DXCreateTeapot:
 * -----------------
 * Creates a mesh containing a teapot.
 *
 * Parameters:
 *
 *  pDevice     The D3D device with which the mesh is going to be used.
 *  ppMesh      The mesh object which will be created
 *  ppAdjacency Returns a buffer containing adjacency info.  Can be NULL.
 *-------------------------------------------------------------------------
 */
HRESULT WINAPI
    D3DXCreateTeapot(
        LPDIRECT3DDEVICE8   pDevice,
        LPD3DXMESH*         ppMesh,
        LPD3DXBUFFER*       ppAdjacency);

/*-------------------------------------------------------------------------
 * D3DXCreateText:
 * ---------------
 * Creates a mesh containing the specified text using the font associated
 * with the device context.
 *
 * Parameters:
 *
 *  pDevice       The D3D device with which the mesh is going to be used.
 *  hDC           Device context, with desired font selected
 *  pText         Text to generate
 *  Deviation     Maximum chordal deviation from true font outlines
 *  Extrusion     Amount to extrude text in -Z direction
 *  ppMesh        The mesh object which will be created
 *  pGlyphMetrics Address of buffer to receive glyph metric data (or NULL)
 *-------------------------------------------------------------------------
 */
HRESULT WINAPI
    D3DXCreateTextA(
        LPDIRECT3DDEVICE8   pDevice,
        HDC                 hDC,
        LPCSTR              pText,
        FLOAT               Deviation,
        FLOAT               Extrusion,
        LPD3DXMESH*         ppMesh,
        LPD3DXBUFFER*       ppAdjacency,
        LPGLYPHMETRICSFLOAT pGlyphMetrics);

HRESULT WINAPI
    D3DXCreateTextW(
        LPDIRECT3DDEVICE8   pDevice,
        HDC                 hDC,
        LPCWSTR             pText,
        FLOAT               Deviation,
        FLOAT               Extrusion,
        LPD3DXMESH*         ppMesh,
        LPD3DXBUFFER*       ppAdjacency,
        LPGLYPHMETRICSFLOAT pGlyphMetrics);

#ifdef UNICODE
#define D3DXCreateText D3DXCreateTextW
#else
#define D3DXCreateText D3DXCreateTextA
#endif

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* __D3DX8SHAPES_H__ */
