]> de.git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - csprogs.c
make getsurface* not animate vertices if the model is not animated
[xonotic/darkplaces.git] / csprogs.c
index bb43a0e4a7680e6b35c8c41a7b068fc63d828c6c..33f2987f5b1f72cea8a45ee3d26d2f43affc787e 100644 (file)
--- a/csprogs.c
+++ b/csprogs.c
@@ -30,7 +30,7 @@ void CL_VM_PreventInformationLeaks(void)
 }
 
 //[515]: these are required funcs
-static char *cl_required_func[] =
+static const char *cl_required_func[] =
 {
        "CSQC_Init",
        "CSQC_InputEvent",
@@ -123,6 +123,10 @@ static void CSQC_SetGlobals (void)
 
                if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.view_angles)))
                        VectorCopy(cl.viewangles, val->vector);
+               if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.view_punchangle)))
+                       VectorCopy(cl.punchangle, val->vector);
+               if ((val = PRVM_GLOBALFIELDVALUE(prog->globaloffsets.view_punchvector)))
+                       VectorCopy(cl.punchvector, val->vector);
                prog->globals.client->maxclients = cl.maxclients;
        CSQC_END
 }
@@ -174,8 +178,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);
@@ -189,6 +194,11 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed, int edictnum)
                        return false;
        }
 
+       if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.userwavefunc_param0)))    entrender->userwavefunc_param[0] = val->_float;
+       if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.userwavefunc_param1)))    entrender->userwavefunc_param[1] = val->_float;
+       if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.userwavefunc_param2)))    entrender->userwavefunc_param[2] = val->_float;
+       if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.userwavefunc_param3)))    entrender->userwavefunc_param[3] = val->_float;
+
        entrender->model = model;
        entrender->skinnum = (int)ed->fields.client->skin;
        entrender->effects |= entrender->model->effects;
@@ -199,7 +209,7 @@ qboolean CSQC_AddRenderEdict(prvm_edict_t *ed, int edictnum)
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.scale)) && val->_float)           entrender->scale = scale = val->_float;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.colormod)) && VectorLength2(val->vector)) VectorCopy(val->vector, entrender->colormod);
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.glowmod)) && VectorLength2(val->vector))  VectorCopy(val->vector, entrender->glowmod);
-       if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.effects)) && val->_float) entrender->effects |= (int)val->_float;
+       if(ed->fields.client->effects)  entrender->effects |= (int)ed->fields.client->effects;
        if((val = PRVM_EDICTFIELDVALUE(ed, prog->fieldoffsets.tag_entity)) && val->edict)
        {
                int tagentity;
@@ -255,7 +265,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 +279,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 +287,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 +348,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 +366,7 @@ qboolean CL_VM_UpdateView (void)
                // Dresk : Reset Dmg Globals Here
                CL_VM_UpdateDmgGlobals(0, 0, emptyvector);
        CSQC_END
+       R_TimeReport("UpdateView");
        return true;
 }
 
@@ -735,7 +747,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);
 }
@@ -810,7 +822,7 @@ qboolean MakeDownloadPacket(const char *filename, unsigned char *data, size_t le
        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 +842,7 @@ qboolean MakeDownloadPacket(const char *filename, unsigned char *data, size_t le
        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;
@@ -973,13 +985,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);
 
@@ -1042,3 +1054,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;
+}