From 71ac9a58f1990f1fec84dd28fbd2cf4ba75ea6d5 Mon Sep 17 00:00:00 2001 From: div0 Date: Sun, 28 Feb 2010 19:46:21 +0000 Subject: [PATCH] camera support: func_warpzone_camera -> target_position (this uses the shader common/camera) git-svn-id: svn://svn.icculus.org/nexuiz/trunk@8728 f962a42d-fe04-0410-a3ab-8c8b0445ebaa --- data/qcsrc/client/Main.qc | 1 + data/qcsrc/common/constants.qh | 1 + data/qcsrc/warpzonelib/client.qc | 38 +++++++++++++ data/qcsrc/warpzonelib/client.qh | 1 + data/qcsrc/warpzonelib/server.qc | 88 +++++++++++++++++++++++++++++- data/qcsrc/warpzonelib/server.qh | 1 + data/scripts/common.shader | 10 +++- data/textures/common/camera.tga | Bin 0 -> 46784 bytes data/textures/common/warpzone.tga | Bin 0 -> 6176 bytes 9 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 data/textures/common/camera.tga create mode 100644 data/textures/common/warpzone.tga diff --git a/data/qcsrc/client/Main.qc b/data/qcsrc/client/Main.qc index 498f98ec7..985bcc7ea 100644 --- a/data/qcsrc/client/Main.qc +++ b/data/qcsrc/client/Main.qc @@ -901,6 +901,7 @@ void(float bIsNewEntity) CSQC_Ent_Update = case ENT_CLIENT_MODELEFFECT: Ent_ModelEffect(bIsNewEntity); break; case ENT_CLIENT_TUBANOTE: Ent_TubaNote(bIsNewEntity); break; case ENT_CLIENT_WARPZONE: WarpZone_Read(bIsNewEntity); break; + case ENT_CLIENT_WARPZONE_CAMERA: WarpZone_Camera_Read(bIsNewEntity); break; default: error(strcat("unknown entity type in CSQC_Ent_Update: ", ftos(self.enttype), "\n")); break; diff --git a/data/qcsrc/common/constants.qh b/data/qcsrc/common/constants.qh index c5c9b92b8..f954ed953 100644 --- a/data/qcsrc/common/constants.qh +++ b/data/qcsrc/common/constants.qh @@ -97,6 +97,7 @@ const float ENT_CLIENT_SPIDERBOT = 21; const float ENT_CLIENT_MODELEFFECT = 22; const float ENT_CLIENT_TUBANOTE = 23; const float ENT_CLIENT_WARPZONE = 24; +const float ENT_CLIENT_WARPZONE_CAMERA = 25; const float ENT_CLIENT_TURRET = 40; diff --git a/data/qcsrc/warpzonelib/client.qc b/data/qcsrc/warpzonelib/client.qc index d4144d699..075d4bb61 100644 --- a/data/qcsrc/warpzonelib/client.qc +++ b/data/qcsrc/warpzonelib/client.qc @@ -42,6 +42,44 @@ void WarpZone_Read(float isnew) setsize(self, self.mins, self.maxs); } +vector WarpZone_Camera_camera_transform(vector org, vector ang) +{ + // a fixed camera view + trace_endpos = self.oldorigin; + makevectors(self.angles); + return self.oldorigin; +} + +void WarpZone_Camera_Read(float isnew) +{ + self.classname = "func_warpzone_camera"; + self.origin_x = ReadCoord(); + self.origin_y = ReadCoord(); + self.origin_z = ReadCoord(); + self.modelindex = ReadShort(); + self.mins_x = ReadCoord(); + self.mins_y = ReadCoord(); + self.mins_z = ReadCoord(); + self.maxs_x = ReadCoord(); + self.maxs_y = ReadCoord(); + self.maxs_z = ReadCoord(); + self.oldorigin_x = ReadCoord(); + self.oldorigin_y = ReadCoord(); + self.oldorigin_z = ReadCoord(); + self.avelocity_x = ReadCoord(); + self.avelocity_y = ReadCoord(); + self.avelocity_z = ReadCoord(); + + // engine currently wants this + self.drawmask = MASK_NORMAL; + self.camera_transform = WarpZone_Camera_camera_transform; + + // link me + //setmodel(self, self.model); + setorigin(self, self.origin); + setsize(self, self.mins, self.maxs); +} + float warpzone_fixingview; float warpzone_fixingview_drawexteriormodel; //float warpzone_fixingview_sidespeed; diff --git a/data/qcsrc/warpzonelib/client.qh b/data/qcsrc/warpzonelib/client.qh index 2f64e3524..5ab212a33 100644 --- a/data/qcsrc/warpzonelib/client.qh +++ b/data/qcsrc/warpzonelib/client.qh @@ -1,4 +1,5 @@ void WarpZone_Read(float bIsNewEntity); +void WarpZone_Camera_Read(float bIsNewEntity); vector warpzone_fixview_origin; vector warpzone_fixview_angles; diff --git a/data/qcsrc/warpzonelib/server.qc b/data/qcsrc/warpzonelib/server.qc index 036a34f4b..a92fb1b4c 100644 --- a/data/qcsrc/warpzonelib/server.qc +++ b/data/qcsrc/warpzonelib/server.qc @@ -142,6 +142,7 @@ float WarpZone_Send(entity to, float sendflags) WriteCoord(MSG_ENTITY, self.maxs_x); WriteCoord(MSG_ENTITY, self.maxs_y); WriteCoord(MSG_ENTITY, self.maxs_z); + WriteByte(MSG_ENTITY, bound(1, self.scale * 16, 255)); // we need THESE to calculate the proper transform WriteCoord(MSG_ENTITY, self.warpzone_origin_x); @@ -160,6 +161,35 @@ float WarpZone_Send(entity to, float sendflags) return TRUE; } +float WarpZone_Camera_Send(entity to, float sendflags) +{ + WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE_CAMERA); + + // we need THESE to render the warpzone (and cull properly)... + WriteCoord(MSG_ENTITY, self.origin_x); + WriteCoord(MSG_ENTITY, self.origin_y); + WriteCoord(MSG_ENTITY, self.origin_z); + + WriteShort(MSG_ENTITY, self.modelindex); + WriteCoord(MSG_ENTITY, self.mins_x); + WriteCoord(MSG_ENTITY, self.mins_y); + WriteCoord(MSG_ENTITY, self.mins_z); + WriteCoord(MSG_ENTITY, self.maxs_x); + WriteCoord(MSG_ENTITY, self.maxs_y); + WriteCoord(MSG_ENTITY, self.maxs_z); + WriteByte(MSG_ENTITY, bound(1, self.scale * 16, 255)); + + // we need THESE to calculate the proper transform + WriteCoord(MSG_ENTITY, self.enemy.origin_x); + WriteCoord(MSG_ENTITY, self.enemy.origin_y); + WriteCoord(MSG_ENTITY, self.enemy.origin_z); + WriteCoord(MSG_ENTITY, self.enemy.angles_x); + WriteCoord(MSG_ENTITY, self.enemy.angles_y); + WriteCoord(MSG_ENTITY, self.enemy.angles_z); + + return TRUE; +} + float WarpZone_CheckProjectileImpact() { // if self hit a warpzone, abort @@ -272,6 +302,23 @@ void WarpZonePosition_InitStep_FindTarget() self.enemy.aiment = self; } +void WarpZoneCamera_InitStep_FindTarget() +{ + entity e; + + if(self.target == "") + { + error("Camera with no target"); + return; + } + self.enemy = find(world, targetname, self.target); + if(self.enemy == world) + { + error("Camera with nonexisting target"); + return; + } +} + void WarpZone_InitStep_UpdateTransform() { vector org, ang, norm, point; @@ -370,6 +417,7 @@ void WarpZone_InitStep_FinalizeTransform() float warpzone_initialized; entity warpzone_first; entity warpzone_position_first; +entity warpzone_camera_first; .entity warpzone_next; void spawnfunc_trigger_warpzone_position(void) { @@ -390,13 +438,49 @@ void spawnfunc_trigger_warpzone(void) string m; m = self.model; WarpZoneLib_ExactTrigger_Init(); - setmodel(self, m); + if(!self.scale) + self.scale = self.modelscale; + if(m != "") + { + precache_model(m); + setmodel(self, m); // no precision needed + } + setorigin(self, self.origin); + if(self.scale) + setsize(self, self.mins * self.scale, self.maxs * self.scale); + else + setsize(self, self.mins, self.maxs); + if(!self.scale) + self.scale = self.modelscale; self.SendEntity = WarpZone_Send; self.SendFlags = 0xFFFFFF; self.effects |= EF_NODEPTHTEST; self.warpzone_next = warpzone_first; warpzone_first = self; } +void spawnfunc_func_camera(void) +{ + if(!self.scale) + self.scale = self.modelscale; + if(self.model != "") + { + precache_model(self.model); + setmodel(self, self.model); // no precision needed + } + setorigin(self, self.origin); + if(self.scale) + setsize(self, self.mins * self.scale, self.maxs * self.scale); + else + setsize(self, self.mins, self.maxs); + if(!self.solid) + self.solid = SOLID_BSP; + else if(self.solid < 0) + self.solid = SOLID_NOT; + self.SendEntity = WarpZone_Camera_Send; + self.SendFlags = 0xFFFFFF; + self.warpzone_next = warpzone_camera_first; + warpzone_camera_first = self; +} void WarpZone_StartFrame() { entity e; @@ -408,6 +492,8 @@ void WarpZone_StartFrame() WarpZone_InitStep_FindTarget(); for(self = warpzone_position_first; self; self = self.warpzone_next) WarpZonePosition_InitStep_FindTarget(); + for(self = warpzone_camera_first; self; self = self.warpzone_next) + WarpZoneCamera_InitStep_FindTarget(); for(self = warpzone_first; self; self = self.warpzone_next) WarpZone_InitStep_UpdateTransform(); for(self = warpzone_first; self; self = self.warpzone_next) diff --git a/data/qcsrc/warpzonelib/server.qh b/data/qcsrc/warpzonelib/server.qh index 87a0bb340..392e6f39d 100644 --- a/data/qcsrc/warpzonelib/server.qh +++ b/data/qcsrc/warpzonelib/server.qh @@ -7,3 +7,4 @@ float WarpZone_Projectile_Touch_ImpactFilter_Callback(); // server must also define a float called ENT_CLIENT_WARPZONE for the initial byte of WarpZone entities const float ENT_CLIENT_WARPZONE; +const float ENT_CLIENT_WARPZONE_CAMERA; diff --git a/data/scripts/common.shader b/data/scripts/common.shader index 11d6ea0b6..9ed43fb66 100644 --- a/data/scripts/common.shader +++ b/data/scripts/common.shader @@ -348,7 +348,6 @@ textures/common/lightgrid surfaceparm lightgrid } - textures/common/warpzone { surfaceparm nolightmap @@ -362,3 +361,12 @@ textures/common/warpzone dp_camera dp_refract 1 1 1 1 // makes the camera render like a refraction } + +textures/common/camera +{ + { + map textures/common/mirror1.tga // fully transparent + blendfunc blend + } + dp_camera +} diff --git a/data/textures/common/camera.tga b/data/textures/common/camera.tga new file mode 100644 index 0000000000000000000000000000000000000000..65773b5d9097f51ae46b60adbf4fbfe9b2d6283e GIT binary patch literal 46784 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⋘iJ;* zN~#c8_WF#zJb@_70iM8|Z{$Ge1cD-@JXB9Wn=&$*f)gMQQcF%I6dx22xW$ok*BACJ zQ8ycLEdYTSjs~spM}t^}FdBruq&jlC`=LmPDCTW>0Ja-9+z|*is$-9x%%+GImcFoT zRCiDMsUymve@8^!yfgH$es%#dtT4P`qwt_j9;UO#>C5)=sI*w3!DE(0VGO4@Pns~` z(;zW~^f60XqH%9b?}HO~-OmBSfK?&Dz)Mua!_*M+Jvq=&GlYx=1vwCSastCt!<@P$ z4GK-1_xSK77?0y;M=NCNpQfm2fw*8#S#A<%MEmM=obETmTm*-+=Id7HP*Xrb7{giq zMr=2p=y<3OJOhS_!i^2;$N>h_4}umZ3^*kaJSmN)fU`v1c;Z&Vz)1P*rE5J~GKRyJ z0`jW2_65L%LY;Xqq2p8DoYq?p04eaTr~wKCuY_PgXpq_wBYhkW9RTeJDMF9}GM!~b zXqtz%@G|QQ3k^m59SXRnfVdH8iYX0+DJ>r!t#liav<7Kom;<7+jzilrvMv-lIG{na zgV-12uH(>nkUc68e09OS+KW_*`HuyL=0klc1|lk>5p8%ZP&)JB(Fkb_lZes|GE3AS zkAo>qCgeMEIDvqO+H?@Q0?=af-kjPCC-Azaz>IzY5c@$47;{WhSZ?`ehsokeew~khv}@LvaVI) z4;`R(97ZF8A!+V}6g#enjrl$VVM<|i#VYw0!903F9QX$Y%W#%_^CIs_!-r_@VoLxb zj4ereK|uk66!6D$(G-*LLkBoV8Uz2Lgaab_O$?wCj(clr#9PyPy@BgL!|IO)|Fu~m z4EC)cu%HDao&yWg;Jc<63~7;JU_re8aN`^XixT$jP^~}m*(1kug@)>MTxdKO0E}N? z1^J(1dKga312@1MTCSf+cLWQ)t`^no|ugM(~6)D^AUh{D7{cc z0673YR2qEoB9FR?AuV6LC=ay{?|A>I1k8$%2falJ;0&B2y-Qh;Dq+57jIRRZFYFY` Us?Mv(D=A)Fo1IsfwIt&I11^1YcK`qY literal 0 HcmV?d00001 diff --git a/data/textures/common/warpzone.tga b/data/textures/common/warpzone.tga new file mode 100644 index 0000000000000000000000000000000000000000..c6a70b0a127b929a81a3bded3057caaa9118d4d8 GIT binary patch literal 6176 zcmds+cWjka7{{hjx`=RNOvzTh|o9rw>%XRcG$$#7o% z+bMG4PUe})|GD4m;9Gd%m%r(_X8WX(Bi6T#-r2DHyyMmLh3|{xIYZY0Fo-mLnjviIv^gA1Tyd?Hwe(a2e1up-vlop^p{7l-W7Bx~amV_Qt z{>;1S57k`3sVA!C1up#huPHvj8uXgY%_A$GdV2+}F$5N-ZNR`9T9k7v&$g+2;*CSKi>^bL7B;v3 z!gd#<8L{Z`ZjpzsVG~6!e2vKax}90EeO%BgvQJkr2;yR}BARSDo!p@@HoUKHNyOgQ z?X*tW@A94K9hroilVm&W=ak4p*H2W7SU|%g zH4Bl!S(8S_F$d_kGkE%Z5xT6}vWOPQqaBSZB+vrRU!4&iH{qq_LJi$SPt&3?2Q@7$-{xAuiHB)d@)<28m5Y3{Cu<#^*2AKWK#kj)%3 z2rF`3U9Hw1uqa$2p>RcrGB_w)Aa%_i*xS;W*^D5(V+C_~C~Oa%I>(}TS2zamSP31T zG226?&b6Gj>-N&l;Bay7avC>UCj+5P#xMAX;e5#G=Z#g{^*2=DP;#P4`fYrt;VmS@AXVA{zJW)6`T;}-?gu?k) z)UqBOIA)Lq&vrZVAHMg%?qEFyGZXvPf%L+odrIZfV0i zhWAyK@MvTKF)N*XlT6ij`o#6|MvI2(s`i3D-AUsebLbO(J9ziSL1k6DS^9C8V~V}_ zB}%u-BNj)^XYIE&8d>Jj%-;H?F|6u|4Z(x2NJKFLqiE;98}&mPc=))DC~YvFppYlIQEZhqe$f^KYG zm+8%i!fCbPAk8Bxo_q@z4sIikxWvuVj)_|3_-l*~sfJppRg|o7AzXq%65~`~~XkYE7s4>U`=oE zfe~4cCRNYy_?bw5iX^kHeM5}%&?!o&nFdW?fGHG6ruyLwS znTv1)+zAy_7!(K&2ceTT!*Rw=20`o@^>ac_vBwZubKPn zme*hYzL#rZ4?NA>sOU7zW7g$Hp{HXWPcJ$zj-@o6Ck6l9Q7C8OgdenTxn%OR>8vLN{hSf&{|nF z3zL4X%MGc+d7H)cP|SWr4+U;nA+@s3%Jng%4rgx4M-Rp9NAytO zmW86H3Lac8YdP0JR7t%H!9_TeU(-EQvmeewfm@b`a`t0+sBp{jP|toW4<&9{t`G{M zprx?gkhw}Ih#KcRr**w0v>(n}lv|>QlJ>)SsB+8lmeRx-Y!)xVO6)=vBWk{!6uh+FU4}j(a`+ISca)*I((a1wT_!&+ pa`kaQRhRK^G${T52Tk{X0Q&as*QI|