void init_gnugraph() { int k; int c; /* color, 0-15 */ int g; /* gray level, 0-15 */ GrSetMode(GR_default_graphics); numcolors = GrNumColors(); if ( (numcolors < 256) && color_flag ) shading_flag = 0; /* not enough for shading */ /* first index background color */ for ( c = 0 ; c < 16 ; c++ ) color_perm[c] = c; color_perm[background_color] = 0; color_perm[0] = background_color; if ( shading_flag && color_flag ) { for ( c = 0 ; c < 16 ; c++ ) for ( g = 0 ; g <= MAXGRAY ; g++ ) GrSetColor(CINDEX(c,g), (int)(0xff*(g+12.)/(MAXGRAY+12.)*rgb_colors[c][0]), (int)(0xff*(g+12.)/(MAXGRAY+12.)*rgb_colors[c][1]), (int)(0xff*(g+12.)/(MAXGRAY+12.)*rgb_colors[c][2])); } else if ( shading_flag ) /* shading */ { for ( g = 0 ; g <= MAXGRAY ; g++ ) GrSetColor(CINDEX(WHITE,g), (int)(0xff*(g+12.)/(MAXGRAY+12.)), (int)(0xff*(g+12.)/(MAXGRAY+12.)), (int)(0xff*(g+12.)/(MAXGRAY+12.))); } else if ( color_flag ) { for ( c = 0 ; c < 16 ; c++ ) GrSetColor(CINDEX(c,MAXGRAY), (int)(0xff*rgb_colors[c][0]), (int)(0xff*rgb_colors[c][1]), (int)(0xff*rgb_colors[c][2])); } if ( numcolors == 32768 ) GrClearScreen(CINDEX(WHITE,MAXGRAY)); else { GrFreeColor(0); GrSetColor(0,(int)(0xff*rgb_colors[background_color][0]), (int)(0xff*rgb_colors[background_color][1]), (int)(0xff*rgb_colors[background_color][2])); } maxx = GrMaxX(); maxy = GrMaxY(); if ( maxx/3 < maxy/3 ) { xscale = maxx/3; yscale = xscale; /* assume square pixel screen */ } else { yscale = maxy/3; xscale = yscale; /* assume square pixel screen */ } }
//this takes the same partms as draw_tmap, but draws a flat-shaded polygon void DrawTexPolyFlat(grsBitmap *bp,int nverts,g3sPoint **vertbuf) { pnt2d points[MAX_TMAP_VERTS]; int i; fix average_light; int color; Assert(nverts < MAX_TMAP_VERTS); average_light = vertbuf[0]->p3_uvl.l; for (i=1; i<nverts; i++) average_light += vertbuf[i]->p3_uvl.l; if (nverts == 4) average_light = f2i(average_light * NUM_LIGHTING_LEVELS/4); else average_light = f2i(average_light * NUM_LIGHTING_LEVELS/nverts); if (average_light < 0) average_light = 0; else if (average_light > NUM_LIGHTING_LEVELS-1) average_light = NUM_LIGHTING_LEVELS-1; color = grFadeTable[average_light*256 + bp->bmAvgColor]; GrSetColor(color); for (i=0;i<nverts;i++) { points[i].x = vertbuf[i]->p3_screen.x; points[i].y = vertbuf[i]->p3_screen.y; } gr_upoly_tmap(nverts,(int *) points); }
/* ** Set Palette */ static void DJGR_setpalette(PSD psd,int first,int count,MWPALENTRY *pal) { while(first < 256 && count-- > 0) { GrSetColor(first++, pal->r, pal->g, pal->b); ++pal; } }
/* ** Set Palette */ static void DJGR_setpalette(PSD psd,int first,int count,MWPALENTRY *pal) { int i; for(i=first; i < (first+count); i++) { //will set to all black screen if no valid palette data passed GrSetColor(i, pal->r, pal->g, pal->b); } }
void print_diagnostic( char message[DIAGNOSTIC_MESSAGE_MAX] ) { int w,h,aw; GrSetCurrentCanvas( NULL ); GrSetCurFont(editor_font); GrSetFontColor( CBLACK, CGREY ); GrGetStringSize( message, &w, &h, &aw ); GrString( 4, 583, message ); GrSetFontColor( CBLACK, CWHITE ); GrSetColor( CGREY ); GrRect( 4+w, 583, 799, 599 ); }
/* Make space for a pallette & make a 332 color map, if possible */ static void pallette_init() { unsigned i, r, g, b; #ifdef GRX if (GrNumColors() != 256) { GrSetColor(0, 0, 0, 0); GrSetColor(1, 255, 255, 255); return; } #else if (pallette == NULL) { pallette = malloc(sizeof(pallette_array)); if (pallette == NULL) { fprintf(stderr, "Failed to allocate pallette array\n"); exit(1); } } #endif i = 0; for (r=0;r<8;r++) for (g=0;g<8;g++) for (b=0;b<4;b++) { #ifdef GRX GrSetColor(i, r << 5, g << 5, b << 6); #else (*pallette)[i][0] = r << 3; (*pallette)[i][1] = g << 3; (*pallette)[i][2] = b << 4; #endif i++; } #ifndef GRX setmany(*pallette, 0, 256); #endif }
void editor_sub_status( const char *format, ... ) { int w,h,aw; va_list ap; va_start(ap, format); vsprintf(sub_status_line, format, ap); va_end(ap); GrSetCurrentCanvas( NULL ); GrSetCurFont(editor_font); GrSetFontColor( BM_XRGB(0,0,31), CGREY ); GrGetStringSize( sub_status_line, &w, &h, &aw ); GrString( 500, 583, sub_status_line ); GrSetFontColor( CBLACK, CWHITE ); GrSetColor( CGREY ); GrRect( 500+w, 583, 799, 599 ); }
//setup the editors windows, canvases, gadgets, etc. //called whenever the editor screen is selected void init_editor_screen() { // grsBitmap * bmp; if (editor_screen_open) return; grdCurScreen->scCanvas.cvFont = editor_font; //create canvas for game on the editor screen initializing = 1; GrSetCurrentCanvas(Canv_editor); Canv_editor->cvFont = editor_font; GrInitSubCanvas(Canv_editor_game,Canv_editor,GAMEVIEW_X,GAMEVIEW_Y,GAMEVIEW_W,GAMEVIEW_H); //Editor renders into full (320x200) game screen init_info = 1; //do other editor screen setup // Since the palette might have changed, find some good colors... CBLACK = GrFindClosestColor( 1, 1, 1 ); CGREY = GrFindClosestColor( 28, 28, 28 ); CWHITE = GrFindClosestColor( 38, 38, 38 ); CBRIGHT = GrFindClosestColor( 60, 60, 60 ); CRED = GrFindClosestColor( 63, 0, 0 ); GrSetCurFont(editor_font); GrSetFontColor( CBLACK, CWHITE ); EditorWindow = ui_open_window( 0 , 0, ED_SCREEN_W, ED_SCREEN_H, WIN_FILLED ); LargeViewBox = ui_add_gadget_userbox( EditorWindow,LVIEW_X,LVIEW_Y,LVIEW_W,LVIEW_H); #if ORTHO_VIEWS TopViewBox = ui_add_gadget_userbox( EditorWindow,TVIEW_X,TVIEW_Y,TVIEW_W,TVIEW_H); FrontViewBox = ui_add_gadget_userbox( EditorWindow,FVIEW_X,FVIEW_Y,FVIEW_W,FVIEW_H); RightViewBox = ui_add_gadget_userbox( EditorWindow,RVIEW_X,RVIEW_Y,RVIEW_W,RVIEW_H); #endif ui_gadget_calc_keys(EditorWindow); //make tab work for all windows GameViewBox = ui_add_gadget_userbox( EditorWindow, GAMEVIEW_X, GAMEVIEW_Y, GAMEVIEW_W, GAMEVIEW_H ); // GroupViewBox = ui_add_gadget_userbox( EditorWindow,GVIEW_X,GVIEW_Y,GVIEW_W,GVIEW_H); // GameViewBox->when_tab = GameViewBox->when_btab = (UI_GADGET *) LargeViewBox; // LargeViewBox->when_tab = LargeViewBox->when_btab = (UI_GADGET *) GameViewBox; // ui_gadget_calc_keys(EditorWindow); //make tab work for all windows ViewIcon = ui_add_gadget_icon( EditorWindow, "Lock\nview", 455,25+530, 40, 22, KEY_V+KEY_CTRLED, ToggleLockViewToCursegp ); AllIcon = ui_add_gadget_icon( EditorWindow, "Draw\nall", 500,25+530, 40, 22, KEY_A+KEY_CTRLED, ToggleDrawAllSegments ); AxesIcon = ui_add_gadget_icon( EditorWindow, "Coord\naxes",545,25+530, 40, 22, KEY_D+KEY_CTRLED, ToggleCoordAxes ); //-NOLIGHTICON- LightIcon = ui_add_gadget_icon( EditorWindow, "Light\ning", 590,25+530, 40, 22, KEY_L+KEY_SHIFTED,ToggleLighting ); ChaseIcon = ui_add_gadget_icon( EditorWindow, "Chase\nmode",635,25+530, 40, 22, -1, ToggleChaseMode ); OutlineIcon = ui_add_gadget_icon( EditorWindow, "Out\nline", 680,25+530, 40, 22, KEY_O, ToggleOutlineMode ); LockIcon = ui_add_gadget_icon( EditorWindow, "Lock\nstep", 725,25+530, 40, 22, KEY_L, ToggleLockstep ); meddraw_initViews(LargeViewBox->canvas); //ui_add_gadget_button( EditorWindow, 460, 510, 50, 25, "Quit", ExitEditor ); //ui_add_gadget_button( EditorWindow, 520, 510, 50, 25, "Lisp", CallLisp ); //ui_add_gadget_button( EditorWindow, 580, 510, 50, 25, "Mine", MineMenu ); //ui_add_gadget_button( EditorWindow, 640, 510, 50, 25, "Help", DoHelp ); //ui_add_gadget_button( EditorWindow, 460, 540, 50, 25, "Macro", MacroMenu ); //ui_add_gadget_button( EditorWindow, 520, 540, 50, 25, "About", ShowAbout ); //ui_add_gadget_button( EditorWindow, 640, 540, 50, 25, "Shell", DosShell ); ui_pad_activate( EditorWindow, PAD_X, PAD_Y ); Pad_text_canvas = GrCreateSubCanvas(Canv_editor, PAD_X + 250, PAD_Y + 8, 180, 160); ui_add_gadget_button( EditorWindow, PAD_X+6, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "<<", med_keypad_goto_prev ); ui_add_gadget_button( EditorWindow, PAD_X+PAD_WIDTH1+6, PAD_Y+(30*5)+22, PAD_WIDTH, 20, ">>", med_keypad_goto_next ); { int i; i = 0; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "SR", med_keypad_goto_0 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "SS", med_keypad_goto_1 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "CF", med_keypad_goto_2 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "TM", med_keypad_goto_3 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "OP", med_keypad_goto_4 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "OR", med_keypad_goto_5 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "GE", med_keypad_goto_6 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "LI", med_keypad_goto_7 ); i++; ui_add_gadget_button( EditorWindow, PAD_X+16+(i+2)*PAD_WIDTH1, PAD_Y+(30*5)+22, PAD_WIDTH, 20, "TT", med_keypad_goto_8 ); } GrSetCurFont(editor_font); menubar_show(); // INIT TEXTURE STUFF texpage_init( EditorWindow ); objpage_init( EditorWindow ); EditorWindow->keyboard_focus_gadget = (UI_GADGET *)LargeViewBox; canv_offscreen->cvFont = grdCurScreen->scCanvas.cvFont; // BigCanvas[0]->cvFont = grdCurScreen->scCanvas.cvFont; // BigCanvas[1]->cvFont = grdCurScreen->scCanvas.cvFont; // BigCanvasFirstTime = 1; // Draw status box GrSetCurrentCanvas( NULL ); GrSetColor( CGREY ); GrRect(STATUS_X,STATUS_Y,STATUS_X+STATUS_W-1,STATUS_Y+STATUS_H-1); //0, 582, 799, 599 ); // Draw icon box // GrSetCurrentCanvas( NULL ); // GrSetColor( CBRIGHT ); // GrRect( 528, 2, 798, 22); // GrSetColor( CGREY); // GrRect( 530, 2, 799, 20); UpdateFlags = UF_ALL; initializing = 0; editor_screen_open = 1; }
// --------------------------------------------------------------------------------------------------- //this function is the editor. called when editor mode selected. runs until //game mode or exit selected void editor(void) { int w,h; grsBitmap * savedbitmap; editorView *new_cv; static int padnum=0; vmsMatrix MouseRotMat,tempm; //@@short camera_objnum; //a camera for viewing init_editor(); InitCurve(); RestoreEffectBitmapIcons(); if (!SetScreenMode(SCREEN_EDITOR)) { SetScreenMode(SCREEN_GAME); gameStates.app.nFunctionMode=FMODE_GAME; //force back into game return; } GrSetCurrentCanvas( NULL ); GrSetCurFont(editor_font); //Editor renders into full (320x200) game screen SetWarnFunc(med_show_warning); gameStates.input.keys.bRepeat = 1; // Allow repeat in editor // _MARK_("start of editor");//Nuked to compile -KRB ui_mouse_hide(); ui_reset_idleSeconds(); gameData.objs.viewer = gameData.objs.console; slew_init(gameData.objs.console); UpdateFlags = UF_ALL; medlisp_update_screen(); //set the wire-frame window to be the current view currentView = &LargeView; if (faded_in==0) { faded_in = 1; //gr_pal_fade_in( grdCurScreen->pal ); } w = GameViewBox->canvas->cvBitmap.bmProps.w; h = GameViewBox->canvas->cvBitmap.bmProps.h; savedbitmap = GrCreateBitmap(w, h ); GrBmUBitBlt( w, h, 0, 0, 0, 0, &GameViewBox->canvas->cvBitmap, savedbitmap ); GrSetCurrentCanvas( GameViewBox->canvas ); GrSetCurFont(editor_font); //GrSetColor( CBLACK ); //gr_deaccent_canvas(); //gr_grey_canvas(); ui_mouse_show(); GrSetCurFont(editor_font); ui_pad_goto(padnum); gamestate_restore_check(); while (gameStates.app.nFunctionMode == FMODE_EDITOR) { GrSetCurFont(editor_font); info_display_all(EditorWindow); ModeFlag = 0; // Update the windows // Only update if there is no key waiting and we're not in // fast play mode. if (!KeyPeekKey()) //-- && (MacroStatus != UI_STATUS_FASTPLAY)) medlisp_update_screen(); //do editor stuff GrSetCurFont(editor_font); ui_mega_process(); last_keypress &= ~KEYDBGGED; // mask off delete key bit which has no function in editor. ui_window_do_gadgets(EditorWindow); doRobot_window(); doObject_window(); do_wall_window(); do_trigger_window(); do_hostage_window(); do_centers_window(); check_wall_validity(); Assert(gameData.walls.nWalls>=0); if (Gameview_lockstep) { static tSegment *old_cursegp=NULL; static int old_curside=-1; if (old_cursegp!=Cursegp || old_curside!=Curside) { SetPlayerFromCursegMinusOne(); old_cursegp = Cursegp; old_curside = Curside; } } if ( ui_get_idleSeconds() > COMPRESS_INTERVAL ) { med_compress_mine(); ui_reset_idleSeconds(); } // Commented out because it occupies about 25% of time in twirling the mine. // Removes some Asserts.... // med_check_all_vertices(); clear_editor_status(); // if enough time elapsed, clear editor status message TimedAutosave(mine_filename); set_editorTime_of_day(); GrSetCurrentCanvas( GameViewBox->canvas ); // Remove keys used for slew switch(last_keypress) { case KEY_PAD9: case KEY_PAD7: case KEY_PADPLUS: case KEY_PADMINUS: case KEY_PAD8: case KEY_PAD2: case KEY_LBRACKET: case KEY_RBRACKET: case KEY_PAD1: case KEY_PAD3: case KEY_PAD6: case KEY_PAD4: last_keypress = 0; } if ((last_keypress&0xff)==KEY_LSHIFT) last_keypress=0; if ((last_keypress&0xff)==KEY_RSHIFT) last_keypress=0; if ((last_keypress&0xff)==KEY_LCTRL) last_keypress=0; if ((last_keypress&0xff)==KEY_RCTRL) last_keypress=0; // if ((last_keypress&0xff)==KEY_LALT) last_keypress=0; // if ((last_keypress&0xff)==KEY_RALT) last_keypress=0; GrSetCurFont(editor_font); menubar_do( last_keypress ); //=================== DO FUNCTIONS ==================== if ( KeyFunction[ last_keypress ] != NULL ) { KeyFunction[last_keypress](); last_keypress = 0; } switch (last_keypress) { case 0: case KEY_Z: case KEY_G: case KEY_LALT: case KEY_RALT: case KEY_LCTRL: case KEY_RCTRL: case KEY_LSHIFT: case KEY_RSHIFT: case KEY_LAPOSTRO: break; case KEY_SHIFTED + KEY_L: ToggleLighting(); break; case KEY_F1: render_3d_in_big_window = !render_3d_in_big_window; UpdateFlags |= UF_ALL; break; default: { char kdesc[100]; GetKeyDescription( kdesc, last_keypress ); editor_status("Error: %s isn't bound to anything.", kdesc ); } } //================================================================ if (ModeFlag==1) { close_editor_screen(); gameStates.app.nFunctionMode=FMODE_EXIT; GrFreeBitmap( savedbitmap ); break; } if (ModeFlag==2) //-- && MacroStatus==UI_STATUS_NORMAL ) { ui_mouse_hide(); gameStates.app.nFunctionMode = FMODE_GAME; GrBmUBitBlt( w, h, 0, 0, 0, 0, savedbitmap, &GameViewBox->canvas->cvBitmap); GrFreeBitmap( savedbitmap ); break; } if (ModeFlag==3) //-- && MacroStatus==UI_STATUS_NORMAL ) { // med_compress_mine(); //will be called anyways before game. close_editor_screen(); gameStates.app.nFunctionMode=FMODE_GAME; //force back into game SetScreenMode(SCREEN_GAME); //put up game screen GrFreeBitmap( savedbitmap ); break; } // if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)GameViewBox) currentView=NULL; // if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)GroupViewBox) currentView=NULL; new_cv = currentView ; #if ORTHO_VIEWS if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)LargeViewBox) new_cv=&LargeView; if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)TopViewBox) new_cv=&TopView; if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)FrontViewBox) new_cv=&FrontView; if (CurWindow->keyboard_focus_gadget == (UI_GADGET *)RightViewBox) new_cv=&RightView; #endif if (new_cv != currentView ) { currentView->ev_changed = 1; new_cv->ev_changed = 1; currentView = new_cv; } CalcFrameTime(); if (slew_frame(0)) { //do movement and check keys UpdateFlags |= UF_GAME_VIEW_CHANGED; if (Gameview_lockstep) { Cursegp = &gameData.segs.segments[gameData.objs.console->nSegment]; med_create_new_segment_from_cursegp(); UpdateFlags |= UF_ED_STATE_CHANGED; } } // DO TEXTURE STUFF texpage_do(); objpage_do(); // Process selection of Cursegp using mouse. if (LargeViewBox->mouse_onme && LargeViewBox->b1_clicked && !render_3d_in_big_window) { int xcrd,ycrd; xcrd = LargeViewBox->b1_drag_x1; ycrd = LargeViewBox->b1_drag_y1; find_segments(xcrd,ycrd,LargeViewBox->canvas,&LargeView,Cursegp,Big_depth); // Sets globals N_found_segs, Found_segs // If shift is down, then add tSegment to found list if (gameStates.input.keys.pressed[ KEY_LSHIFT ] || gameStates.input.keys.pressed[ KEY_RSHIFT ]) subtract_found_segments_from_selected_list(); else add_found_segments_to_selected_list(); Found_seg_index = 0; if (N_found_segs > 0) { sort_seg_list(N_found_segs,Found_segs,&gameData.objs.console->position.vPos); Cursegp = &gameData.segs.segments[Found_segs[0]]; med_create_new_segment_from_cursegp(); if (LockView_to_cursegp) setView_target_from_segment(Cursegp); } UpdateFlags |= UF_ED_STATE_CHANGED | UF_VIEWPOINT_MOVED; } if (GameViewBox->mouse_onme && GameViewBox->b1_dragging) { int x, y; x = GameViewBox->b1_drag_x2; y = GameViewBox->b1_drag_y2; ui_mouse_hide(); GrSetCurrentCanvas( GameViewBox->canvas ); GrSetColor( 15 ); GrRect( x-1, y-1, x+1, y+1 ); ui_mouse_show(); } // Set current tSegment and tSide by clicking on a polygon in game window. // If ctrl pressed, also assign current texture map to that tSide. //if (GameViewBox->mouse_onme && (GameViewBox->b1_done_dragging || GameViewBox->b1_clicked)) { if ((GameViewBox->mouse_onme && GameViewBox->b1_clicked && !render_3d_in_big_window) || (LargeViewBox->mouse_onme && LargeViewBox->b1_clicked && render_3d_in_big_window)) { int xcrd,ycrd; int seg,tSide,face,poly,tmap; if (render_3d_in_big_window) { xcrd = LargeViewBox->b1_drag_x1; ycrd = LargeViewBox->b1_drag_y1; } else { xcrd = GameViewBox->b1_drag_x1; ycrd = GameViewBox->b1_drag_y1; } //Int3(); if (FindSegSideFace(xcrd,ycrd,&seg,&tSide,&face,&poly)) { if (seg<0) { //found an tObject CurObject_index = -seg-1; editor_status("Object %d selected.",CurObject_index); UpdateFlags |= UF_ED_STATE_CHANGED; } else { // See if either shift key is down and, if so, assign texture map if (gameStates.input.keys.pressed[KEY_LSHIFT] || gameStates.input.keys.pressed[KEY_RSHIFT]) { Cursegp = &gameData.segs.segments[seg]; Curside = tSide; AssignTexture(); med_create_new_segment_from_cursegp(); editor_status("Texture assigned"); } else if (gameStates.input.keys.pressed[KEY_G]) { tmap = gameData.segs.segments[seg].sides[tSide].nBaseTex; texpage_grab_current(tmap); editor_status( "Texture grabbed." ); } else if (gameStates.input.keys.pressed[ KEY_LAPOSTRO] ) { ui_mouse_hide(); moveObject_to_mouse_click(); } else { Cursegp = &gameData.segs.segments[seg]; Curside = tSide; med_create_new_segment_from_cursegp(); editor_status("Curseg and curside selected"); } } UpdateFlags |= UF_ED_STATE_CHANGED; } else editor_status("Click on non-texture ingored"); } // Allow specification of LargeView using mouse if (gameStates.input.keys.pressed[ KEY_LCTRL ] || gameStates.input.keys.pressed[ KEY_RCTRL ]) { ui_mouse_hide(); if ( (Mouse.dx!=0) && (Mouse.dy!=0) ) { GetMouseRotation( Mouse.dx, Mouse.dy, &MouseRotMat ); VmMatMul(&tempm,&LargeView.ev_matrix,&MouseRotMat); LargeView.ev_matrix = tempm; LargeView.ev_changed = 1; LargeView_index = -1; // say not one of the orthogonal views } } else { ui_mouse_show(); } if ( gameStates.input.keys.pressed[ KEY_Z ] ) { ui_mouse_hide(); if ( Mouse.dy!=0 ) { currentView->evDist += Mouse.dy*10000; currentView->ev_changed = 1; } } else { ui_mouse_show(); } } // _MARK_("end of editor");//Nuked to compile -KRB ClearWarnFunc(med_show_warning); //kill our camera tObject gameData.objs.viewer = gameData.objs.console; //reset viewer //@@ReleaseObject(camera_objnum); padnum = ui_pad_get_current(); close_editor(); ui_close(); }
/* Setting colors. */ void ws_setcolor(int i, int r, int g, int b) { GrFreeColor(i); GrSetColor(i, r, g, b); }
//------------------------------------------------------------------------------ //alternate interpreter for morphing tObject bool G3DrawMorphingModel (void *modelP, grsBitmap **modelBitmaps, vmsAngVec *pAnimAngles, vmsVector *vOffset, fix xModelLight, vmsVector *new_points, int nModel) { ubyte *p = modelP; fix *xGlowValues = NULL; G3CheckAndSwap (modelP); nGlow = -1; //glow off by default for (;;) { switch (WORDVAL (p)) { case OP_EOF: return 1; case OP_DEFPOINTS: { int n = WORDVAL (p+2); RotatePointList (modelPointList, new_points, NULL, n, 0); p += n*sizeof (vmsVector) + 4; break; } case OP_DEFP_START: { int n = WORDVAL (p+2); int s = WORDVAL (p+4); RotatePointList (modelPointList, new_points, NULL, n, s); p += n*sizeof (vmsVector) + 8; break; } case OP_FLATPOLY: { int nVerts = WORDVAL (p+2); int i, nTris; GrSetColor (WORDVAL (p+28)); for (i = 0; i < 2; i++) pointList [i] = modelPointList + WORDPTR (p+30) [i]; for (nTris=nVerts-2;nTris;nTris--) { pointList [2] = modelPointList + WORDPTR (p+30) [i++]; G3CheckAndDrawPoly (3, pointList, NULL, NULL); pointList [1] = pointList [2]; } p += 30 + ((nVerts&~1)+1)*2; break; } case OP_TMAPPOLY: { int nVerts = WORDVAL (p+2); tUVL *uvlList; tUVL morph_uvls [3]; int i, nTris; fix light; //calculate light from surface normal if (nGlow < 0) { //no glow light = -VmVecDot (&viewInfo.view [0].fVec, VECPTR (p+16)); light = f1_0/4 + (light*3)/4; light = FixMul (light, xModelLight); } else { //yes glow light = xGlowValues [nGlow]; nGlow = -1; } //now poke light into l values uvlList = (tUVL *) (p+30+ ((nVerts&~1)+1)*2); for (i = 0; i < 3; i++) morph_uvls [i].l = light; for (i = 0; i < 2; i++) { pointList [i] = modelPointList + WORDPTR (p+30) [i]; morph_uvls [i].u = uvlList [i].u; morph_uvls [i].v = uvlList [i].v; } for (nTris = nVerts - 2; nTris; nTris--) { pointList [2] = modelPointList + WORDPTR (p+30) [i]; morph_uvls [2].u = uvlList [i].u; morph_uvls [2].v = uvlList [i].v; i++; G3CheckAndDrawTMap (3, pointList, uvlList, modelBitmaps [WORDVAL (p+28)], NULL, NULL); pointList [1] = pointList [2]; morph_uvls [1].u = morph_uvls [2].u; morph_uvls [1].v = morph_uvls [2].v; } p += 30 + ((nVerts&~1)+1)*2 + nVerts*12; break; } case OP_SORTNORM: if (G3CheckNormalFacing (VECPTR (p+16), VECPTR (p+4)) > 0) { //facing //draw back then front G3DrawMorphingModel (p + WORDVAL (p+30), modelBitmaps, pAnimAngles, vOffset, xModelLight, new_points, nModel); G3DrawMorphingModel (p + WORDVAL (p+28), modelBitmaps, pAnimAngles, vOffset, xModelLight, new_points, nModel); } else { //not facing. draw front then back G3DrawMorphingModel (p + WORDVAL (p+28), modelBitmaps, pAnimAngles, vOffset, xModelLight, new_points, nModel); G3DrawMorphingModel (p + WORDVAL (p+30), modelBitmaps, pAnimAngles, vOffset, xModelLight, new_points, nModel); } p += 32; break; case OP_RODBM: { g3sPoint rodBotP, rodTopP; G3TransformAndEncodePoint (&rodBotP, VECPTR (p+20)); G3TransformAndEncodePoint (&rodTopP, VECPTR (p+4)); G3DrawRodTexPoly (modelBitmaps [WORDVAL (p+2)], &rodBotP, WORDVAL (p+16), &rodTopP, WORDVAL (p+32), f1_0, NULL); p += 36; break; } case OP_SUBCALL: { vmsAngVec *va = pAnimAngles ? &pAnimAngles [WORDVAL (p+2)] : &avZero; vmsVector vo = *VECPTR (p+4); if (gameData.models.nScale) VmVecScale (&vo, gameData.models.nScale); G3StartInstanceAngles (&vo, va); if (vOffset) VmVecInc (&vo, vOffset); G3DrawPolyModel (NULL, p + WORDVAL (p+16), modelBitmaps, pAnimAngles, &vo, xModelLight, xGlowValues, NULL, NULL, nModel); G3DoneInstance (); p += 20; break; } case OP_GLOW: if (xGlowValues) nGlow = WORDVAL (p+2); p += 4; break; } } return 1; }