X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=clvm_cmds.c;h=cae5257c728634327455d48ca80d2aa532ab0c22;hb=d5553d6a6b3fa71b8870e99d250a694173910245;hp=1b51522907ddb200a42063d1f9938f2dfdca0ebf;hpb=29bfb8ad7c9143d1cc32adcf1457f0dc7321742e;p=xonotic%2Fdarkplaces.git diff --git a/clvm_cmds.c b/clvm_cmds.c index 1b515229..cae5257c 100644 --- a/clvm_cmds.c +++ b/clvm_cmds.c @@ -29,7 +29,6 @@ void Sbar_SortFrags (void); void CL_FindNonSolidLocation(const vec3_t in, vec3_t out, vec_t radius); void CSQC_RelinkAllEntities (int drawmask); void CSQC_RelinkCSQCEntities (void); -const char *Key_GetBind (int key); // #1 void(vector ang) makevectors static void VM_CL_makevectors (void) @@ -888,22 +887,28 @@ void VM_CL_R_SetView (void) case VF_MIN: r_refdef.view.x = (int)(f[0]); r_refdef.view.y = (int)(f[1]); + DrawQ_RecalcView(); break; case VF_MIN_X: r_refdef.view.x = (int)(k); + DrawQ_RecalcView(); break; case VF_MIN_Y: r_refdef.view.y = (int)(k); + DrawQ_RecalcView(); break; case VF_SIZE: r_refdef.view.width = (int)(f[0]); r_refdef.view.height = (int)(f[1]); + DrawQ_RecalcView(); break; case VF_SIZE_X: r_refdef.view.width = (int)(k); + DrawQ_RecalcView(); break; case VF_SIZE_Y: r_refdef.view.height = (int)(k); + DrawQ_RecalcView(); break; case VF_VIEWPORT: r_refdef.view.x = (int)(f[0]); @@ -911,6 +916,7 @@ void VM_CL_R_SetView (void) f = PRVM_G_VECTOR(OFS_PARM2); r_refdef.view.width = (int)(f[0]); r_refdef.view.height = (int)(f[1]); + DrawQ_RecalcView(); break; case VF_FOV: r_refdef.view.frustum_x = tan(f[0] * M_PI / 360.0);r_refdef.view.ortho_x = f[0]; @@ -1052,12 +1058,12 @@ static void VM_CL_unproject (void) VM_SAFEPARMCOUNT(1, VM_CL_unproject); f = PRVM_G_VECTOR(OFS_PARM0); - if(v_flipped.integer) - f[0] = (2 * r_refdef.view.x + r_refdef.view.width) * (vid_conwidth.integer / (float) vid.width) - f[0]; VectorSet(temp, f[2], - (-1.0 + 2.0 * (f[0] / (vid_conwidth.integer / (float) vid.width) - r_refdef.view.x) / r_refdef.view.width) * f[2] * -r_refdef.view.frustum_x, - (-1.0 + 2.0 * (f[1] / (vid_conheight.integer / (float) vid.height) - r_refdef.view.y) / r_refdef.view.height) * f[2] * -r_refdef.view.frustum_y); + (-1.0 + 2.0 * (f[0] / vid_conwidth.integer)) * f[2] * -r_refdef.view.frustum_x, + (-1.0 + 2.0 * (f[1] / vid_conheight.integer)) * f[2] * -r_refdef.view.frustum_y); + if(v_flipped.integer) + temp[1] = -temp[1]; Matrix4x4_Transform(&r_refdef.view.matrix, temp, PRVM_G_VECTOR(OFS_RETURN)); } @@ -1075,9 +1081,12 @@ static void VM_CL_project (void) if(v_flipped.integer) v[1] = -v[1]; VectorSet(PRVM_G_VECTOR(OFS_RETURN), - (vid_conwidth.integer / (float) vid.width) * (r_refdef.view.x + r_refdef.view.width*0.5*(1.0+v[1]/v[0]/-r_refdef.view.frustum_x)), - (vid_conheight.integer / (float) vid.height) * (r_refdef.view.y + r_refdef.view.height*0.5*(1.0+v[2]/v[0]/-r_refdef.view.frustum_y)), + vid_conwidth.integer * (0.5*(1.0+v[1]/v[0]/-r_refdef.view.frustum_x)), + vid_conheight.integer * (0.5*(1.0+v[2]/v[0]/-r_refdef.view.frustum_y)), v[0]); + // explanation: + // after transforming, relative position to viewport (0..1) = 0.5 * (1 + v[2]/v[0]/-frustum_{x \or y}) + // as 2D drawing honors the viewport too, to get the same pixel, we simply multiply this by conwidth/height } //#330 float(float stnum) getstatf (EXT_CSQC) @@ -1299,13 +1308,6 @@ static void VM_CL_setpause(void) cl.csqc_paused = false; } -//#342 string(float keynum) getkeybind (EXT_CSQC) -static void VM_CL_getkeybind (void) -{ - VM_SAFEPARMCOUNT(1, VM_CL_getkeybind); - PRVM_G_INT(OFS_RETURN) = PRVM_SetTempString(Key_GetBind((int)PRVM_G_FLOAT(OFS_PARM0))); -} - //#343 void(float usecursor) setcursormode (EXT_CSQC) static void VM_CL_setcursormode (void) { @@ -1548,7 +1550,7 @@ static void VM_CL_ReadPicture (void) // use the attached jpeg as texture buf = (unsigned char *) Mem_Alloc(tempmempool, size); MSG_ReadBytes(size, buf); - data = JPEG_LoadImage_BGRA(buf, size); + data = JPEG_LoadImage_BGRA(buf, size, NULL); Mem_Free(buf); Draw_NewPic(name, image_width, image_height, false, data); Mem_Free(data); @@ -2962,6 +2964,7 @@ typedef struct vmpolygons_triangle_s { rtexture_t *texture; int drawflag; + qboolean hasalpha; unsigned short elements[3]; }vmpolygons_triangle_t; @@ -2989,6 +2992,7 @@ typedef struct vmpolygons_s float begin_vertex[VMPOLYGONS_MAXPOINTS][3]; float begin_color[VMPOLYGONS_MAXPOINTS][4]; float begin_texcoord[VMPOLYGONS_MAXPOINTS][2]; + qboolean begin_texture_hasalpha; } vmpolygons_t; // FIXME: make VM_CL_R_Polygon functions use Debug_Polygon functions? @@ -3071,27 +3075,14 @@ static void VM_DrawPolygonCallback (const entity_render_t *ent, const rtlight_t R_Mesh_ResetTextureState(); R_EntityMatrix(&identitymatrix); GL_CullFace(GL_NONE); - R_Mesh_VertexPointer(polys->data_vertex3f, 0, 0); - R_Mesh_ColorPointer(polys->data_color4f, 0, 0); - R_Mesh_TexCoordPointer(0, 2, polys->data_texcoord2f, 0, 0); + R_Mesh_PrepareVertices_Generic_Arrays(polys->num_vertices, polys->data_vertex3f, polys->data_color4f, polys->data_texcoord2f); for (surfacelistindex = 0;surfacelistindex < numsurfaces;) { int numtriangles = 0; rtexture_t *tex = polys->data_triangles[surfacelist[surfacelistindex]].texture; int drawflag = polys->data_triangles[surfacelist[surfacelistindex]].drawflag; - // this can't call _DrawQ_ProcessDrawFlag, but should be in sync with it - // FIXME factor this out - if(drawflag == DRAWFLAG_ADDITIVE) - GL_BlendFunc(GL_SRC_ALPHA, GL_ONE); - else if(drawflag == DRAWFLAG_MODULATE) - GL_BlendFunc(GL_DST_COLOR, GL_ZERO); - else if(drawflag == DRAWFLAG_2XMODULATE) - GL_BlendFunc(GL_DST_COLOR,GL_SRC_COLOR); - else if(drawflag == DRAWFLAG_SCREEN) - GL_BlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ONE); - else - GL_BlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + DrawQ_ProcessDrawFlag(drawflag, polys->data_triangles[surfacelist[surfacelistindex]].hasalpha); R_SetupShader_Generic(tex, NULL, GL_MODULATE, 1); numtriangles = 0; for (;surfacelistindex < numsurfaces;surfacelistindex++) @@ -3101,12 +3092,21 @@ static void VM_DrawPolygonCallback (const entity_render_t *ent, const rtlight_t VectorCopy(polys->data_triangles[surfacelist[surfacelistindex]].elements, polys->data_sortedelement3s + 3*numtriangles); numtriangles++; } - R_Mesh_Draw(0, polys->num_vertices, 0, numtriangles, NULL, polys->data_sortedelement3s, 0, 0); + R_Mesh_Draw(0, polys->num_vertices, 0, numtriangles, NULL, NULL, 0, polys->data_sortedelement3s, NULL, 0); } } void VMPolygons_Store(vmpolygons_t *polys) { + qboolean hasalpha; + int i; + + // detect if we have alpha + hasalpha = polys->begin_texture_hasalpha; + for(i = 0; !hasalpha && (i < polys->begin_vertices); ++i) + if(polys->begin_color[i][3] < 1) + hasalpha = true; + if (r_refdef.draw2dstage) { // draw the polygon as 2D immediately @@ -3119,7 +3119,7 @@ void VMPolygons_Store(vmpolygons_t *polys) mesh.data_vertex3f = polys->begin_vertex[0]; mesh.data_color4f = polys->begin_color[0]; mesh.data_texcoord2f = polys->begin_texcoord[0]; - DrawQ_Mesh(&mesh, polys->begin_drawflag); + DrawQ_Mesh(&mesh, polys->begin_drawflag, hasalpha); } else { @@ -3146,6 +3146,7 @@ void VMPolygons_Store(vmpolygons_t *polys) polys->data_triangles[polys->num_triangles].elements[0] = polys->num_vertices; polys->data_triangles[polys->num_triangles].elements[1] = polys->num_vertices + i+1; polys->data_triangles[polys->num_triangles].elements[2] = polys->num_vertices + i+2; + polys->data_triangles[polys->num_triangles].hasalpha = hasalpha; polys->num_triangles++; } polys->num_vertices += polys->begin_vertices; @@ -3229,6 +3230,7 @@ void VM_CL_R_PolygonBegin (void) } polys->begin_texture = (sf && sf->base) ? sf->base : r_texture_white; + polys->begin_texture_hasalpha = (sf && sf->base) ? sf->hasalpha : false; polys->begin_drawflag = (int)PRVM_G_FLOAT(OFS_PARM1) & DRAWFLAG_MASK; polys->begin_vertices = 0; polys->begin_active = true; @@ -3294,7 +3296,7 @@ void Debug_PolygonBegin(const char *picname, int drawflag) Con_Printf("Debug_PolygonBegin: called twice without Debug_PolygonEnd after first\n"); return; } - debugPolys.begin_texture = picname[0] ? Draw_CachePic (picname)->tex : r_texture_white; + debugPolys.begin_texture = picname[0] ? Draw_CachePic_Flags (picname, CACHEPICFLAG_NOTPERSISTENT)->tex : r_texture_white; debugPolys.begin_drawflag = drawflag; debugPolys.begin_vertices = 0; debugPolys.begin_active = true; @@ -3788,7 +3790,7 @@ static void VM_CL_skel_find_bone(void) PRVM_G_FLOAT(OFS_RETURN) = 0; if (skeletonindex < 0 || skeletonindex >= MAX_EDICTS || !(skeleton = prog->skeletons[skeletonindex])) return; - PRVM_G_FLOAT(OFS_RETURN) = Mod_Alias_GetTagIndexForName(skeleton->model, 0, tagname) + 1; + PRVM_G_FLOAT(OFS_RETURN) = Mod_Alias_GetTagIndexForName(skeleton->model, 0, tagname); } // #269 vector(float skel, float bonenum) skel_get_bonerel = #269; // (FTE_CSQC_SKELETONOBJECTS) get matrix of bone in skeleton relative to its parent - sets v_forward, v_right, v_up, returns origin (relative to parent bone) @@ -4335,7 +4337,7 @@ VM_centerprint, // #338 void(string s, ...) centerprint (EXT_CSQC) VM_print, // #339 void(string s, ...) print (EXT_CSQC, DP_SV_PRINT) VM_keynumtostring, // #340 string(float keynum) keynumtostring (EXT_CSQC) VM_stringtokeynum, // #341 float(string keyname) stringtokeynum (EXT_CSQC) -VM_CL_getkeybind, // #342 string(float keynum) getkeybind (EXT_CSQC) +VM_getkeybind, // #342 string(float keynum[, float bindmap]) getkeybind (EXT_CSQC) VM_CL_setcursormode, // #343 void(float usecursor) setcursormode (EXT_CSQC) VM_CL_getmousepos, // #344 vector() getmousepos (EXT_CSQC) VM_CL_getinputstate, // #345 float(float framenum) getinputstate (EXT_CSQC) @@ -4515,7 +4517,7 @@ VM_buf_cvarlist, // #517 void(float buf, string prefix, string antiprefix) VM_cvar_description, // #518 float(string name) cvar_description = #518; (DP_QC_CVAR_DESCRIPTION) VM_gettime, // #519 float(float timer) gettime = #519; (DP_QC_GETTIME) VM_keynumtostring, // #520 string keynumtostring(float keynum) -VM_findkeysforcommand, // #521 string findkeysforcommand(string command) +VM_findkeysforcommand, // #521 string findkeysforcommand(string command[, float bindmap]) VM_CL_InitParticleSpawner, // #522 void(float max_themes) initparticlespawner (DP_CSQC_SPAWNPARTICLE) VM_CL_ResetParticle, // #523 void() resetparticle (DP_CSQC_SPAWNPARTICLE) VM_CL_ParticleTheme, // #524 void(float theme) particletheme (DP_CSQC_SPAWNPARTICLE) @@ -4604,7 +4606,7 @@ VM_writetofile, // #606 VM_isfunction, // #607 NULL, // #608 NULL, // #609 -NULL, // #610 +VM_findkeysforcommand, // #610 string findkeysforcommand(string command[, float bindmap]) NULL, // #611 NULL, // #612 VM_parseentitydata, // #613 @@ -4624,7 +4626,10 @@ NULL, // #626 VM_sprintf, // #627 string sprintf(string format, ...) VM_getsurfacenumtriangles, // #628 float(entity e, float s) getsurfacenumpoints (DP_QC_GETSURFACETRIANGLE) VM_getsurfacetriangle, // #629 vector(entity e, float s, float n) getsurfacepoint (DP_QC_GETSURFACETRIANGLE) -NULL, // #630 +VM_setkeybind, // #630 float(float key, string bind[, float bindmap]) setkeybind +VM_getbindmaps, // #631 vector(void) getbindmap +VM_setbindmaps, // #632 float(vector bm) setbindmap +NULL, // #633 }; const int vm_cl_numbuiltins = sizeof(vm_cl_builtins) / sizeof(prvm_builtin_t);