changeset 1000:847650ebc244

Merge
author tkaito
date Fri, 22 Oct 2010 20:12:33 +0900
parents 451ddde9a16d (current diff) ad5232ad4952 (diff)
children 61f33945f85d
files
diffstat 8 files changed, 483 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/Renderer/Engine/SceneGraph.cc	Fri Oct 22 20:11:41 2010 +0900
+++ b/Renderer/Engine/SceneGraph.cc	Fri Oct 22 20:12:33 2010 +0900
@@ -453,12 +453,20 @@
     SDL_Surface *texture_image = IMG_Load(image_name);
     if (!texture_image) return 0;
     SDL_Surface *tmpImage
-        = SDL_CreateRGBSurface(SDL_HWSURFACE, texture_image->w,
-                               texture_image->h, 32, redMask,
-                               greenMask, blueMask, alphaMask);
+        = SDL_CreateRGBSurface(SDL_SWSURFACE, texture_image->w,
+                             texture_image->h, 32, redMask,
+                            greenMask, blueMask, alphaMask);
+
+      //= SDL_CreateRGBSurface(SDL_HWSURFACE, 0,
+      //                       0, 32, redMask,
+      //                       greenMask, blueMask, alphaMask);
+
     SDL_Surface *converted;
     converted = SDL_ConvertSurface(texture_image, tmpImage->format,
                                    SDL_HWSURFACE);
+
+    //SDL_SetAlpha(converted, 0, 0);
+
     if (converted != NULL) {
         SDL_FreeSurface(texture_image);
         texture_image = converted;
--- a/Renderer/Engine/spe/DrawSpan.cc	Fri Oct 22 20:11:41 2010 +0900
+++ b/Renderer/Engine/spe/DrawSpan.cc	Fri Oct 22 20:12:33 2010 +0900
@@ -216,14 +216,15 @@
 	     int world_x, int world_y, float world_z, SchedTask *smanager)
 {
 
-    int color = get_rgb(tex_x, tex_y, tile);
+    uint32 color = get_rgb(tex_x, tex_y, tile);
     /*下位4bitを抽出*/
 #if LITTLEENDIAN
     int alpha = color & 0x000000ff;
 #else
     int alpha = color & 0xff000000;
 #endif
-    /*完全に透けているか判断*/
+
+    //完全に透けているか判断
     int flag = (alpha != 0 && normal_z < 0);
     int *light_sysswitch = (int*)smanager->global_get(LightSysSwitch);
     //smanager->printf("sys %d\n",light_sysswitch);
@@ -235,11 +236,9 @@
     }
 
     g->zRow[localx + (rangex*localy)] = zpos*flag + g->zRow[localx + (rangex*localy)]*(1-flag);
-    int *point = &g->linebuf[localy][localx] ;
+    int *point = &g->linebuf[localy][localx];
     *point =  color*flag + *point *(1-flag);
 
-
-
 }
 
 /**
@@ -514,7 +513,6 @@
 
   }
 
-
     G g0;
     Gptr g = &g0;
 
@@ -566,13 +564,13 @@
             span = &spack->span[t];
 
 	    if (span->length_x != 1) {
-		drawLine1(
-		    smanager, g,
+	      drawLine1(
+	      	    smanager, g,
                     span, rangex_start, rangex_end, tl_tag[tl_tag_flg1]);
 	    } else {
-		drawDot1(
-		    smanager, g,
-                    span, rangex_start, rangex_end, tl_tag[tl_tag_flg1]);
+	      drawDot1(
+	          smanager, g,
+	           span, rangex_start, rangex_end, tl_tag[tl_tag_flg1]);
             }
             next_span = span;
 
--- a/Renderer/Engine/viewer.cc	Fri Oct 22 20:11:41 2010 +0900
+++ b/Renderer/Engine/viewer.cc	Fri Oct 22 20:12:33 2010 +0900
@@ -34,7 +34,7 @@
 
 RederingData r[2];
 
-int  ppi, spi;
+int  ppi, spi = 0;
 
 /**
  *
@@ -293,7 +293,7 @@
 {
     HTaskPtr task_next = initLoop();
 
-    task_next->set_post(&post2runLoop, (void *)this, 0); // set_post(function(this->run_loop()), NULL)
+    task_next->set_post(&post2runLoop, (void *)this, (void*)pixels); // set_post(function(this->run_loop()), NULL)
     task_next->spawn();
 }
 
@@ -311,6 +311,7 @@
     }
 
     dev->clean_pixels();
+
     pixels = dev->flip_screen(pixels);
 
     /* ここでGameTaskの終了を待つTaskを生成しておく */
@@ -357,6 +358,8 @@
 static void
 post2runLoop(SchedTask *s, void *viewer_, void *arg)
 {
+
+
     Viewer *viewer = (Viewer*)viewer_;
     HTaskPtr task_next = viewer->manager->create_task(Dummy,0,0,0,0);
     viewer->run_loop(task_next);
@@ -377,7 +380,7 @@
 {
     common_draw(task_next);
 
-    task_next->set_post(post2runLoop, (void*)this, 0); // set_post(function(this->run_loop()), NULL)
+    task_next->set_post(post2runLoop, (void*)this, (void*)pixels); // set_post(function(this->run_loop()), NULL)
     task_next->spawn();
     // TASK_DRAW_SPAN が全て終わったら DUMMY_TASK が Viewer::run_loop() を呼ぶ    
 
@@ -901,7 +904,7 @@
 
     if (profile) {
 	if (frames % 50 == 49) {
-	   manager->show_profile();
+	  manager->show_profile();
            this_time = get_ticks();
            if (this_time != start_time) {
               printf("\n%f FPS\n", ((((float)frames)*1000.0)/(this_time-start_time)));
--- a/Renderer/Engine/viewerSDL.cc	Fri Oct 22 20:11:41 2010 +0900
+++ b/Renderer/Engine/viewerSDL.cc	Fri Oct 22 20:12:33 2010 +0900
@@ -2,6 +2,7 @@
 #include "Func.h"
 #include "TaskManager.h"
 #include "viewer_types.h"
+#include "fb.h"
 
 #define UGA 1
 
@@ -12,12 +13,50 @@
 ViewerSDL::ViewerSDL() {}
 ViewerSDL::~ViewerSDL() {}
 
+#define DEVICE_NAME "/dev/fb0"
+#define DIV_BYTE 8
+
 Uint32 *
 ViewerSDL::video_init(TaskManager *manager, int bpp, int width, int height)
 {
+
+#if defined(__linux__)
+  
+    int fd_framebuffer ;
+    struct fb_var_screeninfo vinfo;
+    struct fb_fix_screeninfo finfo;
+    
+    // 読み書き用にファイルを開く 
+    fd_framebuffer = open( DEVICE_NAME , O_RDWR);
+    if ( !fd_framebuffer ) {
+      send_current_error_msg("Framebuffer device open error !");
+      exit(1);
+    }
+    send_current_information("The framebuffer device was opened !");
+	
+    // 固定スクリーン情報取得 
+    if ( ioctl( fd_framebuffer , FBIOGET_FSCREENINFO , &finfo ) ) {
+	    send_current_error_msg("Fixed information not gotton !");
+	    exit(2);
+    }
+    
+    // 変動スクリーン情報取得 
+    if ( ioctl( fd_framebuffer , FBIOGET_VSCREENINFO , &vinfo ) ) {
+      send_current_error_msg("Variable information not gotton !");
+      exit(3);
+    }
+
+    close(fd_framebuffer);
+
+    width = vinfo.xres;
+    height = vinfo.yres;
+    bpp = vinfo.bits_per_pixel;
+
+#endif
+        
     Uint32 sdl_flag = default_sdl_flag | SDL_INIT_VIDEO;
     Uint32 *p;
-
+	
     if (SDL_Init(sdl_flag) < 0) {
 	fprintf(stderr,"Couldn't initialize SDL: %s\n", SDL_GetError());
 	exit(1);
@@ -25,20 +64,16 @@
 
     screen = SDL_SetVideoMode(width, height, bpp, SDL_HWSURFACE);
     if (screen == NULL) {
-	fprintf(stderr, "Couldn't set GL mode: %s\n", SDL_GetError());
+	fprintf(stderr, "Couldn't set SDL mode: %s\n", SDL_GetError());
 	SDL_Quit();
 	exit(1);
     }
+
     this->width = screen->w;
     this->height = screen->h;
     this->bpp = screen->format->BitsPerPixel;
     
     p = (Uint32*)manager->allocate(screen->pitch*height);
-    bitmap = SDL_CreateRGBSurfaceFrom((void *)p,
-				      screen->w, screen->h,
-				      screen->format->BitsPerPixel,
-				      screen->pitch,
-				      redMask, greenMask, blueMask, alphaMask);
 
     return p;
 }
@@ -47,25 +82,38 @@
 ViewerSDL::clean_pixels()
 {
     //bzero(pixels, sizeof(int)*width*height);
-    SDL_FillRect(screen,NULL,SDL_MapRGB(screen->format,0,0,0));
+  
+    //SDL_FillRect(screen,NULL,SDL_MapRGB(screen->format,0,0,0));
 }
 
 void
 ViewerSDL::clear_screen()
 {
+
 #if !UGA
     SDL_BlitSurface(bitmap, NULL, screen, NULL);
     SDL_UpdateRect(screen, 0, 0, 0, 0);        
 #endif
+
 }
 
 uint32_t *
 ViewerSDL::flip_screen(uint32_t *old)
 {
 #if UGA
+
+    bitmap = SDL_CreateRGBSurfaceFrom((void *)old,
+				      screen->w, screen->h,
+				      screen->format->BitsPerPixel,
+				      screen->pitch,
+				      //redMask, greenMask, blueMask, alphaMask);
+				      redMask, greenMask, blueMask, 0);
+
     SDL_BlitSurface(bitmap,NULL,screen,NULL);
     SDL_UpdateRect(screen,0,0,0,0);
+
 #endif
+
     return old;
 }
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/old/sdl_test/Makefile	Fri Oct 22 20:12:33 2010 +0900
@@ -0,0 +1,11 @@
+all: sdl_test fb_test
+
+sdl_test: sdl_test.cc
+	g++ -O9 `sdl-config --libs --cflags` -o sdl_test sdl_test.cc
+
+fb_test: fb_test.cc
+	g++ -O9 `sdl-config --libs --cflags` -o fb_test fb_test.cc
+
+clean:
+	rm -f sdl_test *.o
+	rm -f fb_test *.o
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/old/sdl_test/fb.h	Fri Oct 22 20:12:33 2010 +0900
@@ -0,0 +1,33 @@
+#ifndef FB_H
+#define FB_H
+
+#define DEVICE_NAME "/dev/fb0"
+#define DIV_BYTE 8
+
+#include <unistd.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <linux/fb.h>
+#include <linux/fs.h>
+#include <sys/mman.h>
+#include <sys/ioctl.h>
+#include <stdlib.h>
+#include <iostream>
+
+struct fb_t {
+
+  char *pixels;
+  int size;
+  int width;
+  int height;
+  int bpp;
+  int fd;
+
+};
+
+/* function prototype */
+void send_current_error_msg(const char *ptr);
+void send_current_information(const char *ptr);
+fb_t get_fbdev_addr(void);
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/old/sdl_test/fb_test.cc	Fri Oct 22 20:12:33 2010 +0900
@@ -0,0 +1,181 @@
+#include "fb.h"
+#include <SDL.h>
+using namespace std;
+
+void send_current_error_msg(const char *ptr)
+{
+    fprintf( stderr , "%s\n" , ptr );
+}
+
+void send_current_information(const char *ptr)
+{
+    fprintf( stdout , "%s\n" , ptr );
+}
+
+const int redMask   = 0x00ff0000;
+const int greenMask = 0x0000ff00;
+const int blueMask  = 0x000000ff;
+const int alphaMask = 0xff000000;
+
+fb_t
+get_fbdev_addr(void)
+{
+  int fd_framebuffer ;
+  struct fb_var_screeninfo vinfo;
+  struct fb_fix_screeninfo finfo;
+  long int screensize ;
+  //long int location;
+  char *fbptr ;
+  char tmp[DIV_BYTE*10];
+
+  //int x , y ;
+  int xres,yres,vbpp,line_len;
+  //unsigned short tcolor ;
+
+  /* 読み書き用にファイルを開く */
+  fd_framebuffer = open( DEVICE_NAME , O_RDWR);
+  if ( !fd_framebuffer ) {
+    send_current_error_msg("Framebuffer device open error !");
+    exit(1);
+  }
+  send_current_information("The framebuffer device was opened !");
+	
+  /* 固定スクリーン情報取得 */
+  if ( ioctl( fd_framebuffer , FBIOGET_FSCREENINFO , &finfo ) ) {
+    send_current_error_msg("Fixed information not gotton !");
+    exit(2);
+  }
+
+  /* 変動スクリーン情報取得 */
+  if ( ioctl( fd_framebuffer , FBIOGET_VSCREENINFO , &vinfo ) ) {
+    send_current_error_msg("Variable information not gotton !");
+    exit(3);
+  }
+  xres = vinfo.xres ;
+  yres = vinfo.yres ;
+  printf("vinfo.yres %d \n", vinfo.yres);
+  vbpp = vinfo.bits_per_pixel ;
+  line_len = finfo.line_length ;
+  sprintf( tmp , "%d(pixel)x%d(line), %dbpp(bits per pixel)",xres,yres,vbpp);
+  sprintf( tmp , "%d(xoffset)x%d(yoffset)",vinfo.xoffset, vinfo.yoffset);
+  send_current_information( tmp );
+
+  /* バイト単位でのスクリーンのサイズを計算 */
+  screensize = xres * yres * vbpp / DIV_BYTE ;
+
+  /* デバイスをメモリにマップする */
+  fbptr = (char *)mmap(0,screensize,PROT_READ | PROT_WRITE,MAP_SHARED,fd_framebuffer,0);
+  if ( (int)fbptr == -1 ) {
+    send_current_error_msg("Don't get framebuffer device to memory !");
+    exit(4);
+  }
+  send_current_information("The framebuffer device was mapped !");
+
+  printf("fb: 0x%x \n", (unsigned int)fbptr);
+
+  fb_t fb;
+  fb.pixels = fbptr;
+  fb.size = screensize;
+  fb.width = xres;
+  fb.height = yres;
+  fb.bpp = vbpp;
+  fb.fd = fd_framebuffer;
+
+  return fb;
+
+}
+
+int main() {
+
+  fb_t fb = get_fbdev_addr();
+
+  void *p;
+  Uint32 *gUra;
+
+  gUra = (Uint32*)fb.pixels;
+  //gUra = (Uint32*)malloc(fb.width*fb.height*4);
+
+  printf("fb.height %d \n", fb.height);
+
+  int i;
+  int color = 0;
+
+  for (i = 0; i < fb.width*fb.height; i++) {
+    gUra[i] = color;
+  }
+
+
+  //初期化
+  if (SDL_Init( SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_JOYSTICK ) < 0) {
+    printf("SDL_Init failed\n");
+    return -1;
+  }
+
+  printf("fb.width %d fb.height %d fb.bpp %d \n",fb.width, fb.height, fb.bpp);
+
+  SDL_Surface *screen=SDL_SetVideoMode(fb.width,fb.height,fb.bpp,SDL_HWSURFACE);
+  if (screen == NULL) {
+    printf("SDL_Surface failed\n");
+    SDL_Quit();
+    return -1;
+  }
+
+  int done = 0;
+  SDL_Event event;
+
+  int fps=0;
+
+  Uint32 t1=SDL_GetTicks();
+
+  while(!done){
+    while(SDL_PollEvent(&event)){
+      switch(event.type){
+      case SDL_QUIT:
+        done = 1;
+        break;
+      case SDL_KEYDOWN:
+        if(event.key.keysym.sym == SDLK_ESCAPE){
+          done = 1;
+        }
+        break;
+      }
+    }
+
+    if (color == 0xffffffff) {
+      color = 0;
+    } else {
+
+      char r = ((color & redMask) >> 16) + 1;
+      char g = ((color & greenMask) >> 8) + 1;
+      char b = (color & blueMask) + 1;
+	    
+      color = alphaMask + (r << 16) + (g << 8) + b;
+
+    }
+
+    for (i = 0; i < fb.width*fb.height; i++) {
+      gUra[i] = color;
+    }
+
+ 
+    if (SDL_GetTicks() < t1 + 1000){
+      fps++;
+    } else{
+      printf("fps=%d\n", fps);
+      fps=0;
+      t1=SDL_GetTicks();
+    }
+  }
+
+  for (i = 0; i < fb.width*fb.height; i++) {
+    gUra[i] = 0;
+  }
+  munmap(fb.pixels, fb.size);
+  close(fb.fd);
+  SDL_Quit();
+
+
+  return 0;
+
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/old/sdl_test/sdl_test.cc	Fri Oct 22 20:12:33 2010 +0900
@@ -0,0 +1,175 @@
+#include "fb.h"
+#include <SDL.h>
+using namespace std;
+
+void send_current_error_msg(const char *ptr)
+{
+    fprintf( stderr , "%s\n" , ptr );
+}
+
+void send_current_information(const char *ptr)
+{
+    fprintf( stdout , "%s\n" , ptr );
+}
+
+
+const int redMask   = 0x00ff0000;
+const int greenMask = 0x0000ff00;
+const int blueMask  = 0x000000ff;
+const int alphaMask = 0xff000000;
+
+
+fb_t
+get_fbdev_addr(void)
+{
+  int fd_framebuffer ;
+  struct fb_var_screeninfo vinfo;
+  struct fb_fix_screeninfo finfo;
+  long int screensize ;
+  //long int location;
+  char *fbptr ;
+  char tmp[DIV_BYTE*10];
+
+  //int x , y ;
+  int xres,yres,vbpp,line_len;
+  //unsigned short tcolor ;
+
+  /* 読み書き用にファイルを開く */
+  fd_framebuffer = open( DEVICE_NAME , O_RDWR);
+  if ( !fd_framebuffer ) {
+    send_current_error_msg("Framebuffer device open error !");
+    exit(1);
+  }
+  send_current_information("The framebuffer device was opened !");
+	
+  /* 固定スクリーン情報取得 */
+  if ( ioctl( fd_framebuffer , FBIOGET_FSCREENINFO , &finfo ) ) {
+    send_current_error_msg("Fixed information not gotton !");
+    exit(2);
+  }
+
+  /* 変動スクリーン情報取得 */
+  if ( ioctl( fd_framebuffer , FBIOGET_VSCREENINFO , &vinfo ) ) {
+    send_current_error_msg("Variable information not gotton !");
+    exit(3);
+  }
+  xres = vinfo.xres ;
+  yres = vinfo.yres ;
+  printf("vinfo.yres %d \n", vinfo.yres);
+  vbpp = vinfo.bits_per_pixel ;
+  line_len = finfo.line_length ;
+  sprintf( tmp , "%d(pixel)x%d(line), %dbpp(bits per pixel)",xres,yres,vbpp);
+  sprintf( tmp , "%d(xoffset)x%d(yoffset)",vinfo.xoffset, vinfo.yoffset);
+  send_current_information( tmp );
+
+  /* バイト単位でのスクリーンのサイズを計算 */
+  screensize = xres * yres * vbpp / DIV_BYTE ;
+
+  fb_t fb;
+  fb.size = screensize;
+  fb.width = xres;
+  fb.height = yres;
+  fb.bpp = vbpp;
+  fb.fd = fd_framebuffer;
+
+  return fb;
+
+}
+
+int main() {
+
+  fb_t fb = get_fbdev_addr();
+
+  close(fb.fd);
+
+  void *p;
+  Uint32 *gUra;
+
+  //posix_memalign((void**)&gUra, 16, fb.width*fb.height*4);
+
+  gUra = (Uint32*)malloc(fb.width*fb.height*4);
+
+  printf("fb.height %d \n", fb.height);
+
+  int i;
+  int color = 0x000000ff;
+
+  for (i = 0; i < fb.width*fb.height; i++) {
+    gUra[i] = color;
+  }
+
+
+  //初期化
+  if (SDL_Init( SDL_INIT_VIDEO | SDL_INIT_TIMER | SDL_INIT_JOYSTICK ) < 0) {
+    printf("SDL_Init failed\n");
+    return -1;
+  }
+
+  printf("fb.width %d fb.height %d fb.bpp %d \n",fb.width, fb.height, fb.bpp);
+
+  SDL_Surface *screen=SDL_SetVideoMode(fb.width,fb.height,fb.bpp,SDL_HWSURFACE);
+  if (screen == NULL) {
+    printf("SDL_Surface failed\n");
+    SDL_Quit();
+    return -1;
+  }
+
+  int done = 0;
+  SDL_Event event;
+
+  int fps=0;
+
+  Uint32 t1=SDL_GetTicks();
+
+  while(!done){
+    while(SDL_PollEvent(&event)){
+      switch(event.type){
+      case SDL_QUIT:
+        done = 1;
+        break;
+      case SDL_KEYDOWN:
+        if(event.key.keysym.sym == SDLK_ESCAPE){
+          done = 1;
+        }
+        break;
+      }
+    }
+
+
+    if (color == 0xffffffff) {
+      color = 0x000000ff;
+    } else {
+
+      char r = ((color & redMask) >> 16) + 1;
+      char g = ((color & greenMask) >> 8) + 1;
+      char b = (color & blueMask) + 1;
+
+      color = alphaMask + (r << 16) + (g << 8) + b;
+
+    }
+
+    for (i = 0; i < fb.width*fb.height; i++) {
+      gUra[i] = color;
+    }
+
+    //ここに処理を追加して変化を見る
+    SDL_Surface *bitmap = SDL_CreateRGBSurfaceFrom((void *)gUra,fb.width,fb.height,fb.bpp,fb.width*4,redMask,greenMask,blueMask,0);
+    SDL_BlitSurface(bitmap,NULL,screen,NULL);
+    SDL_UpdateRect(screen,0,0,0,0);
+    
+
+    if (SDL_GetTicks() < t1 + 1000){
+      fps++;
+    } else{
+      printf("fps=%d\n", fps);
+      fps=0;
+      t1=SDL_GetTicks();
+    }
+  }
+
+  SDL_Quit();
+
+  return 0;
+
+}
+