brender-1997/myst/Rendfunc.c
2022-05-03 14:31:40 -07:00

280 lines
6.4 KiB
C

/*
* Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved.
*
* Rendering hooks
*/
#include "drv.h"
#include "shortcut.h"
#include "brassert.h"
extern br_boolean r_textured;
extern br_boolean r_no_colour; /* True only for non-modulate textures */
extern br_uint_8 opacity;
#define W_CONVERT(v) (1.0f / ((v)->comp_f[C_W]) )
/* z is wanted in the range 0.0 to 1.0: set in the match ranges */
#define Z_CONVERT(v) ((v)->comp_f[C_SZ])
/*
* All point primitives
*/
void BR_ASM_CALL PointRenderFlat(brp_block *block, brp_vertex *a)
{
}
void BR_ASM_CALL LineRenderFlat(brp_block *block, brp_vertex *a,brp_vertex *b)
{
T_msiVertex vtx[3];
vtx[0].x = a->comp_f[C_SX];
vtx[0].y = a->comp_f[C_SY];
vtx[0].z = Z_CONVERT(a);
vtx[1].x = b->comp_f[C_SX];
vtx[1].y = b->comp_f[C_SY];
vtx[1].z = Z_CONVERT(b);
if (r_textured) {
vtx[0].u = a->comp_f[C_U];
vtx[0].v = a->comp_f[C_V];
vtx[0].invW = W_CONVERT(a);
vtx[1].u = b->comp_f[C_U];
vtx[1].v = b->comp_f[C_V];
vtx[1].invW = W_CONVERT(b);
}
if (!r_no_colour) {
float r, g, b;
r = a->comp_f[C_R];
g = a->comp_f[C_G];
b = a->comp_f[C_B];
if (r_textured) {
vtx[0].mr = r;
vtx[0].mg = g;
vtx[0].mb = b;
vtx[1].mr = r;
vtx[1].mg = g;
vtx[1].mb = b;
} else {
vtx[0].r = r;
vtx[0].g = g;
vtx[0].b = b;
vtx[1].r = r;
vtx[1].g = g;
vtx[1].b = b;
}
}
vtx[2] = vtx[1];
if (vtx[2].x > 2.0f)
vtx[2].x -= 2.0f;
else
vtx[2].x += 2.0f;
if (vtx[2].y > 2.0f)
vtx[2].y -= 2.0f;
else
vtx[2].y += 2.0f;
// syslog("LineRenderFlat");
msiRenderTriangle(vtx+0, vtx+1, vtx+2, opacity);
// syslog(" -> complete");
}
void BR_ASM_CALL LineRenderSmooth(brp_block *block, brp_vertex *a,brp_vertex *b)
{
T_msiVertex vtx[3];
vtx[0].x = a->comp_f[C_SX];
vtx[0].y = a->comp_f[C_SY];
vtx[0].z = Z_CONVERT(a);
vtx[1].x = b->comp_f[C_SX];
vtx[1].y = b->comp_f[C_SY];
vtx[1].z = Z_CONVERT(b);
if (r_textured) {
vtx[0].u = a->comp_f[C_U];
vtx[0].v = a->comp_f[C_V];
vtx[0].invW = W_CONVERT(a);
vtx[1].u = b->comp_f[C_U];
vtx[1].v = b->comp_f[C_V];
vtx[1].invW = W_CONVERT(b);
}
if (!r_no_colour) {
if (r_textured) {
vtx[0].mr = a->comp_f[C_R];
vtx[0].mg = a->comp_f[C_G];
vtx[0].mb = a->comp_f[C_B];
vtx[1].mr = b->comp_f[C_R];
vtx[1].mg = b->comp_f[C_G];
vtx[1].mb = b->comp_f[C_B];
} else {
vtx[0].r = a->comp_f[C_R];
vtx[0].g = a->comp_f[C_G];
vtx[0].b = a->comp_f[C_B];
vtx[1].r = b->comp_f[C_R];
vtx[1].g = b->comp_f[C_G];
vtx[1].b = b->comp_f[C_B];
}
}
vtx[2] = vtx[1];
if (vtx[2].x > 2.0f)
vtx[2].x -= 2.0f;
else
vtx[2].x += 2.0f;
if (vtx[2].y > 2.0f)
vtx[2].y -= 2.0f;
else
vtx[2].y += 2.0f;
// syslog("LineRenderSmooth");
msiRenderTriangle(vtx+0, vtx+1, vtx+2, opacity);
// syslog(" -> complete");
}
/*
* All Flat-shaded triangle primitives
*/
void BR_ASM_CALL TriangleRenderFlat(brp_block *block, brp_vertex *a,brp_vertex *b,brp_vertex *c)
{
T_msiVertex vtx[3];
vtx[0].x = a->comp_f[C_SX];
vtx[0].y = a->comp_f[C_SY];
vtx[0].z = Z_CONVERT(a);
vtx[1].x = b->comp_f[C_SX];
vtx[1].y = b->comp_f[C_SY];
vtx[1].z = Z_CONVERT(b);
vtx[2].x = c->comp_f[C_SX];
vtx[2].y = c->comp_f[C_SY];
vtx[2].z = Z_CONVERT(c);
if (r_textured) {
vtx[0].u = a->comp_f[C_U];
vtx[0].v = a->comp_f[C_V];
vtx[0].invW = W_CONVERT(a);
vtx[1].u = b->comp_f[C_U];
vtx[1].v = b->comp_f[C_V];
vtx[1].invW = W_CONVERT(b);
vtx[2].u = c->comp_f[C_U];
vtx[2].v = c->comp_f[C_V];
vtx[2].invW = W_CONVERT(c);
}
if (!r_no_colour) {
float r, g, b;
r = a->comp_f[C_R];
g = a->comp_f[C_G];
b = a->comp_f[C_B];
if (r_textured) {
vtx[0].mr = r;
vtx[0].mg = g;
vtx[0].mb = b;
vtx[1].mr = r;
vtx[1].mg = g;
vtx[1].mb = b;
vtx[2].mr = r;
vtx[2].mg = g;
vtx[2].mb = b;
} else {
vtx[0].r = r;
vtx[0].g = g;
vtx[0].b = b;
vtx[1].r = r;
vtx[1].g = g;
vtx[1].b = b;
vtx[2].r = r;
vtx[2].g = g;
vtx[2].b = b;
}
}
// syslog("TriRenderFlat");
msiRenderTriangle(vtx+0, vtx+1, vtx+2, opacity);
// syslog(" -> complete");
}
/*
* Z buffered, smooth shaded, all types
*/
void BR_ASM_CALL TriangleRenderSmooth(brp_block *block, brp_vertex *a,brp_vertex *b,brp_vertex *c)
{
T_msiVertex vtx[3];
vtx[0].x = a->comp_f[C_SX];
vtx[0].y = a->comp_f[C_SY];
vtx[0].z = Z_CONVERT(a);
vtx[1].x = b->comp_f[C_SX];
vtx[1].y = b->comp_f[C_SY];
vtx[1].z = Z_CONVERT(b);
vtx[2].x = c->comp_f[C_SX];
vtx[2].y = c->comp_f[C_SY];
vtx[2].z = Z_CONVERT(c);
if (r_textured) {
vtx[0].u = a->comp_f[C_U];
vtx[0].v = a->comp_f[C_V];
vtx[0].invW = W_CONVERT(a);
vtx[1].u = b->comp_f[C_U];
vtx[1].v = b->comp_f[C_V];
vtx[1].invW = W_CONVERT(b);
vtx[2].u = c->comp_f[C_U];
vtx[2].v = c->comp_f[C_V];
vtx[2].invW = W_CONVERT(c);
}
if (!r_no_colour) {
if (r_textured) {
vtx[0].mr = a->comp_f[C_R];
vtx[0].mg = a->comp_f[C_G];
vtx[0].mb = a->comp_f[C_B];
vtx[1].mr = b->comp_f[C_R];
vtx[1].mg = b->comp_f[C_G];
vtx[1].mb = b->comp_f[C_B];
vtx[2].mr = c->comp_f[C_R];
vtx[2].mg = c->comp_f[C_G];
vtx[2].mb = c->comp_f[C_B];
} else {
vtx[0].r = a->comp_f[C_R];
vtx[0].g = a->comp_f[C_G];
vtx[0].b = a->comp_f[C_B];
vtx[1].r = b->comp_f[C_R];
vtx[1].g = b->comp_f[C_G];
vtx[1].b = b->comp_f[C_B];
vtx[2].r = c->comp_f[C_R];
vtx[2].g = c->comp_f[C_G];
vtx[2].b = c->comp_f[C_B];
}
}
// syslog("TriRenderSmooth");
msiRenderTriangle(vtx+0, vtx+1, vtx+2, opacity);
// syslog(" -> complete");
}