⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 r_next.m

📁 Quake 2 Source code for students by Theerthan You can also download from idsoftwares.com
💻 M
📖 第 1 页 / 共 2 页
字号:

#import <AppKit/AppKit.h>
#include "../ref_soft/r_local.h"

/*
====================================================================

 OPENSTEP specific stuff

====================================================================
*/

@interface QuakeView : NSView
@end

NSWindow	*vid_window_i;
QuakeView	*vid_view_i;

unsigned	*buffernative;

//===========================================================


int Draw_SetResolution (void);

#define	TYPE_FULLSCREEN	0
#define	TYPE_WINDOWED	1
#define	TYPE_STRETCHED	2

#define	NUM_RESOLUTIONS		7
int	resolutions[NUM_RESOLUTIONS][2] = { 
	{320,200}, {320,240}, {400,300}, {512,384}, {640,480}, {800,600}, {1024,768} };

qboolean	available[NUM_RESOLUTIONS][3];
int			mode_res = 0, mode_type = TYPE_WINDOWED;

byte		gammatable[256];	// palette is sent through this
unsigned       	current_palette[256];
unsigned       	gamma_palette[256];

int			cursor_res, cursor_type;

cvar_t		*vid_x;
cvar_t		*vid_y;
cvar_t		*vid_mode;
cvar_t		*vid_stretched;
cvar_t		*vid_fullscreen;
cvar_t		*draw_gamma;

void Draw_BuildGammaTable (void);

/*
====================================================================

MENU INTERACTION

====================================================================
*/

void FindModes (void)
{
	if (mode_res < 0 || mode_res >= NUM_RESOLUTIONS)
		mode_res = 0;
	if (mode_type < 0 || mode_type > 3)
		mode_type = 1;

}

void RM_Print (int x, int y, char *s)
{
	while (*s)
	{
		Draw_Char (x, y, (*s)+128);
		s++;
		x += 8;
	}
}

/*
================
Draw_MenuDraw
================
*/
void Draw_MenuDraw (void)
{
	int		i, j;
	int		y;
	char	string[32];

	Draw_Pic ( 4, 4, "vidmodes");

	RM_Print (80, 32, "fullscreen windowed stretched");
	RM_Print (80, 40, "---------- -------- ---------");
	y = 50;

	// draw background behind selected mode
	Draw_Fill ( (mode_type+1)*80, y+(mode_res)*10, 40,10, 8);

	// draw available grid
	for (i=0 ; i<NUM_RESOLUTIONS ; i++, y+= 10)
	{
		sprintf (string, "%ix%i", resolutions[i][0], resolutions[i][1]);
		RM_Print (0, y, string);
		for (j=0 ; j<3 ; j++)
			if (available[i][j])
				RM_Print ( 80 + j*80, y, "*");
	}

	// draw the cursor
	Draw_Char (80 + cursor_type*80, 50 + cursor_res*10, 128 + 12+((int)(r_newrefdef.time*4)&1));
}


#define	K_TAB			9
#define	K_ENTER			13
#define	K_ESCAPE		27
#define	K_SPACE			32

// normal keys should be passed as lowercased ascii

#define	K_BACKSPACE		127
#define	K_UPARROW		128
#define	K_DOWNARROW		129
#define	K_LEFTARROW		130
#define	K_RIGHTARROW	131

/*
================
Draw_MenuKey
================
*/
void Draw_MenuKey (int key)
{
	switch (key)
	{
	case K_LEFTARROW:
		cursor_type--;
		if (cursor_type < 0)
			cursor_type = 2;
		break;

	case K_RIGHTARROW:
		cursor_type++;
		if (cursor_type > 2)
			cursor_type = 0;
		break;

	case K_UPARROW:
		cursor_res--;
		if (cursor_res < 0)
			cursor_res = NUM_RESOLUTIONS-1;
		break;

	case K_DOWNARROW:
		cursor_res++;
		if (cursor_res >= NUM_RESOLUTIONS)
			cursor_res = 0;
		break;

	case K_ENTER:
		ri.Cmd_ExecuteText (EXEC_NOW, va("vid_mode %i", cursor_res));
		switch (cursor_type)
                {
                    case TYPE_FULLSCREEN:
                        ri.Cmd_ExecuteText (EXEC_NOW, "vid_fullscreen 1");
                        ri.Cmd_ExecuteText (EXEC_NOW, "vid_stretched 0");
                        break;
                    case TYPE_WINDOWED:
                        ri.Cmd_ExecuteText (EXEC_NOW, "vid_fullscreen 0");
                        ri.Cmd_ExecuteText (EXEC_NOW, "vid_stretched 0");
                        break;
                    case TYPE_STRETCHED:
                        ri.Cmd_ExecuteText (EXEC_NOW, "vid_fullscreen 0");
                        ri.Cmd_ExecuteText (EXEC_NOW, "vid_stretched 1");
                        break;
		}
                    
		mode_res = cursor_res;
		mode_type = cursor_type;
		Draw_SetResolution ();
		break;

	default:
		break;
	}
}

//===========================================================


/*
================
Draw_SetResolution

The vid structure will be filled in on return
Also allocates the z buffer and surface cache
================
*/
int Draw_SetResolution (void)
{
    NSRect	content;
    
	if (vid_mode->value < 0)
		ri.Cmd_ExecuteText (EXEC_NOW, "vid_mode 0");
	if (vid_mode->value >= NUM_RESOLUTIONS)
		ri.Cmd_ExecuteText (EXEC_NOW, va("vid_mode %i", NUM_RESOLUTIONS-1));

	vid_mode->modified = false;
        vid_fullscreen->modified = false;
        vid_stretched->modified = false;

        // free nativebuffer
        if (buffernative)
        {
            free (buffernative);
            buffernative = NULL;
        }
        
	// free z buffer
	if (d_pzbuffer)
	{
		free (d_pzbuffer);
		d_pzbuffer = NULL;
	}
	// free surface cache
	if (sc_base)
	{
		D_FlushCaches ();
		free (sc_base);
		sc_base = NULL;
	}

        vid.width = resolutions[(int)(vid_mode->value)][0];
	vid.height = resolutions[(int)(vid_mode->value)][1];

	vid.win_width = vid.width;
	vid.win_height = vid.height;
	if (vid_stretched->value)
	{
		vid.win_width <<= 1;
		vid.win_height <<= 1;
	}

	vid.aspect = 1;
	vid.buffer = malloc (vid.width*vid.height);
	vid.rowbytes = vid.width;
        d_pzbuffer = malloc(vid.width*vid.height*2);
        buffernative = malloc(vid.width*vid.height*4);

	D_InitCaches ();

	Sys_SetPalette ((byte *)d_8to24table);

        if (vid_view_i)
            [vid_view_i unlockFocus];
        if (vid_window_i)
            [vid_window_i close];
//
// open a window
//
        content = NSMakeRect (vid_x->value,vid_y->value,vid.win_width, vid.win_height);
   vid_window_i = [[NSWindow alloc]
                       initWithContentRect:	content
                                 styleMask:	NSTitledWindowMask
                                   backing:	NSBackingStoreRetained
                            	defer:	NO
       ];

   [vid_window_i setDelegate: vid_window_i];
   [vid_window_i display];
   [NSApp activateIgnoringOtherApps: YES];
   [vid_window_i makeKeyAndOrderFront: nil];

//   NSPing ();

   content.origin.x = content.origin.y = 0;
   vid_view_i = [[QuakeView alloc] initWithFrame: content];
   [vid_window_i setContentView: vid_view_i];
   [vid_window_i makeFirstResponder: vid_view_i];
   [vid_window_i setDelegate: vid_view_i];

//   [vid_window_i addToEventMask: NS_FLAGSCHANGEDMASK];
   [vid_window_i setTitle: @"Bitmap Quake Console"];
 	[vid_window_i makeKeyAndOrderFront: nil];
        
   // leave focus locked forever
   [vid_view_i lockFocus];
   
	ri.VID_SetSize (vid.width, vid.height);

	return 0;
}

/*
@@@@@@@@@@@@@@@@@@@@@
Draw_Init

@@@@@@@@@@@@@@@@@@@@@
*/
int Draw_Init (void *window)
{
    [NSApplication sharedApplication];
	[NSApp finishLaunching];
  
	ri.Con_Printf (PRINT_ALL, "refresh version: "REF_VERSION"\n");

	vid_x = ri.Cvar_Get ("vid_x", "0", CVAR_ARCHIVE);
	vid_y = ri.Cvar_Get ("vid_y", "0", CVAR_ARCHIVE);
	vid_mode = ri.Cvar_Get ("vid_mode", "0", CVAR_ARCHIVE);
        vid_fullscreen = ri.Cvar_Get ("vid_fullscreen", "0", CVAR_ARCHIVE);
        vid_stretched = ri.Cvar_Get ("vid_stretched", "0", CVAR_ARCHIVE);
	draw_gamma = ri.Cvar_Get ("gamma", "1", CVAR_ARCHIVE);

        Draw_GetPalette ();

	Draw_BuildGammaTable ();

	// get the lighting colormap
	ri.FS_LoadFile ("gfx/colormap.lmp", (void **)&vid.colormap);
	if (!vid.colormap)
	{
		ri.Con_Printf (PRINT_ALL, "ERROR: Couldn't load gfx/colormap.lmp");
		return -1;
	}

	Draw_SetResolution ();

	R_Init ();

	return 0;
}


/*
@@@@@@@@@@@@@@@@@@@@@
Draw_Shutdown

@@@@@@@@@@@@@@@@@@@@@
*/
void Draw_Shutdown (void)
{
   R_Shutdown ();
}


/*
@@@@@@@@@@@@@@@@@@@@@
Draw_BuildGammaTable

@@@@@@@@@@@@@@@@@@@@@
*/
void Draw_BuildGammaTable (void)
{
	int		i, inf;
	float	g;

	draw_gamma->modified = false;
	g = draw_gamma->value;

	if (g == 1.0)
	{
		for (i=0 ; i<256 ; i++)
			gammatable[i] = i;
		return;
	}
	
	for (i=0 ; i<256 ; i++)
	{

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -