Changes to support plib-1.0.7's font code.
GUI improvements contributed by Norman Vine. 3dfx.sh wrapper script now sets voodoo2 variables as well. Start of support for user defined texture scale. Start of support for precalculated texture coordinates.
This commit is contained in:
parent
a9b592c7e9
commit
28ee2efbf9
8 changed files with 119 additions and 48 deletions
Simulator
|
@ -240,6 +240,8 @@ static float TmpRollOutSmoothValue;
|
||||||
static puDialogBox *APAdjustDialog;
|
static puDialogBox *APAdjustDialog;
|
||||||
static puFrame *APAdjustFrame;
|
static puFrame *APAdjustFrame;
|
||||||
static puText *APAdjustDialogMessage;
|
static puText *APAdjustDialogMessage;
|
||||||
|
static puFont APAdjustLegendFont;
|
||||||
|
static puFont APAdjustLabelFont;
|
||||||
|
|
||||||
static int DialogX = 40;
|
static int DialogX = 40;
|
||||||
static int DialogY = 100;
|
static int DialogY = 100;
|
||||||
|
@ -477,10 +479,11 @@ void fgAPAdjustInit( void )
|
||||||
MaxAileronValue = APData->MaxAileron / MaxAileronAdjust;
|
MaxAileronValue = APData->MaxAileron / MaxAileronAdjust;
|
||||||
RollOutSmoothValue = APData->RollOutSmooth / RollOutSmoothAdjust;
|
RollOutSmoothValue = APData->RollOutSmooth / RollOutSmoothAdjust;
|
||||||
|
|
||||||
|
puGetDefaultFonts ( &APAdjustLegendFont, &APAdjustLabelFont );
|
||||||
APAdjustDialog = new puDialogBox (DialogX, DialogY);
|
APAdjustDialog = new puDialogBox (DialogX, DialogY);
|
||||||
{
|
{
|
||||||
int horiz_slider_height = puGetStringHeight () +
|
int horiz_slider_height = puGetStringHeight (APAdjustLabelFont) +
|
||||||
puGetStringDescender () +
|
puGetStringDescender (APAdjustLabelFont) +
|
||||||
PUSTR_TGAP + PUSTR_BGAP+5;
|
PUSTR_TGAP + PUSTR_BGAP+5;
|
||||||
|
|
||||||
APAdjustFrame = new puFrame (0,0,230, 85+4*horiz_slider_height);
|
APAdjustFrame = new puFrame (0,0,230, 85+4*horiz_slider_height);
|
||||||
|
|
|
@ -91,8 +91,8 @@ static puOneShot *YNdialogBoxOkButton = 0;
|
||||||
static puOneShot *YNdialogBoxNoButton = 0;
|
static puOneShot *YNdialogBoxNoButton = 0;
|
||||||
|
|
||||||
// Accessor CallBacks for external PUI Objects
|
// Accessor CallBacks for external PUI Objects
|
||||||
extern void NewAltitude( puObject *cb );
|
// extern void NewAltitude( puObject *cb );
|
||||||
extern void NewHeading( puObject *cb );
|
// extern void NewHeading( puObject *cb );
|
||||||
extern void fgAPAdjust( puObject * );
|
extern void fgAPAdjust( puObject * );
|
||||||
extern void fgLatLonFormatToggle( puObject *);
|
extern void fgLatLonFormatToggle( puObject *);
|
||||||
|
|
||||||
|
@ -512,7 +512,7 @@ puCallback viewSubmenuCb [] = {
|
||||||
char *aircraftSubmenu [] = {
|
char *aircraftSubmenu [] = {
|
||||||
"Autopilot", "Heading", "Altitude", "Navigation", "Communication", NULL};
|
"Autopilot", "Heading", "Altitude", "Navigation", "Communication", NULL};
|
||||||
puCallback aircraftSubmenuCb [] = {
|
puCallback aircraftSubmenuCb [] = {
|
||||||
fgAPAdjust, NewHeading, NewAltitude, fgLatLonFormatToggle, notCb, NULL };
|
fgAPAdjust, notCb, notCb, fgLatLonFormatToggle, notCb, NULL };
|
||||||
|
|
||||||
char *environmentSubmenu [] = {
|
char *environmentSubmenu [] = {
|
||||||
"Airport", "Terrain", "Weather", NULL};
|
"Airport", "Terrain", "Weather", NULL};
|
||||||
|
|
|
@ -16,12 +16,18 @@ if [ $WINDOW = "YES" ]; then
|
||||||
|
|
||||||
export SST_VGA_PASS=1
|
export SST_VGA_PASS=1
|
||||||
export SST_NOSHUTDOWN=1
|
export SST_NOSHUTDOWN=1
|
||||||
|
|
||||||
|
export SSTV2_VGA_PASS=1
|
||||||
|
export SSTV2_NOSHUTDOWN=1
|
||||||
else
|
else
|
||||||
# full screen
|
# full screen
|
||||||
export MESA_GLX_FX=fullscreen
|
export MESA_GLX_FX=fullscreen
|
||||||
|
|
||||||
unset SST_VGA_PASS
|
unset SST_VGA_PASS
|
||||||
unset SST_NOSHUTDOWN
|
unset SST_NOSHUTDOWN
|
||||||
|
|
||||||
|
unset SSTV2_VGA_PASS
|
||||||
|
unset SSTV2_NOSHUTDOWN
|
||||||
fi
|
fi
|
||||||
|
|
||||||
export FX_GLIDE_NO_SPLASH=1
|
export FX_GLIDE_NO_SPLASH=1
|
||||||
|
@ -33,9 +39,18 @@ export SST_GRXCLK=57
|
||||||
export SST_GAMMA=1.0
|
export SST_GAMMA=1.0
|
||||||
export SST_SCREENREFRESH=60
|
export SST_SCREENREFRESH=60
|
||||||
|
|
||||||
|
export SSTV2_FASTMEM=1
|
||||||
|
export SSTV2_FASTPCIRD=1
|
||||||
|
export SSTV2_GRXCLK=57
|
||||||
|
export SSTV2_GAMMA=1.0
|
||||||
|
export SSTV2_SCREENREFRESH=60
|
||||||
|
|
||||||
# Enable this if you wand solid vswap - disable to measure speeds
|
# Enable this if you wand solid vswap - disable to measure speeds
|
||||||
export SST_SWAP_EN_WAIT_ON_VSYNC=0
|
export SST_SWAP_EN_WAIT_ON_VSYNC=0
|
||||||
|
export SSTV2_SWAP_EN_WAIT_ON_VSYNC=0
|
||||||
|
|
||||||
# export SST_SWA_EN_WAIT_ON_VSYNC=1
|
# export SST_SWA_EN_WAIT_ON_VSYNC=1
|
||||||
|
# export SSTV2_SWA_EN_WAIT_ON_VSYNC=1
|
||||||
|
|
||||||
echo executing $*
|
echo executing $*
|
||||||
|
|
||||||
|
|
|
@ -56,8 +56,8 @@
|
||||||
#include "options.hxx"
|
#include "options.hxx"
|
||||||
#include "views.hxx"
|
#include "views.hxx"
|
||||||
|
|
||||||
extern void NewAltitude( puObject *cb );
|
// extern void NewAltitude( puObject *cb );
|
||||||
extern void NewHeading( puObject *cb );
|
// extern void NewHeading( puObject *cb );
|
||||||
|
|
||||||
// Force an update of the sky and lighting parameters
|
// Force an update of the sky and lighting parameters
|
||||||
static void local_update_sky_and_lighting_params( void ) {
|
static void local_update_sky_and_lighting_params( void ) {
|
||||||
|
@ -374,12 +374,12 @@ void GLUTspecialkey(int k, int x, int y) {
|
||||||
return;
|
return;
|
||||||
case GLUT_KEY_F11: // F11 Altitude Dialog.
|
case GLUT_KEY_F11: // F11 Altitude Dialog.
|
||||||
FG_LOG(FG_INPUT, FG_INFO, "Invoking Altitude call back function");
|
FG_LOG(FG_INPUT, FG_INFO, "Invoking Altitude call back function");
|
||||||
NewAltitude( NULL );
|
// NewAltitude( NULL );
|
||||||
//exit(1);
|
//exit(1);
|
||||||
return;
|
return;
|
||||||
case GLUT_KEY_F12: // F12 Heading Dialog...
|
case GLUT_KEY_F12: // F12 Heading Dialog...
|
||||||
FG_LOG(FG_INPUT, FG_INFO, "Invoking Heading call back function");
|
FG_LOG(FG_INPUT, FG_INFO, "Invoking Heading call back function");
|
||||||
NewHeading( NULL );
|
// NewHeading( NULL );
|
||||||
return;
|
return;
|
||||||
case GLUT_KEY_UP:
|
case GLUT_KEY_UP:
|
||||||
if( fgAPAltitudeEnabled() || fgAPTerrainFollowEnabled() ) {
|
if( fgAPAltitudeEnabled() || fgAPTerrainFollowEnabled() ) {
|
||||||
|
|
|
@ -388,7 +388,7 @@ int fgInitSubsystems( void )
|
||||||
// above values
|
// above values
|
||||||
|
|
||||||
fgFDMInit( current_options.get_flight_model(), cur_fdm_state,
|
fgFDMInit( current_options.get_flight_model(), cur_fdm_state,
|
||||||
1.0 / DEFAULT_MODEL_HZ );
|
1.0 / DEFAULT_MODEL_HZ );
|
||||||
|
|
||||||
// I'm just sticking this here for now, it should probably move
|
// I'm just sticking this here for now, it should probably move
|
||||||
// eventually
|
// eventually
|
||||||
|
@ -429,14 +429,18 @@ int fgInitSubsystems( void )
|
||||||
void fgReInitSubsystems( void )
|
void fgReInitSubsystems( void )
|
||||||
{
|
{
|
||||||
FGInterface *f = current_aircraft.fdm_state;
|
FGInterface *f = current_aircraft.fdm_state;
|
||||||
// fgLIGHT *l = &cur_light_params;
|
|
||||||
// fgTIME *t = &cur_time_params;
|
|
||||||
FGView *v = ¤t_view;
|
FGView *v = ¤t_view;
|
||||||
|
FGTime *t = FGTime::cur_time_params;
|
||||||
fgInitPosition();
|
|
||||||
|
int toggle_pause = t->getPause();
|
||||||
|
|
||||||
|
if( !toggle_pause )
|
||||||
|
t->togglePauseMode();
|
||||||
|
|
||||||
|
fgInitPosition();
|
||||||
if( fgTileMgrInit() ) {
|
if( fgTileMgrInit() ) {
|
||||||
// Load the local scenery data
|
// Load the local scenery data
|
||||||
fgTileMgrUpdate();
|
fgTileMgrUpdate();
|
||||||
} else {
|
} else {
|
||||||
FG_LOG( FG_GENERAL, FG_ALERT, "Error in Tile Manager initialization!" );
|
FG_LOG( FG_GENERAL, FG_ALERT, "Error in Tile Manager initialization!" );
|
||||||
exit(-1);
|
exit(-1);
|
||||||
|
@ -462,11 +466,11 @@ void fgReInitSubsystems( void )
|
||||||
(sea_level_radius_meters * METER_TO_FEET) );
|
(sea_level_radius_meters * METER_TO_FEET) );
|
||||||
f->set_Sea_level_radius( sea_level_radius_meters * METER_TO_FEET );
|
f->set_Sea_level_radius( sea_level_radius_meters * METER_TO_FEET );
|
||||||
|
|
||||||
f->set_sin_cos_longitude(f->get_Longitude());
|
f->set_sin_cos_longitude(f->get_Longitude());
|
||||||
f->set_sin_cos_latitude(f->get_Latitude());
|
f->set_sin_cos_latitude(f->get_Latitude());
|
||||||
|
|
||||||
f->set_sin_lat_geocentric(sin(lat_geoc));
|
f->set_sin_lat_geocentric(sin(lat_geoc));
|
||||||
f->set_cos_lat_geocentric(cos(lat_geoc));
|
f->set_cos_lat_geocentric(cos(lat_geoc));
|
||||||
|
|
||||||
// The following section sets up the flight model EOM parameters
|
// The following section sets up the flight model EOM parameters
|
||||||
// and should really be read in from one or more files.
|
// and should really be read in from one or more files.
|
||||||
|
@ -500,7 +504,7 @@ void fgReInitSubsystems( void )
|
||||||
v->UpdateWorldToEye(f);
|
v->UpdateWorldToEye(f);
|
||||||
|
|
||||||
fgFDMInit( current_options.get_flight_model(), cur_fdm_state,
|
fgFDMInit( current_options.get_flight_model(), cur_fdm_state,
|
||||||
1.0 / DEFAULT_MODEL_HZ );
|
1.0 / DEFAULT_MODEL_HZ );
|
||||||
|
|
||||||
scenery.cur_elev = f->get_Runway_altitude() * FEET_TO_METER;
|
scenery.cur_elev = f->get_Runway_altitude() * FEET_TO_METER;
|
||||||
|
|
||||||
|
@ -508,6 +512,9 @@ void fgReInitSubsystems( void )
|
||||||
f->set_Altitude( f->get_Runway_altitude() + 3.758099 );
|
f->set_Altitude( f->get_Runway_altitude() + 3.758099 );
|
||||||
}
|
}
|
||||||
|
|
||||||
controls.reset_all();
|
controls.reset_all();
|
||||||
fgAPReset();
|
fgAPReset();
|
||||||
|
|
||||||
|
if( !toggle_pause )
|
||||||
|
t->togglePauseMode();
|
||||||
}
|
}
|
||||||
|
|
|
@ -209,7 +209,14 @@ fgOPTIONS::fgOPTIONS() :
|
||||||
|
|
||||||
void
|
void
|
||||||
fgOPTIONS::toggle_panel() {
|
fgOPTIONS::toggle_panel() {
|
||||||
|
|
||||||
|
FGTime *t = FGTime::cur_time_params;
|
||||||
|
|
||||||
|
int toggle_pause = t->getPause();
|
||||||
|
|
||||||
|
if( !toggle_pause )
|
||||||
|
t->togglePauseMode();
|
||||||
|
|
||||||
if( panel_status ) {
|
if( panel_status ) {
|
||||||
panel_status = false;
|
panel_status = false;
|
||||||
} else {
|
} else {
|
||||||
|
@ -220,9 +227,12 @@ fgOPTIONS::toggle_panel() {
|
||||||
new FGPanel;
|
new FGPanel;
|
||||||
fov *= 0.4232;
|
fov *= 0.4232;
|
||||||
} else {
|
} else {
|
||||||
fov *= (1.0 /0.4232);
|
fov *= (1.0 / 0.4232);
|
||||||
}
|
}
|
||||||
fgReshape( xsize, ysize);
|
fgReshape( xsize, ysize);
|
||||||
|
|
||||||
|
if( !toggle_pause )
|
||||||
|
t->togglePauseMode();
|
||||||
}
|
}
|
||||||
|
|
||||||
double
|
double
|
||||||
|
@ -306,19 +316,19 @@ fgOPTIONS::parse_time(const string& time_in) {
|
||||||
|
|
||||||
long int fgOPTIONS::parse_date( const string& date)
|
long int fgOPTIONS::parse_date( const string& date)
|
||||||
{
|
{
|
||||||
struct tm gmt;
|
struct tm gmt;
|
||||||
char * date_str, num[256];
|
char * date_str, num[256];
|
||||||
int i;
|
int i;
|
||||||
// initialize to zero
|
// initialize to zero
|
||||||
gmt.tm_sec = 0;
|
gmt.tm_sec = 0;
|
||||||
gmt.tm_min = 0;
|
gmt.tm_min = 0;
|
||||||
gmt.tm_hour = 0;
|
gmt.tm_hour = 0;
|
||||||
gmt.tm_mday = 0;
|
gmt.tm_mday = 0;
|
||||||
gmt.tm_mon = 0;
|
gmt.tm_mon = 0;
|
||||||
gmt.tm_year = 0;
|
gmt.tm_year = 0;
|
||||||
gmt.tm_isdst = 0; // ignore daylight savingtime for the moment
|
gmt.tm_isdst = 0; // ignore daylight savingtime for the moment
|
||||||
date_str = (char *)date.c_str();
|
date_str = (char *)date.c_str();
|
||||||
// get year
|
// get year
|
||||||
if ( strlen(date_str) ) {
|
if ( strlen(date_str) ) {
|
||||||
i = 0;
|
i = 0;
|
||||||
while ( (date_str[0] != ':') && (date_str[0] != '\0') ) {
|
while ( (date_str[0] != ':') && (date_str[0] != '\0') ) {
|
||||||
|
@ -332,7 +342,7 @@ long int fgOPTIONS::parse_date( const string& date)
|
||||||
num[i] = '\0';
|
num[i] = '\0';
|
||||||
gmt.tm_year = atoi(num) - 1900;
|
gmt.tm_year = atoi(num) - 1900;
|
||||||
}
|
}
|
||||||
// get month
|
// get month
|
||||||
if ( strlen(date_str) ) {
|
if ( strlen(date_str) ) {
|
||||||
i = 0;
|
i = 0;
|
||||||
while ( (date_str[0] != ':') && (date_str[0] != '\0') ) {
|
while ( (date_str[0] != ':') && (date_str[0] != '\0') ) {
|
||||||
|
@ -690,8 +700,7 @@ int fgOPTIONS::parse_config_file( const string& path ) {
|
||||||
FG_LOG( FG_GENERAL, FG_INFO, "Processing config file: " << path );
|
FG_LOG( FG_GENERAL, FG_INFO, "Processing config file: " << path );
|
||||||
|
|
||||||
in >> skipcomment;
|
in >> skipcomment;
|
||||||
while ( !in.eof() )
|
while ( !in.eof() ) {
|
||||||
{
|
|
||||||
string line;
|
string line;
|
||||||
|
|
||||||
#ifdef GETLINE_NEEDS_TERMINATOR
|
#ifdef GETLINE_NEEDS_TERMINATOR
|
||||||
|
|
|
@ -241,6 +241,7 @@ public:
|
||||||
inline double *get_surface_south() { return surface_south; }
|
inline double *get_surface_south() { return surface_south; }
|
||||||
inline double *get_surface_east() { return surface_east; }
|
inline double *get_surface_east() { return surface_east; }
|
||||||
inline double *get_local_up() { return local_up; }
|
inline double *get_local_up() { return local_up; }
|
||||||
|
inline double *get_view_forward() { return view_forward; }
|
||||||
inline const MAT3mat *get_WORLD_TO_EYE() const { return &WORLD_TO_EYE; }
|
inline const MAT3mat *get_WORLD_TO_EYE() const { return &WORLD_TO_EYE; }
|
||||||
inline GLfloat *get_MODEL_VIEW() { return MODEL_VIEW; }
|
inline GLfloat *get_MODEL_VIEW() { return MODEL_VIEW; }
|
||||||
};
|
};
|
||||||
|
|
|
@ -67,6 +67,7 @@ FG_USING_STD(string);
|
||||||
|
|
||||||
|
|
||||||
static double normals[FG_MAX_NODES][3];
|
static double normals[FG_MAX_NODES][3];
|
||||||
|
static double tex_coords[FG_MAX_NODES*3][3];
|
||||||
|
|
||||||
|
|
||||||
// given three points defining a triangle, calculate the normal
|
// given three points defining a triangle, calculate the normal
|
||||||
|
@ -135,8 +136,9 @@ int fgObjLoad( const string& path, fgTILE *t) {
|
||||||
// GLfloat sgenparams[] = { 1.0, 0.0, 0.0, 0.0 };
|
// GLfloat sgenparams[] = { 1.0, 0.0, 0.0, 0.0 };
|
||||||
GLint display_list = 0;
|
GLint display_list = 0;
|
||||||
int shading;
|
int shading;
|
||||||
int in_fragment = 0, in_faces = 0, vncount;
|
int in_fragment = 0, in_faces = 0, vncount, vtcount;
|
||||||
int n1 = 0, n2 = 0, n3 = 0, n4 = 0;
|
int n1 = 0, n2 = 0, n3 = 0, n4 = 0;
|
||||||
|
int tex;
|
||||||
int last1 = 0, last2 = 0, odd = 0;
|
int last1 = 0, last2 = 0, odd = 0;
|
||||||
double (*nodes)[3];
|
double (*nodes)[3];
|
||||||
Point3D center;
|
Point3D center;
|
||||||
|
@ -155,6 +157,7 @@ int fgObjLoad( const string& path, fgTILE *t) {
|
||||||
in_fragment = 0;
|
in_fragment = 0;
|
||||||
t->ncount = 0;
|
t->ncount = 0;
|
||||||
vncount = 0;
|
vncount = 0;
|
||||||
|
vtcount = 0;
|
||||||
t->bounding_radius = 0.0;
|
t->bounding_radius = 0.0;
|
||||||
nodes = t->nodes;
|
nodes = t->nodes;
|
||||||
center = t->center;
|
center = t->center;
|
||||||
|
@ -273,6 +276,18 @@ int fgObjLoad( const string& path, fgTILE *t) {
|
||||||
"Read too many vertex normals ... dying :-(" );
|
"Read too many vertex normals ... dying :-(" );
|
||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
} else if ( token == "vt" ) {
|
||||||
|
// vertex texture coordinate
|
||||||
|
if ( vtcount < FG_MAX_NODES*3 ) {
|
||||||
|
in >> tex_coords[vtcount][0]
|
||||||
|
>> tex_coords[vtcount][1];
|
||||||
|
vtcount++;
|
||||||
|
} else {
|
||||||
|
FG_LOG( FG_TERRAIN, FG_ALERT,
|
||||||
|
"Read too many vertex texture coords ... dying :-("
|
||||||
|
);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
} else if ( token == "v" ) {
|
} else if ( token == "v" ) {
|
||||||
// node (vertex)
|
// node (vertex)
|
||||||
if ( t->ncount < FG_MAX_NODES ) {
|
if ( t->ncount < FG_MAX_NODES ) {
|
||||||
|
@ -397,14 +412,28 @@ int fgObjLoad( const string& path, fgTILE *t) {
|
||||||
|
|
||||||
in >> n1;
|
in >> n1;
|
||||||
xglNormal3dv(normals[n1]);
|
xglNormal3dv(normals[n1]);
|
||||||
pp = calc_tex_coords(nodes[n1], center);
|
if ( in.get( c ) && c == '/' ) {
|
||||||
xglTexCoord2f(pp.lon(), pp.lat());
|
in >> tex;
|
||||||
|
pp.setx( tex_coords[tex][0] );
|
||||||
|
pp.sety( tex_coords[tex][1] );
|
||||||
|
} else {
|
||||||
|
in.putback( c );
|
||||||
|
pp = calc_tex_coords(nodes[n1], center);
|
||||||
|
}
|
||||||
|
xglTexCoord2f(pp.x(), pp.y());
|
||||||
xglVertex3dv(nodes[n1]);
|
xglVertex3dv(nodes[n1]);
|
||||||
|
|
||||||
in >> n2;
|
in >> n2;
|
||||||
xglNormal3dv(normals[n2]);
|
xglNormal3dv(normals[n2]);
|
||||||
pp = calc_tex_coords(nodes[n2], center);
|
if ( in.get( c ) && c == '/' ) {
|
||||||
xglTexCoord2f(pp.lon(), pp.lat());
|
in >> tex;
|
||||||
|
pp.setx( tex_coords[tex][0] );
|
||||||
|
pp.sety( tex_coords[tex][1] );
|
||||||
|
} else {
|
||||||
|
in.putback( c );
|
||||||
|
pp = calc_tex_coords(nodes[n2], center);
|
||||||
|
}
|
||||||
|
xglTexCoord2f(pp.x(), pp.y());
|
||||||
xglVertex3dv(nodes[n2]);
|
xglVertex3dv(nodes[n2]);
|
||||||
|
|
||||||
// read all subsequent numbers until next thing isn't a number
|
// read all subsequent numbers until next thing isn't a number
|
||||||
|
@ -423,8 +452,15 @@ int fgObjLoad( const string& path, fgTILE *t) {
|
||||||
// << n1 << "," << n2 << "," << n3
|
// << n1 << "," << n2 << "," << n3
|
||||||
// << endl;
|
// << endl;
|
||||||
xglNormal3dv(normals[n3]);
|
xglNormal3dv(normals[n3]);
|
||||||
pp = calc_tex_coords(nodes[n3], center);
|
if ( in.get( c ) && c == '/' ) {
|
||||||
xglTexCoord2f(pp.lon(), pp.lat());
|
in >> tex;
|
||||||
|
pp.setx( tex_coords[tex][0] );
|
||||||
|
pp.sety( tex_coords[tex][1] );
|
||||||
|
} else {
|
||||||
|
in.putback( c );
|
||||||
|
pp = calc_tex_coords(nodes[n3], center);
|
||||||
|
}
|
||||||
|
xglTexCoord2f(pp.x(), pp.y());
|
||||||
xglVertex3dv(nodes[n3]);
|
xglVertex3dv(nodes[n3]);
|
||||||
|
|
||||||
fragment.add_face(n1, n2, n3);
|
fragment.add_face(n1, n2, n3);
|
||||||
|
|
Loading…
Add table
Reference in a new issue