summaryrefslogtreecommitdiff
path: root/apps/plugins/sdl/progs/quake/r_bsp.c
diff options
context:
space:
mode:
authorFranklin Wei <franklin@rockbox.org>2019-08-09 20:08:10 -0400
committerFranklin Wei <franklin@rockbox.org>2019-08-09 21:27:42 -0400
commitee70dad305a94709c877e776d723aee64d023cb5 (patch)
tree4483d1bd7b96e080dcb496e0665252e970d8cdbf /apps/plugins/sdl/progs/quake/r_bsp.c
parent3fffabf50d5597812ffa4381ac70dd6e2af6b392 (diff)
downloadrockbox-ee70dad305a94709c877e776d723aee64d023cb5.tar.gz
rockbox-ee70dad305a94709c877e776d723aee64d023cb5.zip
quake: merge some fixed-point optimizations from PocketQuake
The PocketQuake project, available below, has some nice fixed-point code: https://web.archive.org/web/20150412233306/http://quake.pocketmatrix.com/PocketQuake0062_src.zip I'd like to see most of them merged into our Quake port. This commit gives +0.9FPS on ipod6g. (A big change given that it was running at only 9.7FPS to begin with!) Change-Id: I91931bdd5c22f14fb28616de938a03b4e7d7b076
Diffstat (limited to 'apps/plugins/sdl/progs/quake/r_bsp.c')
-rw-r--r--apps/plugins/sdl/progs/quake/r_bsp.c109
1 files changed, 103 insertions, 6 deletions
diff --git a/apps/plugins/sdl/progs/quake/r_bsp.c b/apps/plugins/sdl/progs/quake/r_bsp.c
index f8c38cf601..2940b1a509 100644
--- a/apps/plugins/sdl/progs/quake/r_bsp.c
+++ b/apps/plugins/sdl/progs/quake/r_bsp.c
@@ -27,6 +27,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
27// 27//
28qboolean insubmodel; 28qboolean insubmodel;
29entity_t *currententity; 29entity_t *currententity;
30
31#ifdef USE_PQ_OPT1
32int modelorg_fxp[3];
33#endif
34
30vec3_t modelorg, base_modelorg; 35vec3_t modelorg, base_modelorg;
31 // modelorg is the viewpoint reletive to 36 // modelorg is the viewpoint reletive to
32 // the currently rendering entity 37 // the currently rendering entity
@@ -440,6 +445,10 @@ void R_DrawSubmodelPolygons (model_t *pmodel, int clipflags)
440 } 445 }
441} 446}
442 447
448#ifdef USE_PQ_OPT1
449int clipplanes_fxp[4][3];
450int clipdist_fxp[4];
451#endif
443 452
444/* 453/*
445================ 454================
@@ -449,11 +458,16 @@ R_RecursiveWorldNode
449void R_RecursiveWorldNode (mnode_t *node, int clipflags) 458void R_RecursiveWorldNode (mnode_t *node, int clipflags)
450{ 459{
451 int i, c, side, *pindex; 460 int i, c, side, *pindex;
452 vec3_t acceptpt, rejectpt;
453 mplane_t *plane; 461 mplane_t *plane;
454 msurface_t *surf, **mark; 462 msurface_t *surf, **mark;
455 mleaf_t *pleaf; 463 mleaf_t *pleaf;
456 double d, dot; 464 double dot;
465#ifdef USE_PQ_OPT1
466 int d_fxp;
467#else
468 double d;
469 vec3_t acceptpt, rejectpt;
470#endif
457 471
458 if (node->contents == CONTENTS_SOLID) 472 if (node->contents == CONTENTS_SOLID)
459 return; // solid 473 return; // solid
@@ -477,16 +491,29 @@ void R_RecursiveWorldNode (mnode_t *node, int clipflags)
477 491
478 pindex = pfrustum_indexes[i]; 492 pindex = pfrustum_indexes[i];
479 493
494#ifdef USE_PQ_OPT1
495 d_fxp=node->minmaxs[pindex[0]]*clipplanes_fxp[i][0]+node->minmaxs[pindex[1]]*clipplanes_fxp[i][1]+node->minmaxs[pindex[2]]*clipplanes_fxp[i][2];
496 d_fxp-=clipdist_fxp[i];
497
498 if (d_fxp <= 0)
499 return;
500
501 d_fxp=node->minmaxs[pindex[3]]*clipplanes_fxp[i][0]+node->minmaxs[pindex[4]]*clipplanes_fxp[i][1]+node->minmaxs[pindex[5]]*clipplanes_fxp[i][2];
502 d_fxp-=clipdist_fxp[i];
503
504 if (d_fxp >= 0)
505 clipflags &= ~(1<<i); // node is entirely on screen
506#else
480 rejectpt[0] = (float)node->minmaxs[pindex[0]]; 507 rejectpt[0] = (float)node->minmaxs[pindex[0]];
481 rejectpt[1] = (float)node->minmaxs[pindex[1]]; 508 rejectpt[1] = (float)node->minmaxs[pindex[1]];
482 rejectpt[2] = (float)node->minmaxs[pindex[2]]; 509 rejectpt[2] = (float)node->minmaxs[pindex[2]];
483 510
484 d = DotProduct (rejectpt, view_clipplanes[i].normal); 511 d = DotProduct (rejectpt, view_clipplanes[i].normal);
485 d -= view_clipplanes[i].dist; 512 d -= view_clipplanes[i].dist;
486 513
487 if (d <= 0) 514 if (d <= 0)
488 return; 515 return;
489 516
490 acceptpt[0] = (float)node->minmaxs[pindex[3+0]]; 517 acceptpt[0] = (float)node->minmaxs[pindex[3+0]];
491 acceptpt[1] = (float)node->minmaxs[pindex[3+1]]; 518 acceptpt[1] = (float)node->minmaxs[pindex[3+1]];
492 acceptpt[2] = (float)node->minmaxs[pindex[3+2]]; 519 acceptpt[2] = (float)node->minmaxs[pindex[3+2]];
@@ -496,6 +523,7 @@ void R_RecursiveWorldNode (mnode_t *node, int clipflags)
496 523
497 if (d >= 0) 524 if (d >= 0)
498 clipflags &= ~(1<<i); // node is entirely on screen 525 clipflags &= ~(1<<i); // node is entirely on screen
526#endif
499 } 527 }
500 } 528 }
501 529
@@ -656,10 +684,79 @@ void R_RenderWorld (void)
656 684
657 currententity = &cl_entities[0]; 685 currententity = &cl_entities[0];
658 VectorCopy (r_origin, modelorg); 686 VectorCopy (r_origin, modelorg);
687
688#ifdef USE_PQ_OPT1
689 modelorg_fxp[0]=(int)(r_origin[0]*524288.0);
690 modelorg_fxp[1]=(int)(r_origin[1]*524288.0);
691 modelorg_fxp[2]=(int)(r_origin[2]*524288.0);
692
693 //modelorg_fxp[0]=(int)(r_origin[0]*65536.0);
694 //modelorg_fxp[1]=(int)(r_origin[1]*65536.0);
695 //modelorg_fxp[2]=(int)(r_origin[2]*65536.0);
696
697 vright_fxp[0]=(int)(256.0/vright[0]);
698 if (!vright_fxp[0]) vright_fxp[0]=0x7fffffff;
699 vright_fxp[1]=(int)(256.0/vright[1]);
700 if (!vright_fxp[1]) vright_fxp[1]=0x7fffffff;
701 vright_fxp[2]=(int)(256.0/vright[2]);
702 if (!vright_fxp[2]) vright_fxp[2]=0x7fffffff;
703
704 vpn_fxp[0]=(int)(256.0/vpn[0]);
705 if (!vpn_fxp[0]) vpn_fxp[0]=0x7fffffff;
706 vpn_fxp[1]=(int)(256.0/vpn[1]);
707 if (!vpn_fxp[1]) vpn_fxp[1]=0x7fffffff;
708 vpn_fxp[2]=(int)(256.0/vpn[2]);
709 if (!vpn_fxp[2]) vpn_fxp[2]=0x7fffffff;
710
711 vup_fxp[0]=(int)(256.0/vup[0]);
712 if (!vup_fxp[0]) vup_fxp[0]=0x7fffffff;
713 vup_fxp[1]=(int)(256.0/vup[1]);
714 if (!vup_fxp[1]) vup_fxp[1]=0x7fffffff;
715 vup_fxp[2]=(int)(256.0/vup[2]);
716 if (!vup_fxp[2]) vup_fxp[2]=0x7fffffff;
717
718#endif
719
720
659 clmodel = currententity->model; 721 clmodel = currententity->model;
660 r_pcurrentvertbase = clmodel->vertexes; 722 r_pcurrentvertbase = clmodel->vertexes;
661 723
662 R_RecursiveWorldNode (clmodel->nodes, 15); 724#ifdef USE_PQ_OPT2
725 r_pcurrentvertbase_fxp = clmodel->vertexes_fxp;
726#endif
727#ifdef USE_PQ_OPT1
728 //Dan Fixed point conversion stuff
729 for (i=0; i<4; i++) {
730 clipplanes_fxp[i][0]=(int)(view_clipplanes[i].normal[0]*65536.0);
731 clipplanes_fxp[i][1]=(int)(view_clipplanes[i].normal[1]*65536.0);
732 clipplanes_fxp[i][2]=(int)(view_clipplanes[i].normal[2]*65536.0);
733 clipdist_fxp[i] =(int)(view_clipplanes[i].dist*65536.0);
734#ifdef USE_PQ_OPT2
735 view_clipplanes_fxp[i].leftedge=view_clipplanes[i].leftedge;
736 view_clipplanes_fxp[i].rightedge=view_clipplanes[i].rightedge;
737 if (!view_clipplanes[i].normal[0]) view_clipplanes_fxp[i].normal[0]=2<<29;
738 else view_clipplanes_fxp[i].normal[0]=(int)(4096.0f/view_clipplanes[i].normal[0]);
739 if (!view_clipplanes[i].normal[0]) view_clipplanes_fxp[i].normal[0]=2<<29;
740
741 if (!view_clipplanes[i].normal[1]) view_clipplanes_fxp[i].normal[1]=2<<29;
742 else view_clipplanes_fxp[i].normal[1]=(int)(4096.0f/view_clipplanes[i].normal[1]);
743 if (!view_clipplanes[i].normal[1]) view_clipplanes_fxp[i].normal[1]=2<<29;
744
745 if (!view_clipplanes[i].normal[2]) view_clipplanes_fxp[i].normal[2]=2<<29;
746 else view_clipplanes_fxp[i].normal[2]=(int)(4096.0f/view_clipplanes[i].normal[2]);
747 if (!view_clipplanes[i].normal[2]) view_clipplanes_fxp[i].normal[2]=2<<29;
748
749 view_clipplanes_fxp[i].dist=(int)(view_clipplanes[i].dist*128.0f);
750#endif
751#if defined(_X86_)&&defined(DEBUG)
752 LogFloat(view_clipplanes[i].normal[0], "view_clipplanes[i].normal[0]", i, -1);
753 LogFloat(view_clipplanes[i].normal[1], "view_clipplanes[i].normal[1]", i, -1);
754 LogFloat(view_clipplanes[i].normal[2], "view_clipplanes[i].normal[2]", i, -1);
755#endif
756 }
757#endif
758
759 R_RecursiveWorldNode (clmodel->nodes, 15);
663 760
664// if the driver wants the polygons back to front, play the visible ones back 761// if the driver wants the polygons back to front, play the visible ones back
665// in that order 762// in that order