X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=csprogs.c;h=d417fa97ece0aae75c38c02f7f006e153c317ef0;hb=98567a812fda612bb59d0781f8cf4d31d5264355;hp=0492d10c574f80383ec32ff3d6d3a53db9cd6eb9;hpb=4e402f83fc7aa1989f298c38847661bdf6d7883d;p=xonotic%2Fdarkplaces.git diff --git a/csprogs.c b/csprogs.c index 0492d10c..d417fa97 100644 --- a/csprogs.c +++ b/csprogs.c @@ -174,8 +174,9 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed, int edictnum) return false; entrender = cl.csqcrenderentities + edictnum; r_refdef.scene.entities[r_refdef.scene.numentities++] = entrender; - entrender->entitynumber = edictnum; + entrender->entitynumber = edictnum + MAX_EDICTS; //entrender->shadertime = 0; // shadertime was set by spawn() + entrender->flags = 0; entrender->alpha = 1; entrender->scale = 1; VectorSet(entrender->colormod, 1, 1, 1); @@ -255,7 +256,6 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed, int edictnum) if(renderflags & RF_NOCULL) entrender->flags |= RENDER_NOCULL; if(renderflags & RF_DEPTHHACK) entrender->flags |= RENDER_NODEPTHTEST; if(renderflags & RF_ADDITIVE) entrender->flags |= RENDER_ADDITIVE; - } c = (int)ed->fields.client->colormap; @@ -270,7 +270,7 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed, int edictnum) // either fullbright or lit if(!r_fullbright.integer) { - if (!(entrender->effects & EF_FULLBRIGHT)) + if (!(entrender->effects & EF_FULLBRIGHT) && !(renderflags & RF_FULLBRIGHT)) entrender->flags |= RENDER_LIGHT; else if(r_equalize_entities_fullbright.integer) entrender->flags |= RENDER_LIGHT | RENDER_EQUALIZE; @@ -278,6 +278,7 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed, int edictnum) // hide player shadow during intermission or nehahra movie if (!(entrender->effects & (EF_NOSHADOW | EF_ADDITIVE | EF_NODEPTHTEST)) && (entrender->alpha >= 1) + && !(renderflags & RF_NOSHADOW) && !(entrender->flags & RENDER_VIEWMODEL) && (!(entrender->flags & RENDER_EXTERIORMODEL) || (!cl.intermission && cls.protocol != PROTOCOL_NEHAHRAMOVIE && !cl_noplayershadow.integer))) entrender->flags |= RENDER_SHADOW; @@ -338,6 +339,7 @@ qboolean CL_VM_UpdateView (void) // vec3_t oldangles; if(!cl.csqc_loaded) return false; + R_TimeReport("pre-UpdateView"); CSQC_BEGIN //VectorCopy(cl.viewangles, oldangles); prog->globals.client->time = cl.time; @@ -355,6 +357,7 @@ qboolean CL_VM_UpdateView (void) // Dresk : Reset Dmg Globals Here CL_VM_UpdateDmgGlobals(0, 0, emptyvector); CSQC_END + R_TimeReport("UpdateView"); return true; } @@ -670,7 +673,7 @@ void CSQC_ReadEntities (void) { entnum = MSG_ReadShort(); if(!entnum || msg_badread) - return; + break; realentnum = entnum & 0x7FFF; prog->globals.client->self = cl.csqc_server2csqcentitynumber[realentnum]; if(entnum & 0x8000) @@ -735,7 +738,7 @@ void CL_VM_CB_EndIncreaseEdicts(void) prvm_edict_t *ent; // link every entity except world - for (i = 1, ent = prog->edicts;i < prog->max_edicts;i++, ent++) + for (i = 1, ent = prog->edicts;i < prog->num_edicts;i++, ent++) if (!ent->priv.server->free) CL_LinkEdict(ent); } @@ -798,7 +801,7 @@ void Cmd_ClearCsqcFuncs (void); // returns true if the packet is valid, false if end of file is reached // used for dumping the CSQC download into demo files -qboolean MakeDownloadPacket(const char *filename, unsigned char *data, unsigned long len, int crc, int cnt, sizebuf_t *buf, int protocol) +qboolean MakeDownloadPacket(const char *filename, unsigned char *data, size_t len, int crc, int cnt, sizebuf_t *buf, int protocol) { int packetsize = buf->maxsize - 7; // byte short long int npackets = (len + packetsize - 1) / (packetsize); @@ -810,7 +813,7 @@ qboolean MakeDownloadPacket(const char *filename, unsigned char *data, unsigned if(cnt == 0) { MSG_WriteByte(buf, svc_stufftext); - MSG_WriteString(buf, va("\ncl_downloadbegin %lu %s\n", len, filename)); + MSG_WriteString(buf, va("\ncl_downloadbegin %lu %s\n", (unsigned long)len, filename)); return true; } else if(cnt >= 1 && cnt <= npackets) @@ -830,7 +833,7 @@ qboolean MakeDownloadPacket(const char *filename, unsigned char *data, unsigned else if(cnt == npackets + 1) { MSG_WriteByte(buf, svc_stufftext); - MSG_WriteString(buf, va("\ncl_downloadfinished %lu %d\n", len, crc)); + MSG_WriteString(buf, va("\ncl_downloadfinished %lu %d\n", (unsigned long)len, crc)); return true; } return false; @@ -867,7 +870,7 @@ void CL_VM_Init (void) } if (csprogsdata) { - csprogsdatacrc = CRC_Block(csprogsdata, csprogsdatasize); + csprogsdatacrc = CRC_Block(csprogsdata, (size_t)csprogsdatasize); if (csprogsdatacrc != requiredcrc || csprogsdatasize != requiredsize) { if (cls.demoplayback) @@ -939,14 +942,14 @@ void CL_VM_Init (void) return; } - Con_Printf("CSQC %s ^5loaded (crc=%i, size=%i)\n", csprogsfn, csprogsdatacrc, (int)csprogsdatasize); + Con_DPrintf("CSQC %s ^5loaded (crc=%i, size=%i)\n", csprogsfn, csprogsdatacrc, (int)csprogsdatasize); if(cls.demorecording) { if(cls.demo_lastcsprogssize != csprogsdatasize || cls.demo_lastcsprogscrc != csprogsdatacrc) { int i; - char buf[NET_MAXMESSAGE]; + static char buf[NET_MAXMESSAGE]; sizebuf_t sb; unsigned char *demobuf; fs_offset_t demofilesize; @@ -955,7 +958,7 @@ void CL_VM_Init (void) i = 0; CL_CutDemo(&demobuf, &demofilesize); - while(MakeDownloadPacket(csqc_progname.string, csprogsdata, csprogsdatasize, csprogsdatacrc, i++, &sb, cls.protocol)) + while(MakeDownloadPacket(csqc_progname.string, csprogsdata, (size_t)csprogsdatasize, csprogsdatacrc, i++, &sb, cls.protocol)) CL_WriteDemoMessage(&sb); CL_PasteDemo(&demobuf, &demofilesize); @@ -973,13 +976,13 @@ void CL_VM_Init (void) prog->globals.client->time = cl.time; prog->globals.client->self = 0; - prog->globals.client->mapname = cl.worldmodel ? PRVM_SetEngineString(cl.worldmodel->name) : PRVM_SetEngineString(""); + prog->globals.client->mapname = PRVM_SetEngineString(cl.worldname); prog->globals.client->player_localentnum = cl.playerentity; // set map description (use world entity 0) val = PRVM_EDICTFIELDVALUE(prog->edicts, prog->fieldoffsets.message); if(val) - val->string = PRVM_SetEngineString(cl.levelname); + val->string = PRVM_SetEngineString(cl.worldmessage); VectorCopy(cl.world.mins, prog->edicts->fields.client->mins); VectorCopy(cl.world.maxs, prog->edicts->fields.client->maxs); @@ -1010,7 +1013,7 @@ void CL_VM_ShutDown (void) PRVM_ExecuteProgram(prog->funcoffsets.CSQC_Shutdown, "QC function CSQC_Shutdown is missing"); PRVM_ResetProg(); CSQC_END - Con_Print("CSQC ^1unloaded\n"); + Con_DPrint("CSQC ^1unloaded\n"); cl.csqc_loaded = false; } @@ -1042,3 +1045,54 @@ qboolean CL_VM_GetEntitySoundOrigin(int entnum, vec3_t out) return r; } + +qboolean CL_VM_TransformView(int entnum, matrix4x4_t *viewmatrix, mplane_t *clipplane, vec3_t visorigin) +{ + qboolean ret = false; + prvm_edict_t *ed; + prvm_eval_t *val, *valforward, *valright, *valup, *valendpos; + vec3_t forward, left, up, origin, ang; + matrix4x4_t mat, matq; + + CSQC_BEGIN + ed = PRVM_EDICT_NUM(entnum); + // camera: + // camera_transform + if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.camera_transform)) && val->function) + { + ret = true; + if(viewmatrix || clipplane || visorigin) + { + valforward = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.v_forward); + valright = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.v_right); + valup = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.v_up); + valendpos = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.trace_endpos); + if(valforward && valright && valup && valendpos) + { + Matrix4x4_ToVectors(viewmatrix, forward, left, up, origin); + AnglesFromVectors(ang, forward, up, false); + prog->globals.client->time = cl.time; + prog->globals.client->self = entnum; + VectorCopy(origin, PRVM_G_VECTOR(OFS_PARM0)); + VectorCopy(ang, PRVM_G_VECTOR(OFS_PARM1)); + VectorCopy(forward, valforward->vector); + VectorScale(left, -1, valright->vector); + VectorCopy(up, valup->vector); + VectorCopy(origin, valendpos->vector); + PRVM_ExecuteProgram(val->function, "QC function e.camera_transform is missing"); + VectorCopy(PRVM_G_VECTOR(OFS_RETURN), origin); + VectorCopy(valforward->vector, forward); + VectorScale(valright->vector, -1, left); + VectorCopy(valup->vector, up); + VectorCopy(valendpos->vector, visorigin); + Matrix4x4_Invert_Full(&mat, viewmatrix); + Matrix4x4_FromVectors(viewmatrix, forward, left, up, origin); + Matrix4x4_Concat(&matq, viewmatrix, &mat); + Matrix4x4_TransformPositivePlane(&matq, clipplane->normal[0], clipplane->normal[1], clipplane->normal[2], clipplane->dist, &clipplane->normal[0]); + } + } + } + CSQC_END + + return ret; +}