diff TaskManager/Test/test_render/task/DrawSpan.cpp @ 360:716b87bce32a

add vacuum "-sg 16"
author aaa
date Fri, 17 Jul 2009 22:50:06 +0900
parents 953811245b63
children f88744ee9350
line wrap: on
line diff
--- a/TaskManager/Test/test_render/task/DrawSpan.cpp	Fri Jul 17 17:16:42 2009 +0900
+++ b/TaskManager/Test/test_render/task/DrawSpan.cpp	Fri Jul 17 22:50:06 2009 +0900
@@ -132,67 +132,32 @@
     return hash->get(addr);
 }
 
-void
+TilePtr
 DrawSpan::set_rgb(uint32 *addr, int tag)
 {
     TilePtr tile;
 
-#if 0
-    if (isAvailableTile(addr)) {
-        return;
-    }
-#endif
 
     tile = tileList->nextTile();
+    uint32 *old_addr = tile->texture_addr;
+    smanager->dma_load(tile->pixel, (uint32)addr,
+		       sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag);
     /**
      * FIFO なので、もし前のが残っていれば削除
      */
-    hash->remove(tile->texture_addr);
+
+    hash->remove(old_addr);
 
     tile->texture_addr = addr;
 
     hash->put(tile->texture_addr, tile);
-    smanager->dma_load(tile->pixel, (uint32)addr,
-                       sizeof(uint32)*TEXTURE_BLOCK_SIZE, tag);
+
+    return tile;
 }
 
-#if 0
-/**
- *
- */
-void
-DrawSpan::set_rgbs(uint32 *cur_addr, uint32 *max_addr, int wait_tag)
+uint32
+DrawSpan::get_rgb(int tx, int ty, TilePtr tile)
 {
-    uint32 curp   = (uint32)cur_addr;
-    uint32 maxp   = (uint32)max_addr;
-    uint32 startp = curp;
-    uint32 diff   = sizeof(int)*TEXTURE_BLOCK_SIZE;
-    int length = (int)maxp-(int)curp;
-
-    int cmp = (length < 0);
-
-#if 1
-    length += cmp*(-1)*length*2;
-    startp = cmp*maxp + !cmp*curp;
-#else
-    if (length < 0) {
-        length = -length;
-        startp = maxp;
-    }
-#endif
-
-    for (int i = 0; i <= length; i += diff) {
-        set_rgb((uint32*)(startp + i), wait_tag);
-    }
-}
-#endif
-
-uint32
-DrawSpan::get_rgb(int tx, int ty, uint32 *addr)
-{
-    TilePtr tile;
-
-    tile = hash->get(addr);
     return tile->pixel[(TEXTURE_SPLIT_PIXEL)*ty+tx];
 }
 
@@ -269,10 +234,10 @@
  */
 void
 DrawSpan::updateBuffer(float zpos, int rangex, int x, int y, int tex_x, int tex_y,
-                       float normal_x, float normal_y, float normal_z, uint32 *tex_addr)
+                       float normal_x, float normal_y, float normal_z, TilePtr tile)
 {
 
-    int color = get_rgb(tex_x, tex_y, tex_addr);
+    int color = get_rgb(tex_x, tex_y, tile);
     /*下位4bitを抽出*/
     int alpha = color & 0x000F;
     /*完全に透けているか判断*/
@@ -337,15 +302,16 @@
         tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
         tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
 
-        if (!isAvailableTile(tex_addr)) {
-            set_rgb(tex_addr, wait_tag);
+	TilePtr tile;
+        if (!(tile = isAvailableTile(tex_addr))) {
+            tile = set_rgb(tex_addr, wait_tag);
             smanager->dma_wait(wait_tag);
             //return startx;
         }
 
         updateBuffer(zpos, rangex, localx, localy,
                      tex_localx, tex_localy,
-                     normal_x,normal_y,normal_z,tex_addr);
+                     normal_x,normal_y,normal_z,tile);
     }
 
     return -1;
@@ -438,118 +404,21 @@
             tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
             tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
 
-            if (!isAvailableTile(tex_addr)) {
-#if 0
-                // span が必要とするであろう tile を予想紙
-                // set_rgbs で複数同時に load しようとしている図
-                // まあ上手くいかなかったんだけど。。
-                tex_x = tex1*(x_len-1-js)/(x_len-1) + tex2*js/(x_len-1);
-                if (tex_x > 1) tex_x = 1;
-                if (tex_x < 0) tex_x = 0;
-                tex_xpos = (int)((span->tex_width-1) * tex_x);
-
-                uint32 *max_addr = getTile(tex_xpos, tex_ypos,
-                                           span->tex_width, span->tex_addr);
-
-                set_rgbs(tex_addr, max_addr, wait_tag);
-                return js;
-#else
-                set_rgb(tex_addr, wait_tag);
+	    TilePtr tile;
+            if (!(tile = isAvailableTile(tex_addr))) {
+                tile = set_rgb(tex_addr, wait_tag);
                 smanager->dma_wait(wait_tag);
-#endif
             }
 
             updateBuffer(tex_z, rangex, localx, localy,
                          tex_localx, tex_localy,
-                         normal_x, normal_y, normal_z,tex_addr);
+                         normal_x, normal_y, normal_z, tile);
         }
     }
 
     return ret;
 }
 
-/**
- * 長さが 1 より大きい Span の描画 (2段階目)
- *
- * 上にあるように、drawLine2 は今は動いてないです
- * 正確には、js が startx ~ endx 範囲外にあり開始されないってところ
- *
- * @param span Span
- * @param startx 描画開始範囲
- * @param endx 描画終了範囲
- * @param js 前回(drawLine1) で span のどこまで終わっているか
- */
-void
-DrawSpan::drawLine2(SpanPtr span, int startx, int endx, int js, int wait_tag)
-{
-    int x = span->x;
-    int rangex = endx - startx + 1;
-    int x_len = span->length_x;
-
-    float normal_x = span->normal_x;
-    float normal_y = span->normal_y;
-    float normal_z = span->normal_z;
-
-
-    //int js = startx;
-    int je = (x + x_len > endx) ? endx - x : x_len;
-
-    /* span->x に対応する Texture の座標 (tex_xpos, tex_ypos) */
-    int tex_xpos, tex_ypos;
-
-    // span の始点に対応する座標 (tex1, tey1)
-    float tex1 = span->tex_x1;
-    float tey1 = span->tex_y1;
-
-    // span の終点に対応する座標 (tex2, tey2)
-    float tex2 = span->tex_x2;
-    float tey2 = span->tex_y2;
-
-    // span の始点、終点に対応する z 座標
-    float zpos1 = span->start_z;
-    float zpos2 = span->end_z;
-
-    // Tile 内での座標
-    int localx, localy = getLocalY(span->y-1);
-
-    // (tex_xpos, tex_ypos) の、Tile 内(上の図参照)での座標と
-    // そのブロックのアドレス(MainMemory)
-    int tex_localx;
-    int tex_localy;
-    uint32 *tex_addr;
-
-    float tex_x, tex_y, tex_z;
-
-    smanager->dma_wait(wait_tag);
-
-    for (int j = js; j <= je; j++) {
-        localx = getLocalX(x-1+j);
-
-        tex_z = zpos1*(x_len-1-j)/(x_len-1) + zpos2*j/(x_len-1);
-
-        tex_x = tex1*(x_len-1-j)/(x_len-1) + tex2*j/(x_len-1);
-        tex_y = tey1*(x_len-1-j)/(x_len-1) + tey2*j/(x_len-1);
-        if (tex_x > 1) tex_x = 1;
-        if (tex_x < 0) tex_x = 0;
-        if (tex_y > 1) tex_y = 1;
-        if (tex_y < 0) tex_y = 0;
-        tex_xpos = (int)((span->tex_width-1) * tex_x);
-        tex_ypos = (int)((span->tex_height-1) * tex_y);
-
-        if (tex_z < zRow[localx + (rangex*localy)]) {
-            tex_addr = getTile(tex_xpos, tex_ypos,
-                               span->tex_width, span->tex_addr);
-            tex_localx = tex_xpos % TEXTURE_SPLIT_PIXEL;
-            tex_localy = tex_ypos % TEXTURE_SPLIT_PIXEL;
-
-            updateBuffer(tex_z, rangex, localx, localy,
-                         tex_localx, tex_localy,
-                         normal_x, normal_y, normal_z,tex_addr);
-        }
-    }
-}
-
-
 int
 DrawSpan::infinity_light_calc(int color,float normal_x, float normal_y, float normal_z)
 {
@@ -599,10 +468,6 @@
         &DrawSpan::drawDot1, &DrawSpan::drawLine1
     };
 
-    void (DrawSpan::*drawFunc2[2])(SpanPtr, int, int, int, int) = {
-        &DrawSpan::drawDot2, &DrawSpan::drawLine2
-    };
-
     uint32 display   = smanager->get_param(0);
     int screen_width = smanager->get_param(1);
     int rangex_start = smanager->get_param(2);
@@ -657,10 +522,6 @@
                     span, rangex_start, rangex_end, tl_tag[tl_tag_flg1]);
             next_span = span;
 
-            (this->*drawFunc2[(resume_span->length_x != 1)])(
-                resume_span, rangex_start, rangex_end, resume_span_x,
-                tl_tag[tl_tag_flg2]);
-
             resume_span = next_span;
             resume_span_x = next_span_x;