游戏开发论坛

 找回密码
 立即注册
搜索
12
返回列表 发新帖
楼主: 疯子阿虹

为什么随处可见hl2源代码讨论却不见quake2源代码讨论?

[复制链接]

4

主题

65

帖子

65

积分

注册会员

Rank: 2

积分
65
QQ
发表于 2004-6-28 19:33:00 | 显示全部楼层

Re:为什么随处可见hl2源代码讨论却不见quake2源代码讨论?

顶,ONLY QUAKE
我也在看代码哦.

8

主题

109

帖子

127

积分

注册会员

Rank: 2

积分
127
发表于 2005-7-24 23:15:00 | 显示全部楼层

Re:为什么随处可见hl2源代码讨论却不见quake2源代码讨论?

正在看quake 2源码,好像很复杂哦。他是如何做到软件渲染和硬件渲染的切换的呢?是不是和那几个dll有关?

34

主题

629

帖子

629

积分

高级会员

Rank: 4

积分
629
发表于 2005-7-25 09:09:00 | 显示全部楼层

Re:为什么随处可见hl2源代码讨论却不见quake2源代码讨论?

浮躁的表现,很多人觉得官方公开的没有价值,泄漏的才珍贵,quake2有很多值得学习的地方,代码下载很久了,可惜一直没时间看

38

主题

120

帖子

120

积分

注册会员

Rank: 2

积分
120
发表于 2005-7-25 13:01:00 | 显示全部楼层

Re:为什么随处可见hl2源代码讨论却不见quake2源代码讨论?

貌似QUAKE 2 是 纯C 开发的。
俺害怕受到C 思想的影响。

18

主题

631

帖子

660

积分

高级会员

Rank: 4

积分
660
发表于 2005-7-25 13:08:00 | 显示全部楼层

Re:为什么随处可见hl2源代码讨论却不见quake2源代码讨论?

德军总部 - DOOM - Quake - DOOM2 - Quake2 - Quake3 - DOOM3 - DOOM4

每一步脚印都有可取之处。。。。。。。。。

18

主题

631

帖子

660

积分

高级会员

Rank: 4

积分
660
发表于 2005-7-25 16:58:00 | 显示全部楼层

quake2 的渲染调用过程

首先看quake2.exe工程中的WinMain() (\quake2-3.21\win32\sys_win.c) 见其中的初始化函数 Qcommon_Init (argc, argv);

见\quake2-3.21\qcommon\common.c 中的void Qcommon_Init (int argc, char **argv) 其中有函数 CL_Init ();

再看\quake2-3.21\client\cl_main.c 中的void CL_Init (void) 可看到 VID_Init (); 在这里有Linux和sgi的部分,声音驱动
是放在视频之前的,而到了window是声音必须放在后面的.

\quake2-3.21\win32\vid_dll.c 中 void VID_Init (void)

最下面就是视频的启动调用
        /* Start the graphics mode and load refresh DLL */
        VID_CheckChanges();
       
进入 VID_CheckChanges 函数,

                Com_sprintf( name, sizeof(name), "ref_%s.dll", vid_ref->string );
               
                这里就是根据参数进行调用视频模块的dll ref_gl.dll 和 ref_soft.dll
               
下面紧接着就是调用选定的dll进行初始化         if ( !VID_LoadRefresh( name ) )


qboolean VID_LoadRefresh( char *name )
{
        refimport_t        ri;                //重要的结构,将视频dll的函数都定义在其中 见\quake2-3.21\client\ref.h
        GetRefAPI_t        GetRefAPI;        //typedef        refexport_t        (*GetRefAPI_t) (refimport_t); 文件位置同上,dll的函数连接点
       
        if ( reflib_active )
        {
                re.Shutdown();
                VID_FreeReflib ();
        }

        Com_Printf( "------- Loading %s -------\n", name );

        if ( ( reflib_library = LoadLibrary( name ) ) == 0 )
        {
                Com_Printf( "LoadLibrary(\"%s\") failed\n", name );

                return false;
        }

        ri.Cmd_AddCommand = Cmd_AddCommand;
        ri.Cmd_RemoveCommand = Cmd_RemoveCommand;
        ri.Cmd_Argc = Cmd_Argc;
        ri.Cmd_Argv = Cmd_Argv;
        ri.Cmd_ExecuteText = Cbuf_ExecuteText;
        ri.Con_Printf = VID_Printf;
        ri.Sys_Error = VID_Error;
        ri.FS_LoadFile = FS_LoadFile;
        ri.FS_FreeFile = FS_FreeFile;
        ri.FS_Gamedir = FS_Gamedir;
        ri.Cvar_Get = Cvar_Get;
        ri.Cvar_Set = Cvar_Set;
        ri.Cvar_SetValue = Cvar_SetValue;
        ri.Vid_GetModeInfo = VID_GetModeInfo;
        ri.Vid_MenuInit = VID_MenuInit;
        ri.Vid_NewWindow = VID_NewWindow;

        //在这里将Dll中的GetRefAPI导出,所有的函数都获得,gl和soft的Dll其导出这里是一样的,
        //具体实现函数在内部才有不同.可以看ref_gl和ref_soft两个工程就可知道.
        if ( ( GetRefAPI = (void *) GetProcAddress( reflib_library, "GetRefAPI" ) ) == 0 )
                Com_Error( ERR_FATAL, "GetProcAddress failed on %s", name );

        re = GetRefAPI( ri );//获得成功

        if (re.api_version != API_VERSION)
        {
                VID_FreeReflib ();
                Com_Error (ERR_FATAL, "%s has incompatible api_version", name);
        }

        //调用初始化
        if ( re.Init( global_hInstance, MainWndProc ) == -1 )
        {
                re.Shutdown();
                VID_FreeReflib ();
                return false;
        }

        Com_Printf( "------------------------------------\n");
        reflib_active = true;

//======
//PGM
        vidref_val = VIDREF_OTHER;
        if(vid_ref)
        {
                if(!strcmp (vid_ref->string, "gl"))
                        vidref_val = VIDREF_GL;
                else if(!strcmp(vid_ref->string, "soft"))
                        vidref_val = VIDREF_SOFT;
        }
//PGM
//======

        return true;
}               

//quake2就这样开始了.

38

主题

120

帖子

120

积分

注册会员

Rank: 2

积分
120
发表于 2005-7-25 21:18:00 | 显示全部楼层

Re:为什么随处可见hl2源代码讨论却不见quake2源代码讨论?

我最害怕这样的代码了,  看起来 别扭。 HALF-LIFE2 里的这样代码估计都是 QUAKE3 改进来的
HALF-LIFE2 中的 vbsp.exe 代码片段。

int FindFloatPlane (Vector& normal, vec_t dist)
{
        int                i;
        plane_t        *p;
        int                hash, h;

        SnapPlane(normal, dist); // 如果 法线接近轴直接==1, 如果距离接近INT == int(dist)
        hash = (int)fabs(dist) / 8;
        hash &= (PLANE_HASHES-1); // PLANE_HASHES 1024  取 hash 的 1024 之内的余数

        // search the border bins as well
        for (i=-1 ; i<=1 ; i++) // 查找看有没有相同的 。 他用 dist/8 做索引
        { // 查看这个DIST  左右 的值
                h = (hash+i)&(PLANE_HASHES-1); // 得到他 左右的数据。。。
                for (p = planehash[h] ; p ; p=p->hash_chain)
                {
                        if (PlaneEqual (p, normal, dist, RENDER_NORMAL_EPSILON, RENDER_DIST_EPSILON)) // 判断是否有和他相等的 平面。。
                                return p-mapplanes; // p的地址 - 数组的基地址
                }
        }

        return CreateNewFloatPlane (normal, dist); // 创建了一个和他 对面 的  平面, 然后都加入HASH CHAIN
}

11

主题

162

帖子

189

积分

注册会员

Rank: 2

积分
189
QQ
发表于 2005-7-28 13:40:00 | 显示全部楼层

Re:为什么随处可见hl2源代码讨论却不见quake2源代码讨论?

HL2 用的是 Quake 1, 而不是 Quake 3.
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-26 14:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表