summaryrefslogtreecommitdiffstats
path: root/applications/rview/cube_render_line.c
diff options
context:
space:
mode:
Diffstat (limited to 'applications/rview/cube_render_line.c')
-rw-r--r--applications/rview/cube_render_line.c172
1 files changed, 172 insertions, 0 deletions
diff --git a/applications/rview/cube_render_line.c b/applications/rview/cube_render_line.c
new file mode 100644
index 0000000..6c40e6d
--- /dev/null
+++ b/applications/rview/cube_render_line.c
@@ -0,0 +1,172 @@
+/*
+* This file is part of rasdaman community.
+*
+* Rasdaman community is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+*
+* Rasdaman community is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with rasdaman community. If not, see <http://www.gnu.org/licenses/>.
+*
+* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann /
+rasdaman GmbH.
+*
+* For more information please see <http://www.rasdaman.org>
+* or contact Peter Baumann via <baumann@rasdaman.com>.
+/
+
+/**
+ * COMMENTS:
+ *
+ * This is called from within cube_render.c to render a line. It has been
+ * moved out here to be able to easily optimise the whole system for various
+ * settings and simplify the use of different texture base sizes.
+ */
+
+
+
+ i = (8 - (ge->midx + renderDesc->left_p)) & 7;
+ if ((i > width) || (width < 8)) i = width;
+ while (i > 0)
+ {
+ width -= i;
+ nom -= ((real_t)i) * left_g->z; den -= ((real_t)i) * deltaLR_g.z; h = 0.0;
+ if (den != 0)
+ {
+ h = -nom/den;
+ if (h < 0.0) h = 0.0;
+ if (h > 1.0) h = 1.0;
+ }
+#ifndef TEXEL_CONST_X
+ dtx = ((int32)(left_t->x + h * deltaLR_t.x) - tx) / i;
+#endif
+#ifndef TEXEL_CONST_Y
+ dty = ((int32)(left_t->y + h * deltaLR_t.y) - ty) / i;
+#endif
+#ifndef TEXEL_CONST_Z
+ dtz = ((int32)(left_t->z + h * deltaLR_t.z) - tz) / i;
+#endif
+ while (i > 0)
+ {
+#if (CUBE_RENDER_DEBUG > 2)
+ printf("\t(%d, %d, %d: %d)\n", (tx>>FIXPOINT_PREC), (ty>>FIXPOINT_PREC), (tz>>FIXPOINT_PREC), ((tx>>FIXPOINT_PREC)*dimy + (ty>>FIXPOINT_PREC))*dimz + (tz>>FIXPOINT_PREC)); fflush(stdout);
+#endif
+#if (CUBE_RENDER_DEBUG > 0)
+ if (((tx>>FIXPOINT_PREC)*dimy + (ty>>FIXPOINT_PREC))*dimz + (tz>>FIXPOINT_PREC) > high_tide_src)
+ {
+ printf("Texture buffer overflow (%d, %d, %d) | (%f, %f, %f)!\n", (tx>>FIXPOINT_PREC), (ty>>FIXPOINT_PREC), (tz>>FIXPOINT_PREC), left_t->x + deltaLR_t.x, left_t->y + deltaLR_t.y, left_t->z + deltaLR_t.z); fflush(stdout); break;
+ }
+ if (dest.c > high_tide_dest)
+ {
+ printf("Screen buffer overflow (%d)!\n", (int)(high_tide_dest - (uint8*)(ge->dest)));
+ fflush(stdout); break;
+ }
+#endif
+ TEXEL_ASSIGN;
+ i--;
+ }
+ if (width < 8) i = width;
+ }
+ if (width <= 0) continue;
+ /* The above loop guarantees that at this point width >= 8 */
+ dn = (real_t)(-8.0 * left_g->z); dd = (real_t)(-8.0 * deltaLR_g.z);
+ nom += dn; den += dd; h = 0.0;
+ if (den != 0)
+ {
+ h = -nom/den;
+ if (h < 0.0) h = 0.0;
+ if (h > 1.0) h = 1.0;
+ }
+#ifndef TEXEL_CONST_X
+ dtx = ((int32)(left_t->x + h * deltaLR_t.x) - tx) / 8;
+#endif
+#ifndef TEXEL_CONST_Y
+ dty = ((int32)(left_t->y + h * deltaLR_t.y) - ty) / 8;
+#endif
+#ifndef TEXEL_CONST_Z
+ dtz = ((int32)(left_t->z + h * deltaLR_t.z) - tz) / 8;
+#endif
+
+ /* Help the compiler do efficient Int/FP parallelism. */
+ while (width >= 16)
+ {
+ width -= 8; h = 0.0;
+ nom += dn;
+ TEXEL_ACCU_0(accu_t);
+ den += dd;
+ TEXEL_ACCU_1(accu_t);
+ if (den != 0) h = -nom/den;
+ TEXEL_ACCU_2(accu_t);
+ if (h < 0.0) h = 0.0;
+ TEXEL_ACCU_3(accu_t);
+ if (h > 1.0) h = 1.0;
+ TEXEL_ACCU_0(accu_t);
+#ifndef TEXEL_CONST_X
+ ntx = (int32)(left_t->x + h * deltaLR_t.x);
+#endif
+ TEXEL_ACCU_1(accu_t);
+#ifndef TEXEL_CONST_Y
+ nty = (int32)(left_t->y + h * deltaLR_t.y);
+#endif
+ TEXEL_ACCU_2(accu_t);
+#ifndef TEXEL_CONST_Z
+ ntz = (int32)(left_t->z + h * deltaLR_t.z);
+#endif
+ TEXEL_ACCU_3(accu_t);
+#ifndef TEXEL_CONST_X
+ dtx = (ntx - tx) / 8;
+#endif
+#ifndef TEXEL_CONST_Y
+ dty = (nty - ty) / 8;
+#endif
+#ifndef TEXEL_CONST_Z
+ dtz = (ntz - tz) / 8;
+#endif
+ }
+ /* 8 <= width <= 15 here! */
+ width -= 8; h = 0.0;
+ nom -= ((real_t)width) * left_g->z;
+ TEXEL_ACCU_0(accu_t);
+ den -= ((real_t)width) * deltaLR_g.z;
+ TEXEL_ACCU_1(accu_t);
+ if (den != 0) h = -nom/den;
+ TEXEL_ACCU_2(accu_t);
+ if (h < 0.0) h = 0.0;
+ TEXEL_ACCU_3(accu_t);
+ if (h > 1.0) h = 1.0;
+ TEXEL_ACCU_0(accu_t);
+#ifndef TEXEL_CONST_X
+ ntx = (int32)(left_t->x + h * deltaLR_t.x);
+#endif
+ TEXEL_ACCU_1(accu_t);
+#ifndef TEXEL_CONST_Y
+ nty = (int32)(left_t->y + h * deltaLR_t.y);
+#endif
+ TEXEL_ACCU_2(accu_t);
+#ifndef TEXEL_CONST_Z
+ ntz = (int32)(left_t->z + h * deltaLR_t.z);
+#endif
+ TEXEL_ACCU_3(accu_t);
+ if (width > 0)
+ {
+#ifndef TEXEL_CONST_X
+ dtx = (ntx - tx) / width;
+#endif
+#ifndef TEXEL_CONST_Y
+ dty = (nty - ty) / width;
+#endif
+#ifndef TEXEL_CONST_Z
+ dtz = (ntz - tz) / width;
+#endif
+ while (width > 0)
+ {
+ TEXEL_ASSIGN;
+ width--;
+ }
+ }