2025-04-27 07:49:33 -04:00

210 lines
5.3 KiB
C++

/*==========================================================================
*
* Copyright (C) 1995-1996 Microsoft Corporation. All Rights Reserved.
*
* File: sfiltest.cpp
*
***************************************************************************/
#include "pch.cpp"
#pragma hdrstop
#include "rend.h"
#include "globals.h"
static RendExecuteBuffer *lpExBuf;
static RendMaterial *lpMat;
static UINT NumTri;
static long TriArea;
BOOL
RenderSceneSimple(RendWindow *prwin, LPD3DRECT lpExtent)
{
/*
* Execute the instruction buffer
*/
if (!prwin->BeginScene())
return FALSE;
if (!prwin->Execute(lpExBuf))
return FALSE;
if (!prwin->EndScene(lpExtent))
return FALSE;
return TRUE;
}
void
ReleaseViewSimple(void)
{
RELEASE(lpExBuf);
RELEASE(lpMat);
}
#define TAN_60 1.732
static float ox, oy;
void
SetTriangleVertices(LPD3DTLVERTEX v, float z, UINT ww, UINT wh, float a)
{
float dx, dy;
float b = (float)sqrt((4 * a) / TAN_60);
float h = (2 * a) / b;
float x = (float)((b / 2) * (TAN_60 / 2));
float cx, cy;
dx = (float)ww;
dy = (float)wh;
cx = dx / 2;
cy = dy / 2;
/* V 0 */
v[0].sx = cx;
v[0].sy = cy - (h - x);
v[0].sz = z;
v[0].rhw = D3DVAL(1.0);
v[0].color = RGB_MAKE(255, 0, 0);
v[0].tu = D3DVAL(0.5);
v[0].tv = D3DVAL(0.0);
/* V 1 */
v[1].sx = cx + (b / 2);
v[1].sy = cy + x;
v[1].sz = z;
v[1].rhw = D3DVAL(1.0);
v[1].color = RGB_MAKE(255, 255, 255);
v[1].tu = D3DVAL(1.0);
v[1].tv = D3DVAL(1.0);
/* V 2 */
v[2].sx = cx - (b / 2);
v[2].sy = cy + x;
v[2].sz = z;
v[2].rhw = D3DVAL(1.0);
v[2].color = RGB_MAKE(255, 255, 0);
v[2].tu = D3DVAL(0.0);
v[2].tv = D3DVAL(1.0);
#ifdef OFFSET
v[0].sx += ox;
v[0].sy += oy;
v[1].sx += ox;
v[1].sy += oy;
v[2].sx += ox;
v[2].sy += oy;
ox += 4;
oy += 4;
#endif
}
LPVOID
SetTriangleData(LPVOID lpPointer, int v)
{
((LPD3DTRIANGLE)lpPointer)->v1 = v;
((LPD3DTRIANGLE)lpPointer)->v2 = v + 1;
((LPD3DTRIANGLE)lpPointer)->v3 = v + 2;
((LPD3DTRIANGLE)lpPointer)->wFlags = D3DTRIFLAG_EDGEENABLETRIANGLE;
lpPointer = ((char*)lpPointer) + sizeof(D3DTRIANGLE);
return lpPointer;
}
unsigned long
InitViewSimple(RendWindow *prwin, int nTextures,
RendTexture **pprtex, UINT w, UINT h, float area,
UINT order, UINT num)
{
LPVOID lpBufStart, lpInsStart, lpPointer;
size_t size;
LPD3DTLVERTEX src_v;
UINT i;
float z;
D3DCOLORVALUE dcv;
NumTri = num;
src_v = (LPD3DTLVERTEX)malloc(3 * NumTri * sizeof(D3DTLVERTEX));
TriArea = (long)(area + 0.5);
lpMat = prwin->NewMaterial(1);
if (lpMat == NULL)
{
return FALSE;
}
dcv.r = D3DVAL(1.0);
dcv.g = D3DVAL(1.0);
dcv.b = D3DVAL(1.0);
dcv.a = D3DVAL(1.0);
lpMat->SetDiffuse(&dcv);
/*
* Setup vertices
*/
#ifdef OFFSET
ox = -100.0f;
oy = -100.0f;
#endif
memset(&src_v[0], 0, sizeof(D3DTLVERTEX) * 3 * NumTri);
if (order == FRONT_TO_BACK) {
for (i = 0, z = (float)0.0; i < NumTri; i++, z += (float)0.9 / NumTri)
SetTriangleVertices(&src_v[3*i], z, w, h, area);
} else {
for (i = 0, z = (float)0.9; i < NumTri; i++, z -= (float)0.9 / NumTri)
SetTriangleVertices(&src_v[3*i], z, w, h, area);
}
/*
* Create an execute buffer
*/
size = sizeof(D3DTLVERTEX) * 3 * NumTri;
size += sizeof(D3DINSTRUCTION) * 5;
size += sizeof(D3DPROCESSVERTICES);
size += sizeof(D3DSTATE) * 4;
size += sizeof(D3DTRIANGLE) * NumTri;
lpExBuf = prwin->NewExecuteBuffer(size, stat.uiExeBufFlags);
if (lpExBuf == NULL)
{
return 0L;
}
lpBufStart = lpExBuf->Lock();
if (lpBufStart == NULL)
{
return 0L;
}
memset(lpBufStart, 0, size);
lpPointer = lpBufStart;
/*
* Copy vertices to execute buffer
*/
memcpy(lpPointer, &src_v[0], 3 * NumTri * sizeof(D3DTLVERTEX));
lpPointer = &((LPD3DTLVERTEX)lpPointer)[3 * NumTri];
/*
* Setup instructions in execute buffer
*/
lpInsStart = lpPointer;
OP_STATE_LIGHT(1, lpPointer);
STATE_DATA(D3DLIGHTSTATE_MATERIAL, lpMat->Handle(), lpPointer);
OP_PROCESS_VERTICES(1, lpPointer);
PROCESSVERTICES_DATA(D3DPROCESSVERTICES_COPY, 0, 3 * NumTri,
lpPointer);
OP_STATE_RENDER(3, lpPointer);
STATE_DATA(D3DRENDERSTATE_TEXTUREHANDLE,
pprtex[1] != NULL ? pprtex[1]->Handle() : 0,
lpPointer);
STATE_DATA(D3DRENDERSTATE_WRAPU, FALSE, lpPointer);
STATE_DATA(D3DRENDERSTATE_WRAPV, FALSE, lpPointer);
OP_TRIANGLE_LIST(NumTri, lpPointer);
for (i = 0; i < NumTri; i++)
lpPointer = SetTriangleData(lpPointer, 3 * i);
OP_EXIT(lpPointer);
/*
* Setup the execute data
*/
lpExBuf->Unlock();
lpExBuf->SetData(3 * NumTri,
(ULONG) ((char *)lpInsStart - (char *)lpBufStart),
(ULONG) ((char *)lpPointer - (char *)lpInsStart));
if (!lpExBuf->Process())
{
return 0;
}
free(src_v);
return TriArea * NumTri;
}