599 lines
18 KiB
C
599 lines
18 KiB
C
/*
|
|
** Copyright 1992, Silicon Graphics, Inc.
|
|
** All Rights Reserved.
|
|
**
|
|
** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
|
|
** the contents of this file may not be disclosed to third parties, copied or
|
|
** duplicated in any form, in whole or in part, without the prior written
|
|
** permission of Silicon Graphics, Inc.
|
|
**
|
|
** RESTRICTED RIGHTS LEGEND:
|
|
** Use, duplication or disclosure by the Government is subject to restrictions
|
|
** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
|
|
** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
|
|
** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
|
|
** rights reserved under the Copyright Laws of the United States.
|
|
*/
|
|
|
|
#include <windows.h>
|
|
#include <GL/gl.h>
|
|
#include "conform.h"
|
|
#include "util.h"
|
|
#include "pathdata.h"
|
|
#include "path.h"
|
|
|
|
|
|
void PathAlias(void)
|
|
{
|
|
aliasPathStateRec *ptr = &paths.alias;
|
|
|
|
switch (paths.op) {
|
|
case PATHOP_INIT_DEFAULT:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_GARBAGE:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_CUSTOM:
|
|
ptr->current.data1 = aliasPath2.state;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_SET:
|
|
if (ptr->lock != PATHTEST_LOCKED) {
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
glEnable(GL_POINT_SMOOTH);
|
|
glEnable(GL_LINE_SMOOTH);
|
|
glEnable(GL_POLYGON_SMOOTH);
|
|
glEnable(GL_BLEND);
|
|
glBlendFunc(GL_SRC_ALPHA, GL_ONE);
|
|
|
|
glDisable(GL_ALPHA_TEST);
|
|
paths.alpha.lock = PATHTEST_LOCKED;
|
|
glDisable(GL_BLEND);
|
|
paths.blend.lock = PATHTEST_LOCKED;
|
|
glDisable(GL_DEPTH_TEST);
|
|
paths.depth.lock = PATHTEST_LOCKED;
|
|
glDisable(GL_DITHER);
|
|
paths.dither.lock = PATHTEST_LOCKED;
|
|
glDisable(GL_FOG);
|
|
paths.fog.lock = PATHTEST_LOCKED;
|
|
} else {
|
|
glDisable(GL_POINT_SMOOTH);
|
|
glDisable(GL_LINE_SMOOTH);
|
|
glDisable(GL_POLYGON_SMOOTH);
|
|
}
|
|
}
|
|
break;
|
|
case PATHOP_REPORT:
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
Output(2, " Alias Path active.\n");
|
|
Output(2, " GL_POINT_SMOOTH = enabled.\n");
|
|
Output(2, " GL_LINE_SMOOTH = enabled.\n");
|
|
Output(2, " GL_POLYGON_SMOOTH = enabled.\n");
|
|
Output(2, " Blend src function = GL_SRC_ALPHA, Blend dest function = GL_ONE.\n");
|
|
} else {
|
|
Output(2, " Alias Path inactive.\n");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PathAlpha(void)
|
|
{
|
|
alphaPathStateRec *ptr = &paths.alpha;
|
|
char str[40];
|
|
|
|
switch (paths.op) {
|
|
case PATHOP_INIT_DEFAULT:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = GL_ALWAYS;
|
|
ptr->current.data3 = 0.0;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_GARBAGE:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = PathGetList(ptr->true.data2);
|
|
ptr->current.data3 = PathGetRange_float(ptr->true.data3);
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_CUSTOM:
|
|
ptr->current.data1 = alphaPath2.state;
|
|
ptr->current.data2 = alphaPath2.func;
|
|
ptr->current.data3 = alphaPath2.ref;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_SET:
|
|
if (ptr->lock != PATHTEST_LOCKED) {
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
glEnable(GL_ALPHA_TEST);
|
|
|
|
glDisable(GL_POINT_SMOOTH);
|
|
glDisable(GL_LINE_SMOOTH);
|
|
glDisable(GL_POLYGON_SMOOTH);
|
|
paths.alias.lock = PATHTEST_LOCKED;
|
|
} else {
|
|
glDisable(GL_ALPHA_TEST);
|
|
}
|
|
glAlphaFunc(ptr->current.data2, ptr->current.data3);
|
|
}
|
|
break;
|
|
case PATHOP_REPORT:
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
Output(2, " Alpha Path active.\n");
|
|
GetEnumName(ptr->current.data2, str);
|
|
Output(2, " Function = %s.\n", str);
|
|
Output(2, " Reference = %f.\n", ptr->current.data3);
|
|
} else {
|
|
Output(2, " Alpha Path inactive.\n");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PathBlend(void)
|
|
{
|
|
blendPathStateRec *ptr = &paths.blend;
|
|
char str[40];
|
|
|
|
switch (paths.op) {
|
|
case PATHOP_INIT_DEFAULT:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = GL_ONE;
|
|
ptr->current.data3 = GL_ZERO;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_GARBAGE:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = PathGetList(ptr->true.data2);
|
|
ptr->current.data3 = PathGetList(ptr->true.data3);
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_CUSTOM:
|
|
ptr->current.data1 = blendPath2.state;
|
|
ptr->current.data2 = blendPath2.srcFunc;
|
|
ptr->current.data3 = blendPath2.destFunc;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_SET:
|
|
if (ptr->lock != PATHTEST_LOCKED) {
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
glEnable(GL_BLEND);
|
|
|
|
glDisable(GL_POINT_SMOOTH);
|
|
glDisable(GL_LINE_SMOOTH);
|
|
glDisable(GL_POLYGON_SMOOTH);
|
|
paths.alias.lock = PATHTEST_LOCKED;
|
|
glDisable(GL_ALPHA_TEST);
|
|
paths.alpha.lock = PATHTEST_LOCKED;
|
|
} else {
|
|
glDisable(GL_BLEND);
|
|
}
|
|
glBlendFunc(ptr->current.data2, ptr->current.data3);
|
|
}
|
|
break;
|
|
case PATHOP_REPORT:
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
Output(2, " Blend Path active.\n");
|
|
GetEnumName(ptr->current.data2, str);
|
|
Output(2, " Src function = %s, ", str);
|
|
GetEnumName(ptr->current.data3, str);
|
|
Output(2, "Dest function = %s.\n", str);
|
|
} else {
|
|
Output(2, " Blend Path inactive.\n");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PathDepth(void)
|
|
{
|
|
depthPathStateRec *ptr = &paths.depth;
|
|
char str[40];
|
|
|
|
switch (paths.op) {
|
|
case PATHOP_INIT_DEFAULT:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = 1.0;
|
|
ptr->current.data3 = 0.0;
|
|
ptr->current.data4 = 1.0;
|
|
ptr->current.data5 = GL_LESS;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_GARBAGE:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = PathGetRange_double(ptr->true.data2);
|
|
ptr->current.data3 = PathGetRange_double(ptr->true.data3);
|
|
ptr->current.data4 = PathGetRange_double(ptr->true.data4);
|
|
ptr->current.data5 = PathGetList(ptr->true.data5);
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_CUSTOM:
|
|
ptr->current.data1 = depthPath2.state;
|
|
ptr->current.data2 = depthPath2.clear;
|
|
ptr->current.data3 = depthPath2.min;
|
|
ptr->current.data4 = depthPath2.max;
|
|
ptr->current.data5 = depthPath2.func;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_SET:
|
|
if (ptr->lock != PATHTEST_LOCKED) {
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
glDisable(GL_POINT_SMOOTH);
|
|
glDisable(GL_LINE_SMOOTH);
|
|
glDisable(GL_POLYGON_SMOOTH);
|
|
paths.alias.lock = PATHTEST_LOCKED;
|
|
glDisable(GL_STENCIL_TEST);
|
|
paths.stencil.lock = PATHTEST_LOCKED;
|
|
} else {
|
|
glDisable(GL_DEPTH_TEST);
|
|
}
|
|
glDepthRange(ptr->current.data3, ptr->current.data4);
|
|
glClearDepth(ptr->current.data2);
|
|
glClear(GL_DEPTH_BUFFER_BIT);
|
|
glDepthFunc(ptr->current.data5);
|
|
}
|
|
break;
|
|
case PATHOP_REPORT:
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
Output(2, " Depth Path active.\n");
|
|
Output(2, " Clear value = %f.\n", ptr->current.data2);
|
|
Output(2, " Range = %f, %f.\n", ptr->current.data3,
|
|
ptr->current.data4);
|
|
GetEnumName(ptr->current.data5, str);
|
|
Output(2, " Function = %s.\n", str);
|
|
} else {
|
|
Output(2, " Depth Path inactive.\n");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PathDither(void)
|
|
{
|
|
ditherPathStateRec *ptr = &paths.dither;
|
|
|
|
switch (paths.op) {
|
|
case PATHOP_INIT_DEFAULT:
|
|
ptr->current.data1 = PATHDATA_ENABLE;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_GARBAGE:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_CUSTOM:
|
|
ptr->current.data1 = ditherPath2.state;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_SET:
|
|
if (ptr->lock != PATHTEST_LOCKED) {
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
glEnable(GL_DITHER);
|
|
} else {
|
|
glDisable(GL_DITHER);
|
|
}
|
|
}
|
|
break;
|
|
case PATHOP_REPORT:
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
Output(2, " Dither Path active.\n");
|
|
} else {
|
|
Output(2, " Dither Path inactive.\n");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PathFog(void)
|
|
{
|
|
fogPathStateRec *ptr = &paths.fog;
|
|
char str[40];
|
|
long i;
|
|
|
|
switch (paths.op) {
|
|
case PATHOP_INIT_DEFAULT:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
for (i = 0; i < 4; i++) {
|
|
ptr->current.data2[i] = 0.0;
|
|
}
|
|
ptr->current.data3 = 0.0;
|
|
ptr->current.data4 = 1.0;
|
|
ptr->current.data5 = 0.0;
|
|
ptr->current.data6 = 1.0;
|
|
ptr->current.data7 = GL_EXP;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_GARBAGE:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
for (i = 0; i < 4; i++) {
|
|
ptr->current.data2[i] = PathGetRange_float(ptr->true.data2[i]);
|
|
}
|
|
ptr->current.data3 = PathGetRange_float(ptr->true.data3);
|
|
ptr->current.data4 = PathGetRange_float(ptr->true.data4);
|
|
ptr->current.data5 = PathGetRange_float(ptr->true.data5);
|
|
ptr->current.data6 = PathGetRange_float(ptr->true.data6);
|
|
ptr->current.data7 = PathGetList(ptr->true.data7);
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_CUSTOM:
|
|
ptr->current.data1 = fogPath2.state;
|
|
for (i = 0; i < 4; i++) {
|
|
ptr->current.data2[i] = fogPath2.color[i];
|
|
}
|
|
ptr->current.data3 = fogPath2.index;
|
|
ptr->current.data4 = fogPath2.density;
|
|
ptr->current.data5 = fogPath2.start;
|
|
ptr->current.data6 = fogPath2.end;
|
|
ptr->current.data7 = fogPath2.mode;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_SET:
|
|
if (ptr->lock != PATHTEST_LOCKED) {
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
glEnable(GL_FOG);
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
paths.depth.lock = PATHTEST_LOCKED;
|
|
} else {
|
|
glDisable(GL_FOG);
|
|
}
|
|
glFogfv(GL_FOG_COLOR, ptr->current.data2);
|
|
glFogfv(GL_FOG_INDEX, &ptr->current.data3);
|
|
glFogfv(GL_FOG_DENSITY, &ptr->current.data4);
|
|
glFogfv(GL_FOG_START, &ptr->current.data5);
|
|
glFogfv(GL_FOG_END, &ptr->current.data6);
|
|
glFogi(GL_FOG_MODE, ptr->current.data7);
|
|
}
|
|
break;
|
|
case PATHOP_REPORT:
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
Output(2, " Fog Path active.\n");
|
|
Output(2, " RGBA color = %f, %f, %f, %f.\n",
|
|
ptr->current.data2[0], ptr->current.data2[1],
|
|
ptr->current.data2[2], ptr->current.data2[3]);
|
|
Output(2, " Color Index = %1.1f.\n", ptr->current.data3);
|
|
Output(2, " Density = %f.\n", ptr->current.data4);
|
|
Output(2, " Start and end values = %f, %f.\n",
|
|
ptr->current.data5, ptr->current.data6);
|
|
GetEnumName(ptr->current.data7, str);
|
|
Output(2, " Mode = %s.\n", str);
|
|
} else {
|
|
Output(2, " Fog Path inactive.\n");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PathLogicOp(void)
|
|
{
|
|
logicOpPathStateRec *ptr = &paths.logicOp;
|
|
char str[40];
|
|
|
|
switch (paths.op) {
|
|
case PATHOP_INIT_DEFAULT:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = GL_COPY;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_GARBAGE:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = PathGetList(ptr->true.data2);
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_CUSTOM:
|
|
ptr->current.data1 = logicOpPath2.state;
|
|
ptr->current.data2 = logicOpPath2.func;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_SET:
|
|
if (ptr->lock != PATHTEST_LOCKED) {
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
glEnable(GL_LOGIC_OP);
|
|
} else {
|
|
glDisable(GL_LOGIC_OP);
|
|
}
|
|
glLogicOp(ptr->current.data2);
|
|
}
|
|
break;
|
|
case PATHOP_REPORT:
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
Output(2, " LogicOp Path active.\n");
|
|
GetEnumName(ptr->current.data2, str);
|
|
Output(2, " Function = %s.\n", str);
|
|
} else {
|
|
Output(2, " LogicOp Path inactive.\n");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PathShade(void)
|
|
{
|
|
shadePathStateRec *ptr = &paths.shade;
|
|
char str[40];
|
|
|
|
switch (paths.op) {
|
|
case PATHOP_INIT_DEFAULT:
|
|
ptr->current.data1 = GL_SMOOTH;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_GARBAGE:
|
|
ptr->current.data1 = GL_SMOOTH;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_CUSTOM:
|
|
ptr->current.data1 = shadePath2.mode;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_SET:
|
|
if (ptr->lock != PATHTEST_LOCKED) {
|
|
glShadeModel(ptr->current.data1);
|
|
}
|
|
break;
|
|
case PATHOP_REPORT:
|
|
GetEnumName(ptr->current.data1, str);
|
|
Output(2, " Shade model Path = %s.\n", str);
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PathStencil(void)
|
|
{
|
|
stencilPathStateRec *ptr = &paths.stencil;
|
|
char str[40];
|
|
|
|
switch (paths.op) {
|
|
case PATHOP_INIT_DEFAULT:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = 0;
|
|
ptr->current.data3 = ~0;
|
|
ptr->current.data4 = GL_ALWAYS;
|
|
ptr->current.data5 = 0;
|
|
ptr->current.data6 = ~0;
|
|
ptr->current.data7 = GL_KEEP;
|
|
ptr->current.data8 = GL_KEEP;
|
|
ptr->current.data9 = GL_KEEP;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_GARBAGE:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = PathGetRange_long(ptr->true.data2);
|
|
ptr->current.data3 = PathGetRange_ulong(ptr->true.data3);
|
|
ptr->current.data4 = PathGetList(ptr->true.data4);
|
|
ptr->current.data5 = PathGetRange_long(ptr->true.data5);
|
|
ptr->current.data6 = PathGetRange_ulong(ptr->true.data6);
|
|
ptr->current.data7 = PathGetList(ptr->true.data7);
|
|
ptr->current.data8 = PathGetList(ptr->true.data8);
|
|
ptr->current.data9 = PathGetList(ptr->true.data9);
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_CUSTOM:
|
|
ptr->current.data1 = stencilPath2.state;
|
|
ptr->current.data2 = stencilPath2.clear;
|
|
ptr->current.data3 = stencilPath2.writeMask;
|
|
ptr->current.data4 = stencilPath2.func;
|
|
ptr->current.data5 = stencilPath2.ref;
|
|
ptr->current.data6 = stencilPath2.mask;
|
|
ptr->current.data7 = stencilPath2.op1;
|
|
ptr->current.data8 = stencilPath2.op2;
|
|
ptr->current.data9 = stencilPath2.op3;
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_SET:
|
|
if (ptr->lock != PATHTEST_LOCKED) {
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
glEnable(GL_STENCIL_TEST);
|
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
paths.depth.lock = PATHTEST_LOCKED;
|
|
} else {
|
|
glDisable(GL_STENCIL_TEST);
|
|
}
|
|
|
|
glClearStencil(ptr->current.data2);
|
|
glClear(GL_STENCIL_BUFFER_BIT);
|
|
glStencilMask(ptr->current.data3);
|
|
glStencilFunc(ptr->current.data4, ptr->current.data5,
|
|
ptr->current.data6);
|
|
glStencilOp(ptr->current.data7, ptr->current.data8,
|
|
ptr->current.data9);
|
|
}
|
|
break;
|
|
case PATHOP_REPORT:
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
Output(2, " Stencil Path active.\n");
|
|
Output(2, " Clear value = %d.\n", ptr->current.data2);
|
|
Output(2, " Mask value = %X.\n",
|
|
ptr->current.data3);
|
|
GetEnumName(ptr->current.data4, str);
|
|
Output(2, " Function = %s, reference = %d, mask = %X.\n",
|
|
str, ptr->current.data5, ptr->current.data6);
|
|
GetEnumName(ptr->current.data7, str);
|
|
Output(2, " Op1 = %s, ", str);
|
|
GetEnumName(ptr->current.data8, str);
|
|
Output(2, "op2 = %s, ", str);
|
|
GetEnumName(ptr->current.data9, str);
|
|
Output(2, "op3 = %s.\n", str);
|
|
} else {
|
|
Output(2, " Stencil Path inactive.\n");
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
void PathStipple(void)
|
|
{
|
|
stipplePathStateRec *ptr = &paths.stipple;
|
|
long i, j;
|
|
|
|
switch (paths.op) {
|
|
case PATHOP_INIT_DEFAULT:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = 0;
|
|
ptr->current.data3 = 0;
|
|
for (i = 0; i < 128; i++) {
|
|
ptr->current.data4[i] = 0;
|
|
}
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_GARBAGE:
|
|
ptr->current.data1 = PATHDATA_DISABLE;
|
|
ptr->current.data2 = PathGetRange_long(ptr->true.data2);
|
|
ptr->current.data3 = PathGetRange_ushort(ptr->true.data3);
|
|
for (i = 0; i < 128; i++) {
|
|
ptr->current.data4[i] = PathGetRange_uchar(ptr->true.data4);
|
|
}
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_INIT_CUSTOM:
|
|
ptr->current.data1 = stipplePath2.state;
|
|
ptr->current.data2 = stipplePath2.lineRepeat;
|
|
ptr->current.data3 = stipplePath2.lineStipple;
|
|
for (i = 0; i < 128; i++) {
|
|
ptr->current.data4[i] = stipplePath2.polygonStipple[i];
|
|
}
|
|
ptr->lock = PATHTEST_UNLOCKED;
|
|
break;
|
|
case PATHOP_SET:
|
|
if (ptr->lock != PATHTEST_LOCKED) {
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
glEnable(GL_LINE_STIPPLE);
|
|
glEnable(GL_POLYGON_STIPPLE);
|
|
} else {
|
|
glDisable(GL_LINE_STIPPLE);
|
|
glDisable(GL_POLYGON_STIPPLE);
|
|
}
|
|
glLineStipple(ptr->current.data2, ptr->current.data3);
|
|
glPolygonStipple(ptr->current.data4);
|
|
}
|
|
break;
|
|
case PATHOP_REPORT:
|
|
if (ptr->current.data1 == PATHDATA_ENABLE) {
|
|
Output(2, " Stipple Path active.\n");
|
|
Output(2, " Line stipple = %X, repeat = %d.\n",
|
|
ptr->current.data3, ptr->current.data2);
|
|
Output(2, " Polygon stipple = %X",
|
|
ptr->current.data4[0]);
|
|
for (i = 1; i < 8; i++) {
|
|
Output(2, ", %X", ptr->current.data4[i]);
|
|
}
|
|
Output(2, "\n");
|
|
for (i = 1; i < 16; i++) {
|
|
Output(2, " %X",
|
|
ptr->current.data4[i*8]);
|
|
for (j = 1; j < 8; j++) {
|
|
Output(2, ", %X", ptr->current.data4[i*8+j]);
|
|
}
|
|
Output(2, "\n");
|
|
}
|
|
} else {
|
|
Output(2, " Stipple Path inactive.\n");
|
|
}
|
|
break;
|
|
}
|
|
}
|