• R/O
  • SSH
  • HTTPS

dxruby: Commit


Commit MetaInfo

Revisión544 (tree)
Tiempo2017-02-11 12:33:34
Autormirichi

Log Message

Viewport、CustomRenderTarget、VertexBuffer追加。1.5.21dev

Cambiar Resumen

Diferencia incremental

--- branches/1.5dev/dxruby.c (revision 543)
+++ branches/1.5dev/dxruby.c (revision 544)
@@ -22,8 +22,12 @@
2222 VALUE eDXRubyError; /* 例外 */
2323 VALUE mWindow; /* ウィンドウモジュール */
2424 VALUE cRenderTarget; /* レンダーターゲットクラス */
25+VALUE cCustomRenderTarget; /* カスタムレンダーターゲットクラス */
26+VALUE cViewport; /* ビューポートクラス */
2527 VALUE cShaderCore; /* シェーダコアクラス */
26-VALUE cShader; /* シェーダクラス */
28+VALUE cShader; /* シェーダクラス */
29+VALUE mLowLevelInterface; /* 低レベルインターフェイスモジュール */
30+VALUE cVertexBuffer; /* 頂点バッファクラス */
2731
2832 extern VALUE cImage;
2933
@@ -142,6 +146,8 @@
142146 VALUE symbol_discard = Qundef;
143147 VALUE symbol_aa = Qundef;
144148 VALUE symbol_call = Qundef;
149+VALUE symbol_update = Qundef;
150+VALUE symbol_custom_render = Qundef;
145151
146152 /* プロトタイプ宣言 */
147153 static void InitWindow( void );
@@ -566,14 +572,6 @@
566572 if( g_RenderTargetList.pointer[i] )
567573 {
568574 struct DXRubyRenderTarget *rt = (struct DXRubyRenderTarget *)g_RenderTargetList.pointer[i];
569-#ifdef DXRUBY15
570- // 再生成Procが設定されている場合
571- if( rt->vregenerate_proc != Qnil )
572- {
573- rb_funcall( rt->vregenerate_proc, SYM2ID( symbol_call ), 0 );
574- rt->clearflag = 0;
575- }
576-#endif
577575 }
578576 }
579577 }
@@ -754,9 +752,6 @@
754752 free( rt->PictureList );
755753 free( rt->PictureStruct );
756754 rt->PictureCount = 0;
757-#ifdef DXRUBY15
758- rt->vregenerate_proc = Qnil;
759-#endif
760755 ExitMessageThread();
761756
762757 /* マウスカーソルを戻す */
@@ -779,7 +774,7 @@
779774 {
780775 if( !g_WindowInfo.created )
781776 {
782- rb_raise( eDXRubyError, "ウィンドウ作成前に実行することはできません - Window_running_time" );
777+ return rb_float_new( 0.0 );
783778 }
784779
785780 return rb_float_new( g_RunningTime * 1000.0 / g_OneSecondCount );
@@ -867,7 +862,7 @@
867862 {
868863 if( g_WindowInfo.created )
869864 {
870- rb_raise( eDXRubyError, "ウィンドウ作成後に設定を変更することはできません - Window_setx" );
865+ rb_raise( eDXRubyError, "It is not possible to change the setting after window creation. - Window_setx" );
871866 }
872867
873868 g_WindowInfo.x = NUM2INT( x );
@@ -882,7 +877,7 @@
882877 {
883878 if( g_WindowInfo.created )
884879 {
885- rb_raise( eDXRubyError, "ウィンドウ作成後に設定を変更することはできません - Window_sety" );
880+ rb_raise( eDXRubyError, "It is not possible to change the setting after window creation. - Window_sety" );
886881 }
887882
888883 g_WindowInfo.y = NUM2INT( y );
@@ -899,7 +894,7 @@
899894
900895 if( g_WindowInfo.created )
901896 {
902- rb_raise( eDXRubyError, "ウィンドウ作成後に設定を変更することはできません - Window_setwidth" );
897+ rb_raise( eDXRubyError, "It is not possible to change the setting after window creation. - Window_setwidth" );
903898 }
904899
905900 width = NUM2INT( vwidth );
@@ -922,7 +917,7 @@
922917
923918 if( g_WindowInfo.created )
924919 {
925- rb_raise( eDXRubyError, "ウィンドウ作成後に設定を変更することはできません - Window_setheight" );
920+ rb_raise( eDXRubyError, "It is not possible to change the setting after window creation. - Window_setheight" );
926921 }
927922
928923 height = NUM2INT( vheight );
@@ -1790,33 +1785,6 @@
17901785 }
17911786
17921787
1793-#ifdef DXRUBY15
1794-/*--------------------------------------------------------------------
1795- デバイスロストのような動作を再現するテストメソッド
1796- ---------------------------------------------------------------------*/
1797-static VALUE Window_test_device_lost( VALUE obj )
1798-{
1799- int i;
1800-
1801- for( i = 0; i < g_RenderTargetList.count; i++ )
1802- {
1803- struct DXRubyRenderTarget *rt = (struct DXRubyRenderTarget *)g_RenderTargetList.pointer[i];
1804- g_pD3DDevice->lpVtbl->SetRenderTarget( g_pD3DDevice, 0, rt->surface );
1805- g_pD3DDevice->lpVtbl->Clear( g_pD3DDevice, 0, NULL, D3DCLEAR_TARGET,
1806- D3DCOLOR_ARGB( 255, 0, 0, 0 ), 1.0f, 0 );
1807-
1808- // 再生成Procが設定されている場合
1809- if( rt->vregenerate_proc != Qnil )
1810- {
1811- rb_funcall( rt->vregenerate_proc, SYM2ID( symbol_call ), 0 );
1812- }
1813- }
1814-
1815- return Qnil;
1816-}
1817-#endif
1818-
1819-
18201788 /*********************************************************************
18211789 * ShaderCoreクラス
18221790 *
@@ -1931,7 +1899,7 @@
19311899
19321900 /* DXRubyShaderCoreのメモリ取得&ShaderCoreオブジェクト生成 */
19331901 core = malloc( sizeof( struct DXRubyShaderCore ) );
1934- if( core == NULL ) rb_raise( eDXRubyError, "メモリの取得に失敗しました - ShaderCore_allocate" );
1902+ if( core == NULL ) rb_raise( eDXRubyError, "Memory allocate error. - ShaderCore_allocate" );
19351903 #ifdef DXRUBY_USE_TYPEDDATA
19361904 obj = TypedData_Wrap_Struct( klass, &ShaderCore_data_type, core );
19371905 #else
@@ -2041,7 +2009,7 @@
20412009
20422010 /* DXRubyShaderのメモリ取得&ShaderCoreオブジェクト生成 */
20432011 shader = malloc( sizeof( struct DXRubyShader ) );
2044- if( shader == NULL ) rb_raise( eDXRubyError, "メモリの取得に失敗しました - Shader_allocate" );
2012+ if( shader == NULL ) rb_raise( eDXRubyError, "Memory allocate error. - Shader_allocate" );
20452013 #ifdef DXRUBY_USE_TYPEDDATA
20462014 obj = TypedData_Wrap_Struct( klass, &Shader_data_type, shader );
20472015 #else
@@ -2137,6 +2105,151 @@
21372105
21382106
21392107 /*********************************************************************
2108+ * Viewportクラス
2109+ *
2110+ * 描画のクリッピングをするためのクラス。
2111+ * RenderTargetと同様の使い方をする。
2112+ *********************************************************************/
2113+
2114+/*--------------------------------------------------------------------
2115+ 参照されなくなったときにGCから呼ばれる関数
2116+ ---------------------------------------------------------------------*/
2117+static void Viewport_free( struct DXRubyViewport *vp )
2118+{
2119+ free( vp->PictureList );
2120+ free( vp->PictureStruct );
2121+ vp->PictureCount = 0;
2122+ vp->PictureSize = 0;
2123+ vp->PictureDecideCount = 0;
2124+ vp->PictureDecideSize = 0;
2125+}
2126+
2127+void Viewport_release( struct DXRubyViewport *vp )
2128+{
2129+ free( vp );
2130+ vp = NULL;
2131+}
2132+
2133+/*--------------------------------------------------------------------
2134+ Viewportクラスのmark
2135+ ---------------------------------------------------------------------*/
2136+static void Viewport_mark( struct DXRubyViewport *vp )
2137+{
2138+ int i;
2139+
2140+ for( i = 0; i < vp->PictureCount; i++ )
2141+ {
2142+ rb_gc_mark( vp->PictureList[i].picture->value );
2143+ }
2144+}
2145+
2146+#ifdef DXRUBY_USE_TYPEDDATA
2147+const rb_data_type_t Viewport_data_type = {
2148+ "Viewport",
2149+ {
2150+ Viewport_mark,
2151+ Viewport_release,
2152+ 0,
2153+ },
2154+ NULL, NULL
2155+};
2156+#endif
2157+
2158+/*--------------------------------------------------------------------
2159+ Viewportクラスのallocate。メモリを確保する為にinitialize前に呼ばれる。
2160+ ---------------------------------------------------------------------*/
2161+static VALUE Viewport_allocate( VALUE klass )
2162+{
2163+ VALUE obj;
2164+ struct DXRubyViewport *vp;
2165+
2166+ /* DXRubyViewportのメモリ取得&Viewportオブジェクト生成 */
2167+ vp = malloc(sizeof(struct DXRubyViewport));
2168+ if( vp == NULL ) rb_raise( eDXRubyError, "Memory allocate error. - Viewport_allocate" );
2169+#ifdef DXRUBY_USE_TYPEDDATA
2170+ obj = TypedData_Wrap_Struct( klass, &Viewport_data_type, vp );
2171+#else
2172+ obj = Data_Wrap_Struct(klass, Viewport_mark, Viewport_release, vp);
2173+#endif
2174+ /* とりあえずテクスチャオブジェクトはNULLにしておく */
2175+ vp->texture = NULL;
2176+
2177+ /* ピクチャ構造体の初期値設定 */
2178+ vp->PictureCount = 0;
2179+ vp->PictureAllocateCount = 128;
2180+ vp->PictureSize = 0;
2181+ vp->PictureAllocateSize = 128*32;
2182+ vp->PictureList = malloc( vp->PictureAllocateCount * sizeof(struct DXRubyPictureList) );
2183+ vp->PictureStruct = malloc( vp->PictureAllocateSize );
2184+ vp->PictureDecideCount = 0;
2185+ vp->PictureDecideSize = 0;
2186+
2187+ vp->ox = 0;
2188+ vp->oy = 0;
2189+
2190+ return obj;
2191+}
2192+
2193+
2194+/*--------------------------------------------------------------------
2195+ ViewportクラスのInitialize
2196+ ---------------------------------------------------------------------*/
2197+static VALUE Viewport_initialize( int argc, VALUE *argv, VALUE self )
2198+{
2199+ struct DXRubyViewport *vp = DXRUBY_GET_STRUCT( Viewport, self );
2200+ VALUE vwidth, vheight;
2201+ int width, height;
2202+
2203+ rb_scan_args( argc, argv, "20", &vwidth, &vheight );
2204+
2205+ width = NUM2INT( vwidth );
2206+ height = NUM2INT( vheight );
2207+
2208+ if( width <= 0 || height <= 0 )
2209+ {
2210+ rb_raise( eDXRubyError, "Failed to create Viewport object - Viewport_initialize" );
2211+ }
2212+
2213+ vp->x = 0;
2214+ vp->y = 0;
2215+ vp->width = width;
2216+ vp->height = height;
2217+
2218+ return self;
2219+}
2220+
2221+
2222+/*--------------------------------------------------------------------
2223+ ViewportクラスのResize
2224+ ---------------------------------------------------------------------*/
2225+static VALUE Viewport_resize( VALUE self, VALUE vwidth, VALUE vheight )
2226+{
2227+ struct DXRubyViewport *vp = DXRUBY_GET_STRUCT( Viewport, self );
2228+ HRESULT hr;
2229+ int width, height;
2230+
2231+ width = NUM2INT( vwidth );
2232+ height = NUM2INT( vheight );
2233+
2234+ if( width <= 0 || height <= 0 )
2235+ {
2236+ rb_raise( eDXRubyError, "Failed to create Viewport object - Viewport_resize" );
2237+ }
2238+
2239+ vp->x = 0;
2240+ vp->y = 0;
2241+ vp->width = width;
2242+ vp->height = height;
2243+ vp->PictureCount = 0;
2244+ vp->PictureSize = 0;
2245+ vp->PictureDecideCount = 0;
2246+ vp->PictureDecideSize = 0;
2247+
2248+ return self;
2249+}
2250+
2251+
2252+/*********************************************************************
21402253 * RenderTargetクラス
21412254 *
21422255 * レンダーターゲットになれるImageクラス。
@@ -2210,9 +2323,6 @@
22102323 rt->PictureSize = 0;
22112324 rt->PictureDecideCount = 0;
22122325 rt->PictureDecideSize = 0;
2213-#ifdef DXRUBY15
2214- rt->vregenerate_proc = Qnil;
2215-#endif
22162326 }
22172327
22182328 void RenderTarget_release( struct DXRubyRenderTarget *rt )
@@ -2243,10 +2353,6 @@
22432353 {
22442354 rb_gc_mark( rt->PictureList[i].picture->value );
22452355 }
2246-
2247-#ifdef DXRUBY15
2248- rb_gc_mark( rt->vregenerate_proc );
2249-#endif
22502356 }
22512357
22522358 #ifdef DXRUBY_USE_TYPEDDATA
@@ -2293,8 +2399,9 @@
22932399 if( DXRUBY_CHECK( RenderTarget, vrt ) )
22942400 {
22952401 struct DXRubyRenderTarget *src_rt = DXRUBY_GET_STRUCT( RenderTarget, vrt );
2402+ int customflag = RTEST(rb_obj_is_kind_of(vrt, cCustomRenderTarget));
22962403
2297- if( src_rt->clearflag == 0 && src_rt->PictureCount == 0 )
2404+ if( src_rt->clearflag == 0 && src_rt->PictureCount == 0 && !customflag )
22982405 {
22992406 g_pD3DDevice->lpVtbl->SetRenderTarget( g_pD3DDevice, 0, src_rt->surface );
23002407 g_pD3DDevice->lpVtbl->Clear( g_pD3DDevice, 0, NULL, D3DCLEAR_TARGET,
@@ -2301,9 +2408,9 @@
23012408 D3DCOLOR_ARGB( src_rt->a, src_rt->r, src_rt->g, src_rt->b ), 1.0f, 0 );
23022409 src_rt->clearflag = 1;
23032410 }
2304- else if( src_rt->PictureCount > 0 )
2411+ else if( src_rt->PictureCount > 0 || customflag )
23052412 {
2306- RenderTarget_update( vrt );
2413+ rb_funcall( vrt, SYM2ID( symbol_update ), 0 );
23072414 }
23082415 }
23092416 }
@@ -2318,7 +2425,7 @@
23182425
23192426 /* DXRubyRenderTargetのメモリ取得&RenderTargetオブジェクト生成 */
23202427 rt = malloc(sizeof(struct DXRubyRenderTarget));
2321- if( rt == NULL ) rb_raise( eDXRubyError, "メモリの取得に失敗しました - RenderTarget_allocate" );
2428+ if( rt == NULL ) rb_raise( eDXRubyError, "Memory allocate error. - RenderTarget_allocate" );
23222429 #ifdef DXRUBY_USE_TYPEDDATA
23232430 obj = TypedData_Wrap_Struct( klass, &RenderTarget_data_type, rt );
23242431 #else
@@ -2345,15 +2452,10 @@
23452452 rt->r = 0;
23462453 rt->g = 0;
23472454 rt->b = 0;
2348-#ifdef DXRUBY15
2349- rt->vregenerate_proc = Qnil;
2350-#endif
23512455 rt->clearflag = 0;
23522456 rt->ox = 0;
23532457 rt->oy = 0;
23542458
2355-// rt->lockcount = 0;
2356-
23572459 return obj;
23582460 }
23592461
@@ -2387,7 +2489,7 @@
23872489
23882490 if( texture == NULL )
23892491 {
2390- rb_raise( eDXRubyError, "画像用メモリの取得に失敗しました - RenderTarget_initialize" );
2492+ rb_raise( eDXRubyError, "画像用Memory allocate error. - RenderTarget_initialize" );
23912493 }
23922494
23932495 DXRUBY_RETRY_START;
@@ -2518,17 +2620,7 @@
25182620 DXRUBY_CHECK_DISPOSE( rt, surface );
25192621
25202622 /* 描画予約があればupdateする */
2521- if( rt->clearflag == 0 && rt->PictureCount == 0 )
2522- {
2523- g_pD3DDevice->lpVtbl->SetRenderTarget( g_pD3DDevice, 0, rt->surface );
2524- g_pD3DDevice->lpVtbl->Clear( g_pD3DDevice, 0, NULL, D3DCLEAR_TARGET,
2525- D3DCOLOR_ARGB( rt->a, rt->r, rt->g, rt->b ), 1.0f, 0 );
2526- rt->clearflag = 1;
2527- }
2528- else if( rt->PictureCount > 0 )
2529- {
2530- RenderTarget_update( self );
2531- }
2623+ RenderTerget_auto_update( self );
25322624
25332625 vimage = Image_allocate( cImage );
25342626 ary[0] = INT2FIX( rt->width );
@@ -2591,7 +2683,10 @@
25912683 static VALUE RenderTarget_getWidth( VALUE self )
25922684 {
25932685 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, self );
2594- DXRUBY_CHECK_DISPOSE( rt, surface );
2686+ if( !DXRUBY_CHECK( Viewport, self ) )
2687+ {
2688+ DXRUBY_CHECK_DISPOSE( rt, surface );
2689+ }
25952690 return INT2FIX( rt->width );
25962691 }
25972692
@@ -2602,7 +2697,10 @@
26022697 static VALUE RenderTarget_getHeight( VALUE self )
26032698 {
26042699 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, self );
2605- DXRUBY_CHECK_DISPOSE( rt, surface );
2700+ if( !DXRUBY_CHECK( Viewport, self ) )
2701+ {
2702+ DXRUBY_CHECK_DISPOSE( rt, surface );
2703+ }
26062704 return INT2FIX( rt->height );
26072705 }
26082706
@@ -2613,7 +2711,10 @@
26132711 static VALUE RenderTarget_getOx( VALUE self )
26142712 {
26152713 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, self );
2616- DXRUBY_CHECK_DISPOSE( rt, surface );
2714+ if( !DXRUBY_CHECK( Viewport, self ) )
2715+ {
2716+ DXRUBY_CHECK_DISPOSE( rt, surface );
2717+ }
26172718 return INT2FIX( rt->ox );
26182719 }
26192720
@@ -2624,7 +2725,10 @@
26242725 static VALUE RenderTarget_getOy( VALUE self )
26252726 {
26262727 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, self );
2627- DXRUBY_CHECK_DISPOSE( rt, surface );
2728+ if( !DXRUBY_CHECK( Viewport, self ) )
2729+ {
2730+ DXRUBY_CHECK_DISPOSE( rt, surface );
2731+ }
26282732 return INT2FIX( rt->oy );
26292733 }
26302734
@@ -2635,7 +2739,10 @@
26352739 static VALUE RenderTarget_setOx( VALUE self, VALUE vox )
26362740 {
26372741 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, self );
2638- DXRUBY_CHECK_DISPOSE( rt, surface );
2742+ if( !DXRUBY_CHECK( Viewport, self ) )
2743+ {
2744+ DXRUBY_CHECK_DISPOSE( rt, surface );
2745+ }
26392746 rt->ox = NUM2INT( vox );
26402747 return vox;
26412748 }
@@ -2647,7 +2754,10 @@
26472754 static VALUE RenderTarget_setOy( VALUE self, VALUE voy )
26482755 {
26492756 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, self );
2650- DXRUBY_CHECK_DISPOSE( rt, surface );
2757+ if( !DXRUBY_CHECK( Viewport, self ) )
2758+ {
2759+ DXRUBY_CHECK_DISPOSE( rt, surface );
2760+ }
26512761 rt->oy = NUM2INT( voy );
26522762 return voy;
26532763 }
@@ -2856,7 +2966,6 @@
28562966 int col;
28572967 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, obj );
28582968 DXRUBY_CHECK_DISPOSE( rt, surface );
2859-// DXRUBY_CHECK_IMAGE_LOCK( rt );
28602969
28612970 if( argc < 3 || argc > 4 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 3, 4 );
28622971
@@ -2896,7 +3005,6 @@
28963005 int col;
28973006 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, obj );
28983007 DXRUBY_CHECK_DISPOSE( rt, surface );
2899-// DXRUBY_CHECK_IMAGE_LOCK( rt );
29003008
29013009 if( argc < 5 || argc > 6 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 5, 6 );
29023010
@@ -3456,9 +3564,6 @@
34563564
34573565 /* 描画 */
34583566 g_pD3DDevice->lpVtbl->DrawPrimitiveUP(g_pD3DDevice, D3DPT_TRIANGLELIST, 2, VertexDataTbl, sizeof(TLVERTX));
3459-
3460- /* ロックカウントを減らす */
3461-// image->lockcount--;
34623567 }
34633568
34643569 /*--------------------------------------------------------------------
@@ -3470,15 +3575,22 @@
34703575 struct DXRubyPicture_draw *picture;
34713576 float z;
34723577 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, obj );
3473- DXRUBY_CHECK_DISPOSE( rt, surface );
3474-// DXRUBY_CHECK_IMAGE_LOCK( rt );
34753578
3579+ /* Viewprtの場合はdisposedチェックはしない */
3580+ if( !DXRUBY_CHECK( Viewport, obj ) )
3581+ {
3582+ DXRUBY_CHECK_DISPOSE( rt, surface );
3583+ }
3584+
34763585 if( argc < 3 || argc > 4 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 3, 4 );
34773586
3478- /* 引数のイメージオブジェクトから中身を取り出す */
3479- DXRUBY_CHECK_IMAGE( argv[2] );
3480- image = DXRUBY_GET_STRUCT( Image, argv[2] );
3481- DXRUBY_CHECK_DISPOSE( image, texture );
3587+ /* 引数のイメージオブジェクトから中身を取り出す(Viewportの場合は省略) */
3588+ if( !DXRUBY_CHECK( Viewport, argv[2] ) )
3589+ {
3590+ DXRUBY_CHECK_IMAGE( argv[2] );
3591+ image = DXRUBY_GET_STRUCT( Image, argv[2] );
3592+ DXRUBY_CHECK_DISPOSE( image, texture );
3593+ }
34823594
34833595 picture = (struct DXRubyPicture_draw *)RenderTarget_AllocPictureList( rt, sizeof( struct DXRubyPicture_draw ) );
34843596
@@ -3500,9 +3612,6 @@
35003612 /* RenderTargetだった場合に描画予約があればupdateする */
35013613 RenderTerget_auto_update( argv[2] );
35023614
3503- /* 使われたimageのロック */
3504-// image->lockcount++;
3505-
35063615 return obj;
35073616 }
35083617
@@ -3516,7 +3625,6 @@
35163625 float z;
35173626 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, obj );
35183627 DXRUBY_CHECK_DISPOSE( rt, surface );
3519-// DXRUBY_CHECK_IMAGE_LOCK( rt );
35203628
35213629 if( argc < 4 || argc > 5 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 4, 5 );
35223630
@@ -3545,9 +3653,6 @@
35453653 /* RenderTargetだった場合に描画予約があればupdateする */
35463654 RenderTerget_auto_update( argv[2] );
35473655
3548- /* 使われたimageのロック */
3549-// image->lockcount++;
3550-
35513656 return obj;
35523657 }
35533658
@@ -3562,7 +3667,6 @@
35623667 float z;
35633668 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, obj );
35643669 DXRUBY_CHECK_DISPOSE( rt, surface );
3565-// DXRUBY_CHECK_IMAGE_LOCK( rt );
35663670
35673671 if( argc < 3 || argc > 4 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 3, 4 );
35683672
@@ -3591,9 +3695,6 @@
35913695 /* RenderTargetだった場合に描画予約があればupdateする */
35923696 RenderTerget_auto_update( argv[2] );
35933697
3594- /* 使われたimageのロック */
3595-// image->lockcount++;
3596-
35973698 return obj;
35983699 }
35993700
@@ -3608,7 +3709,6 @@
36083709 float z;
36093710 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, obj );
36103711 DXRUBY_CHECK_DISPOSE( rt, surface );
3611-// DXRUBY_CHECK_IMAGE_LOCK( rt );
36123712
36133713 if( argc < 3 || argc > 4 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 3, 4);
36143714
@@ -3637,9 +3737,6 @@
36373737 /* RenderTargetだった場合に描画予約があればupdateする */
36383738 RenderTerget_auto_update( argv[2] );
36393739
3640- /* 使われたimageのロック */
3641-// image->lockcount++;
3642-
36433740 return obj;
36443741 }
36453742
@@ -3696,13 +3793,10 @@
36963793 DXRUBY_CHECK_DISPOSE( DXRUBY_GET_STRUCT( Image, value ), texture );
36973794 core->pD3DXEffect->lpVtbl->SetTexture( core->pD3DXEffect, str ,
36983795 (IDirect3DBaseTexture9*)(DXRUBY_GET_STRUCT( Image, value )->texture->pD3DTexture) );
3699- /* ロックカウントを減らす */
3700-// DXRUBY_GET_STRUCT( Image, value )->lockcount--;
3701-
37023796 }
37033797 else
37043798 {
3705- rb_raise( eDXRubyError, "textureパラメータに画像以外が渡されています - Window_draw" );
3799+ rb_raise( eDXRubyError, "Non-image is set in texture parameter - Shader" );
37063800 }
37073801 }
37083802 else if( vtype == symbol_int )
@@ -3738,7 +3832,7 @@
37383832 }
37393833 else
37403834 {
3741- rb_raise( eDXRubyError, "Shaderオブジェクトのパラメータの型が不明です - Window_draw" );
3835+ rb_raise( eDXRubyError, "Unknown parameter type - Shader" );
37423836 }
37433837
37443838 return ST_CONTINUE;
@@ -3816,9 +3910,6 @@
38163910 core->pD3DXEffect->lpVtbl->EndPass( core->pD3DXEffect );
38173911 }
38183912 core->pD3DXEffect->lpVtbl->End( core->pD3DXEffect );
3819-
3820- /* ロックカウントを減らす */
3821-// image->lockcount--;
38223913 }
38233914
38243915 /*--------------------------------------------------------------------
@@ -3837,7 +3928,6 @@
38373928 if( argc < 4 || argc > 5 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 4, 5 );
38383929
38393930 DXRUBY_CHECK_DISPOSE( rt, surface );
3840-// DXRUBY_CHECK_IMAGE_LOCK( rt );
38413931
38423932 picture = (struct DXRubyPicture_draw *)RenderTarget_AllocPictureList( rt, sizeof( struct DXRubyPicture_draw ) );
38433933
@@ -3873,9 +3963,6 @@
38733963 /* RenderTargetだった場合に描画予約があればupdateする */
38743964 RenderTerget_auto_update( argv[2] );
38753965
3876- /* 使われたimageのロック */
3877-// DXRUBY_GET_STRUCT( Image, argv[2] )->lockcount++;
3878-
38793966 return obj;
38803967 }
38813968
@@ -3979,9 +4066,6 @@
39794066 /* 描画 */
39804067 g_pD3DDevice->lpVtbl->DrawPrimitiveUP( g_pD3DDevice, D3DPT_TRIANGLELIST, 2, VertexDataTbl, sizeof(TLVERTX) );
39814068 }
3982-
3983- /* ロックカウントを減らす */
3984-// image->lockcount--;
39854069 }
39864070
39874071 /*--------------------------------------------------------------------
@@ -3995,7 +4079,6 @@
39954079 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, obj );
39964080 volatile VALUE temp;
39974081 DXRUBY_CHECK_DISPOSE( rt, surface );
3998-// DXRUBY_CHECK_IMAGE_LOCK( rt );
39994082
40004083 if( argc < 5 || argc > 8 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 5, 8 );
40014084
@@ -4029,9 +4112,6 @@
40294112 /* RenderTargetだった場合に描画予約があればupdateする */
40304113 RenderTerget_auto_update( argv[2] );
40314114
4032- /* 使われたimageのロック */
4033-// image->lockcount++;
4034-
40354115 return obj;
40364116 }
40374117
@@ -4046,7 +4126,6 @@
40464126 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, obj );
40474127 volatile VALUE temp;
40484128 DXRUBY_CHECK_DISPOSE( rt, surface );
4049-// DXRUBY_CHECK_IMAGE_LOCK( rt );
40504129
40514130 if( argc < 4 || argc > 7 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 4, 7 );
40524131
@@ -4080,9 +4159,6 @@
40804159 /* RenderTargetだった場合に描画予約があればupdateする */
40814160 RenderTerget_auto_update( argv[2] );
40824161
4083- /* 使われたimageのロック */
4084-// image->lockcount++;
4085-
40864162 return obj;
40874163 }
40884164
@@ -4098,7 +4174,6 @@
40984174 volatile VALUE temp;
40994175 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, obj );
41004176 DXRUBY_CHECK_DISPOSE( rt, surface );
4101-// DXRUBY_CHECK_IMAGE_LOCK( rt );
41024177
41034178 if( argc < 3 || argc > 4 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 3, 4 );
41044179
@@ -4182,9 +4257,6 @@
41824257 /* RenderTargetだった場合に描画予約があればupdateする */
41834258 RenderTerget_auto_update( argv[2] );
41844259
4185- /* 使われたimageのロック */
4186-// image->lockcount++;
4187-
41884260 return obj;
41894261 }
41904262
@@ -4256,7 +4328,6 @@
42564328 volatile VALUE temp;
42574329
42584330 DXRUBY_CHECK_DISPOSE( rt, surface );
4259-// DXRUBY_CHECK_IMAGE_LOCK( rt );
42604331
42614332 if( argc < 4 || argc > 5 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 4, 5 );
42624333 Check_Type(argv[2], T_STRING);
@@ -4368,7 +4439,6 @@
43684439 VALUE vimage, voption, vedge_width, vedge, vshadow;
43694440
43704441 DXRUBY_CHECK_DISPOSE( rt, surface );
4371-// DXRUBY_CHECK_IMAGE_LOCK( rt );
43724442 DXRUBY_CHECK_TYPE( Font, argv[3] );
43734443
43744444 if( argc < 4 || argc > 5 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 4, 5 );
@@ -4558,9 +4628,6 @@
45584628 {
45594629 g_pD3DDevice->lpVtbl->SetTextureStageState( g_pD3DDevice, 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
45604630 }
4561-
4562- /* ロックカウントを減らす */
4563-// image->lockcount--;
45644631 }
45654632
45664633 /*--------------------------------------------------------------------
@@ -4575,7 +4642,6 @@
45754642 VALUE vz, vdividex, vdividey, valpha, vblend, vcolor;
45764643 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, obj );
45774644 DXRUBY_CHECK_DISPOSE( rt, surface );
4578-// DXRUBY_CHECK_IMAGE_LOCK( rt );
45794645
45804646 if( argc < 9 || argc > 10 ) rb_raise( rb_eArgError, "wrong number of arguments (%d for %d..%d)", argc, 9, 10 );
45814647
@@ -4626,7 +4692,7 @@
46264692
46274693 if( picture->dividex <= 0 || picture->dividey <= 0 )
46284694 {
4629- rb_raise( eDXRubyError, "分割数に0以下は指定できません");
4695+ rb_raise( eDXRubyError, "parameter is invalid(dividex or dividey) - RenderTarget#draw_morph");
46304696 }
46314697
46324698 if( vcolor != Qnil )
@@ -4663,9 +4729,6 @@
46634729 /* RenderTargetだった場合に描画予約があればupdateする */
46644730 RenderTerget_auto_update( argv[8] );
46654731
4666- /* 使われたimageのロック */
4667-// image->lockcount++;
4668-
46694732 return obj;
46704733 }
46714734
@@ -4747,7 +4810,7 @@
47474810 {
47484811 index = NUM2INT( arr2[mx] );
47494812
4750- if( index >= RARRAY_LEN( vmapdata ) ) rb_raise(eDXRubyError, "マップチップ番号がイメージ配列の範囲を超えています - Window_drawTile");
4813+ if( index >= RARRAY_LEN( vmapdata ) ) rb_raise(eDXRubyError, "invalid MapChipNumber - RenderTarget#draw_tile");
47514814
47524815 /* イメージオブジェクトから中身を取り出す */
47534816 image = (struct DXRubyImage *)DATA_PTR( mapdata[index] );
@@ -4784,12 +4847,6 @@
47844847 }
47854848 y = y + height;
47864849 }
4787-
4788- /* ロックカウントを減らす */
4789-// for( i = 0; i < RARRAY_LEN( vmapdata ); i++ )
4790-// {
4791-// DXRUBY_GET_STRUCT( Image, mapdata[i] )->lockcount--;
4792-// }
47934850 }
47944851
47954852 /*--------------------------------------------------------------------
@@ -4806,7 +4863,6 @@
48064863 int i;
48074864
48084865 DXRUBY_CHECK_DISPOSE( rt, surface );
4809-// DXRUBY_CHECK_IMAGE_LOCK( rt );
48104866
48114867 rb_scan_args( argc, argv, "81", &vbasex, &vbasey, &vmap, &vmapdata, &vstartx, &vstarty, &vsizex, &vsizey, &vz );
48124868
@@ -4823,9 +4879,6 @@
48234879
48244880 /* RenderTargetだった場合に描画予約があればupdateする */
48254881 RenderTerget_auto_update( RARRAY_AREF(vmapdata_f, i) );
4826-
4827- /* 使われたimageのロック */
4828-// image->lockcount++;
48294882 }
48304883
48314884 picture = (struct DXRubyPicture_drawTile *)RenderTarget_AllocPictureList( rt, sizeof( struct DXRubyPicture_drawTile ) );
@@ -4898,6 +4951,167 @@
48984951 }
48994952
49004953
4954+void RenderTarget_update_internal(struct DXRubyRenderTarget *rt, D3DVIEWPORT9 *old_viewport, D3DMATRIX *old_matrix_view, D3DMATRIX *old_matrix_proj, int dx, int dy )
4955+{
4956+ int i;
4957+ int oldflag = -1;
4958+
4959+ RenderTarget_SortPictureList( rt );
4960+
4961+ for( i = 0; i < rt->PictureCount; i++ )
4962+ {
4963+ struct DXRubyPicture_draw *temp = (struct DXRubyPicture_draw *)rt->PictureList[i].picture;
4964+
4965+ /* 描画対象がViewportオブジェクトの場合、再帰呼び出ししてViewport内の描画予約を処理する */
4966+ if( DXRUBY_CHECK( Viewport, temp->value ) )
4967+ {
4968+ struct DXRubyViewport *vp = DXRUBY_GET_STRUCT( Viewport, temp->value );
4969+ D3DVIEWPORT9 viewport;
4970+ D3DMATRIX matrix_view, matrix_t, matrix_proj;
4971+ int new_x = dx + temp->x;
4972+ int new_y = dy + temp->y;
4973+ /* DirectXのViewportを設定 */
4974+ if( old_viewport->X < new_x )
4975+ {
4976+ viewport.X = new_x;
4977+ if( old_viewport->X + old_viewport->Width > new_x + vp->width )
4978+ {
4979+ viewport.Width = vp->width;
4980+ }
4981+ else
4982+ {
4983+ viewport.Width = old_viewport->X + old_viewport->Width - new_x;
4984+ }
4985+ }
4986+ else
4987+ {
4988+ viewport.X = old_viewport->X;
4989+ if( old_viewport->X + old_viewport->Width < new_x + vp->width )
4990+ {
4991+ viewport.Width = old_viewport->Width;
4992+ }
4993+ else
4994+ {
4995+ viewport.Width = new_x + vp->width - old_viewport->X;
4996+ }
4997+ }
4998+// printf("old_x = %d\n", old_viewport->X);
4999+// printf("new_x = %d\n", new_x);
5000+// printf("vp_x = %d\n", viewport.X);
5001+// printf("old_w = %d\n", old_viewport->Width);
5002+// printf("vp_w = %d\n", viewport.Width);
5003+
5004+ if( old_viewport->Y < new_y )
5005+ {
5006+ viewport.Y = new_y;
5007+ if( old_viewport->Y + old_viewport->Height > new_y + vp->height )
5008+ {
5009+ viewport.Height = vp->height;
5010+ }
5011+ else
5012+ {
5013+ viewport.Height = old_viewport->Y + old_viewport->Height - new_y;
5014+ }
5015+ }
5016+ else
5017+ {
5018+ viewport.Y = old_viewport->Y;
5019+ if( old_viewport->Y + old_viewport->Height < new_y + vp->height )
5020+ {
5021+ viewport.Height = old_viewport->Height;
5022+ }
5023+ else
5024+ {
5025+ viewport.Height = new_y + vp->height - old_viewport->Y;
5026+ }
5027+ }
5028+// printf("old_y = %d\n", old_viewport->Y);
5029+// printf("new_y = %d\n", new_y);
5030+// printf("vp_y = %d\n", viewport.Y);
5031+// printf("old_h = %d\n", old_viewport->Height);
5032+// printf("vp_h = %d\n", viewport.Height);
5033+ viewport.MinZ = 0.0f;
5034+ viewport.MaxZ = 1.0f;
5035+
5036+ /* DirectXのビュー行列、射影行列を設定 */
5037+ D3DXMatrixScaling ( &matrix_view, 1, -1, 1 );
5038+ D3DXMatrixTranslation( &matrix_t, (float)-((int)viewport.Width)/2.0f, (float)((int)viewport.Height)/2.0f, 0 );
5039+ D3DXMatrixMultiply( &matrix_view, &matrix_view, &matrix_t );
5040+ g_pD3DDevice->lpVtbl->SetTransform( g_pD3DDevice, D3DTS_VIEW, &matrix_view );
5041+ matrix_proj._11 = 2.0f / viewport.Width;
5042+ matrix_proj._12 = matrix_proj._13 = matrix_proj._14 = 0;
5043+ matrix_proj._22 = 2.0f / viewport.Height;
5044+ matrix_proj._21 = matrix_proj._23 = matrix_proj._24 = 0;
5045+ matrix_proj._31 = matrix_proj._32 = 0;matrix_proj._33 = 0; matrix_proj._34 = 0;
5046+ matrix_proj._41 = matrix_proj._42 = 0;matrix_proj._43 = 1; matrix_proj._44 = 1;
5047+ g_pD3DDevice->lpVtbl->SetTransform( g_pD3DDevice, D3DTS_PROJECTION, &matrix_proj );
5048+
5049+ g_pD3DDevice->lpVtbl->SetViewport( g_pD3DDevice, &viewport );
5050+
5051+ /* 再帰呼び出し */
5052+ RenderTarget_update_internal( (struct DXRubyRenderTarget *)vp, &viewport, &matrix_view, &matrix_proj, new_x, new_y );
5053+
5054+ /* DirectXの行列とViewportを戻す */
5055+ g_pD3DDevice->lpVtbl->SetTransform( g_pD3DDevice, D3DTS_VIEW, old_matrix_view );
5056+ g_pD3DDevice->lpVtbl->SetTransform( g_pD3DDevice, D3DTS_PROJECTION, old_matrix_proj );
5057+ g_pD3DDevice->lpVtbl->SetViewport( g_pD3DDevice, old_viewport );
5058+
5059+ continue;
5060+ }
5061+
5062+ if( temp->blendflag != oldflag )
5063+ {
5064+ switch( temp->blendflag )
5065+ {
5066+ case 0: /* 半透明合成 */
5067+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
5068+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
5069+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5070+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
5071+ break;
5072+ case 1: /* 単純上書き */
5073+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_ONE );
5074+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_ZERO );
5075+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5076+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_ZERO );
5077+ break;
5078+ case 4: /* 加算合成1の設定 */
5079+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
5080+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_ONE );
5081+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5082+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
5083+ break;
5084+ case 5: /* 加算合成2の設定 */
5085+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_ONE );
5086+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
5087+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5088+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
5089+ break;
5090+ case 6: /* 減算合成1の設定 */
5091+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_ZERO );
5092+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
5093+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5094+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
5095+ break;
5096+ case 7: /* 減算合成2の設定 */
5097+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_ZERO );
5098+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR );
5099+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5100+ g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
5101+ break;
5102+ }
5103+ }
5104+
5105+ oldflag = temp->blendflag;
5106+ temp->func( temp );
5107+ }
5108+
5109+ rt->PictureCount = 0;
5110+ rt->PictureSize = 0;
5111+ rt->PictureDecideCount = 0;
5112+ rt->PictureDecideSize = 0;
5113+}
5114+
49015115 /*--------------------------------------------------------------------
49025116 RenderTarget更新
49035117 ---------------------------------------------------------------------*/
@@ -4908,12 +5122,12 @@
49085122 int y_2d, height_2d;
49095123 struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, self ); /* 出力先 */
49105124 int i;
5125+ D3DVIEWPORT9 vp;
49115126
49125127 DXRUBY_CHECK_DISPOSE( rt, surface );
49135128
49145129 /* シーンのクリア */
49155130 {
4916- D3DVIEWPORT9 vp;
49175131 vp.X = x_2d = 0;
49185132 vp.Y = y_2d = 0;
49195133 if( rt->texture == NULL )
@@ -4925,22 +5139,14 @@
49255139 {
49265140 vp.Width = width_2d = (int)rt->texture->width;
49275141 vp.Height = height_2d = (int)rt->texture->height;
4928- rt->clearflag = 1;
5142+ rt->clearflag = 0;
49295143 }
49305144 vp.MinZ = 0.0f;
49315145 vp.MaxZ = 1.0f;
49325146 g_pD3DDevice->lpVtbl->SetRenderTarget( g_pD3DDevice, 0, rt->surface );
49335147 g_pD3DDevice->lpVtbl->SetViewport( g_pD3DDevice, &vp );
4934-#ifdef DXRUBY15
4935- if( rt->vregenerate_proc == Qnil )
4936- {
4937- g_pD3DDevice->lpVtbl->Clear( g_pD3DDevice, 0, NULL, D3DCLEAR_TARGET,
4938- D3DCOLOR_ARGB( rt->a, rt->r, rt->g, rt->b ), 1.0f, 0 );
4939- }
4940-#else
49415148 g_pD3DDevice->lpVtbl->Clear( g_pD3DDevice, 0, NULL, D3DCLEAR_TARGET,
49425149 D3DCOLOR_ARGB( rt->a, rt->r, rt->g, rt->b ), 1.0f, 0 );
4943-#endif
49445150 }
49455151
49465152 /* シーンの描画開始 */
@@ -4986,74 +5192,22 @@
49865192
49875193 if( rt->PictureCount > 0 )
49885194 {
4989- D3DMATRIX matrix, matrix_t;
4990- int oldflag = 0;
5195+ D3DMATRIX matrix_view, matrix_t, matrix_proj;
49915196
4992- RenderTarget_SortPictureList( rt );
4993-
4994- /* 2D描画 */
4995- D3DXMatrixScaling ( &matrix, 1, -1, 1 );
5197+ /* 2D描画行列 */
5198+ D3DXMatrixScaling ( &matrix_view, 1, -1, 1 );
49965199 D3DXMatrixTranslation( &matrix_t, (float)-(width_2d)/2.0f, (float)(height_2d)/2.0f, 0 );
4997- D3DXMatrixMultiply( &matrix, &matrix, &matrix_t );
4998- g_pD3DDevice->lpVtbl->SetTransform( g_pD3DDevice, D3DTS_VIEW, &matrix );
4999- matrix._11 = 2.0f / width_2d;
5000- matrix._12 = matrix._13 = matrix._14 = 0;
5001- matrix._22 = 2.0f / height_2d;
5002- matrix._21 = matrix._23 = matrix._24 = 0;
5003- matrix._31 = matrix._32 = 0;matrix._33 = 0; matrix._34 = 0;
5004- matrix._41 = matrix._42 = 0;matrix._43 = 1; matrix._44 = 1;
5005- g_pD3DDevice->lpVtbl->SetTransform( g_pD3DDevice, D3DTS_PROJECTION, &matrix );
5200+ D3DXMatrixMultiply( &matrix_view, &matrix_view, &matrix_t );
5201+ g_pD3DDevice->lpVtbl->SetTransform( g_pD3DDevice, D3DTS_VIEW, &matrix_view );
5202+ matrix_proj._11 = 2.0f / width_2d;
5203+ matrix_proj._12 = matrix_proj._13 = matrix_proj._14 = 0;
5204+ matrix_proj._22 = 2.0f / height_2d;
5205+ matrix_proj._21 = matrix_proj._23 = matrix_proj._24 = 0;
5206+ matrix_proj._31 = matrix_proj._32 = 0;matrix_proj._33 = 0; matrix_proj._34 = 0;
5207+ matrix_proj._41 = matrix_proj._42 = 0;matrix_proj._43 = 1; matrix_proj._44 = 1;
5208+ g_pD3DDevice->lpVtbl->SetTransform( g_pD3DDevice, D3DTS_PROJECTION, &matrix_proj );
50065209
5007- for( i = 0; i < rt->PictureCount; i++ )
5008- {
5009- struct DXRubyPicture_draw *temp = (struct DXRubyPicture_draw *)rt->PictureList[i].picture;
5010-
5011- if( temp->blendflag != oldflag )
5012- {
5013- switch( temp->blendflag )
5014- {
5015- case 0: /* 半透明合成 */
5016- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
5017- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
5018- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5019- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
5020- break;
5021- case 1: /* 単純上書き */
5022- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_ONE );
5023- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_ZERO );
5024- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5025- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_ZERO );
5026- break;
5027- case 4: /* 加算合成1の設定 */
5028- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_SRCALPHA );
5029- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_ONE );
5030- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5031- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
5032- break;
5033- case 5: /* 加算合成2の設定 */
5034- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_ONE );
5035- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
5036- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5037- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
5038- break;
5039- case 6: /* 減算合成1の設定 */
5040- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_ZERO );
5041- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA );
5042- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5043- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
5044- break;
5045- case 7: /* 減算合成2の設定 */
5046- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLEND, D3DBLEND_ZERO );
5047- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLEND, D3DBLEND_INVSRCCOLOR );
5048- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_SRCBLENDALPHA, D3DBLEND_ONE );
5049- g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, D3DRS_DESTBLENDALPHA, D3DBLEND_INVSRCALPHA );
5050- break;
5051- }
5052- }
5053-
5054- oldflag = temp->blendflag;
5055- temp->func( temp );
5056- }
5210+ RenderTarget_update_internal( rt, &vp, &matrix_view, &matrix_proj, 0, 0 );
50575211 }
50585212
50595213 /* シーンの描画終了 */
@@ -5141,32 +5295,7 @@
51415295 }
51425296
51435297
5144-#ifdef DXRUBY15
51455298 /*--------------------------------------------------------------------
5146- 再生成Proc取得
5147- ---------------------------------------------------------------------*/
5148-static VALUE RenderTarget_getRegenerateProc( VALUE self )
5149-{
5150- struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, self );
5151- DXRUBY_CHECK_DISPOSE( rt, surface );
5152- return rt->vregenerate_proc;
5153-}
5154-
5155-
5156-/*--------------------------------------------------------------------
5157- 再生成Proc設定
5158- ---------------------------------------------------------------------*/
5159-static VALUE RenderTarget_setRegenerateProc( VALUE self, VALUE vregenerate_proc )
5160-{
5161- struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, self );
5162- DXRUBY_CHECK_DISPOSE( rt, surface );
5163- rt->vregenerate_proc = vregenerate_proc;
5164- return vregenerate_proc;
5165-}
5166-#endif
5167-
5168-
5169-/*--------------------------------------------------------------------
51705299 (内部関数)フレーム調整初期化
51715300 ---------------------------------------------------------------------*/
51725301 static void InitSync( void )
@@ -5192,7 +5321,557 @@
51925321
51935322
51945323
5324+/*********************************************************************
5325+ * VertexBufferクラス
5326+ *
5327+ * 頂点バッファを管理する
5328+ *********************************************************************/
51955329
5330+/*--------------------------------------------------------------------
5331+ 参照されなくなったときにGCから呼ばれる関数
5332+ ---------------------------------------------------------------------*/
5333+static void VertexBuffer_free( struct DXRubyVertexBuffer *vb)
5334+{
5335+ if( vb->pVertexBuffer != (LPDIRECT3DVERTEXBUFFER9)vb )
5336+ {
5337+ RELEASE( vb->pVertexBuffer );
5338+ }
5339+ vb->pVertexBuffer = 0;
5340+ vb->vtype = Qnil;
5341+}
5342+
5343+void VertexBuffer_release( struct DXRubyVertexBuffer *vb )
5344+{
5345+ if( vb->pVertexBuffer )
5346+ {
5347+ VertexBuffer_free( vb );
5348+ }
5349+ free( vb );
5350+
5351+ g_iRefAll--;
5352+ if( g_iRefAll == 0 )
5353+ {
5354+ CoUninitialize();
5355+ }
5356+}
5357+
5358+/*--------------------------------------------------------------------
5359+ GCから呼ばれるマーク関数
5360+ ---------------------------------------------------------------------*/
5361+static void VertexBuffer_mark( struct DXRubyVertexBuffer *vb )
5362+{
5363+ rb_gc_mark( vb->vtype );
5364+}
5365+
5366+#ifdef DXRUBY_USE_TYPEDDATA
5367+const rb_data_type_t VertexBuffer_data_type = {
5368+ "VertexBuffer",
5369+ {
5370+ VertexBuffer_mark,
5371+ VertexBuffer_release,
5372+ 0,
5373+ },
5374+ NULL, NULL
5375+};
5376+#endif
5377+
5378+/*--------------------------------------------------------------------
5379+ VertexBufferクラスのdispose。
5380+ ---------------------------------------------------------------------*/
5381+static VALUE VertexBuffer_dispose( VALUE self )
5382+{
5383+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, self );
5384+ DXRUBY_CHECK_DISPOSE( vb, pVertexBuffer );
5385+ VertexBuffer_free( vb );
5386+ return Qnil;
5387+}
5388+
5389+/*--------------------------------------------------------------------
5390+ VertexBufferクラスのdisposed?。
5391+ ---------------------------------------------------------------------*/
5392+static VALUE VertexBuffer_check_disposed( VALUE self )
5393+{
5394+ if( DXRUBY_GET_STRUCT( VertexBuffer, self )->pVertexBuffer == NULL )
5395+ {
5396+ return Qtrue;
5397+ }
5398+
5399+ return Qfalse;
5400+}
5401+
5402+/*--------------------------------------------------------------------
5403+ VertexBufferクラスのallocate。メモリを確保する為にinitialize前に呼ばれる。
5404+ ---------------------------------------------------------------------*/
5405+static VALUE VertexBuffer_allocate( VALUE klass )
5406+{
5407+ VALUE obj;
5408+ struct DXRubyVertexBuffer *vb;
5409+
5410+ /* DXRubyVertexBufferのメモリ取得&VertexBufferオブジェクト生成 */
5411+ vb = malloc( sizeof( struct DXRubyVertexBuffer ) );
5412+ if( vb == NULL ) rb_raise( eDXRubyError, "Memory allocate error. - VertexBuffer_allocate" );
5413+#ifdef DXRUBY_USE_TYPEDDATA
5414+ obj = TypedData_Wrap_Struct( klass, &VertexBuffer_data_type, vb );
5415+#else
5416+ obj = Data_Wrap_Struct( klass, VertexBuffer_mark, VertexBuffer_release, vb );
5417+#endif
5418+ /* 未初期化(かつ未回収)を判別するためpVertexBufferには自分自身のポインタを入れておく。回収されたらNULLになる。 */
5419+ vb->pVertexBuffer = (LPDIRECT3DVERTEXBUFFER9)vb;
5420+ vb->vtype = Qnil;
5421+ vb->vertex_size = 0;
5422+
5423+ return obj;
5424+}
5425+
5426+
5427+/*--------------------------------------------------------------------
5428+ VertexBufferクラスのInitialize
5429+ ---------------------------------------------------------------------*/
5430+ static VALUE VertexBuffer_initialize( VALUE self, VALUE vtype )
5431+{
5432+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, self );
5433+ int vertex_size = 0;
5434+ int vertex_num_count = 0;
5435+ int i;
5436+
5437+ Check_Type( vtype, T_ARRAY );
5438+
5439+ for( i = 0; i < RARRAY_LEN(vtype); i++) {
5440+ VALUE vtypeary = rb_ary_entry(vtype, i);
5441+ Check_Type( vtypeary, T_ARRAY );
5442+
5443+ switch(NUM2INT(rb_ary_entry(vtypeary, 0))) {
5444+ case D3DDECLTYPE_FLOAT1:
5445+ vertex_size += 4;
5446+ vertex_num_count += 1;
5447+ break;
5448+ case D3DDECLTYPE_UBYTE4:
5449+ vertex_size += 4;
5450+ vertex_num_count += 4;
5451+ break;
5452+ case D3DDECLTYPE_FLOAT2:
5453+ vertex_size += 8;
5454+ vertex_num_count += 2;
5455+ break;
5456+ case D3DDECLTYPE_FLOAT3:
5457+ vertex_size += 12;
5458+ vertex_num_count += 3;
5459+ break;
5460+ case D3DDECLTYPE_FLOAT4:
5461+ vertex_size += 16;
5462+ vertex_num_count += 4;
5463+ break;
5464+ case D3DDECLTYPE_D3DCOLOR:
5465+ vertex_size += 4;
5466+ vertex_num_count += 1;
5467+ break;
5468+ default:
5469+ rb_raise( eDXRubyError, "No support D3DDECLTYPE. - VertexBuffer_initialize" );
5470+ break;
5471+ }
5472+ }
5473+
5474+ vb->vtype = vtype;
5475+ vb->vertex_size = vertex_size;
5476+ vb->vertex_num_count = vertex_num_count;
5477+
5478+ return self;
5479+}
5480+
5481+
5482+static VALUE VertexBuffer_set_buf( VALUE self, VALUE vstr )
5483+{
5484+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, self );
5485+ void *p;
5486+
5487+ DXRUBY_CHECK_DISPOSE( vb, pVertexBuffer );
5488+ Check_Type( vstr, T_STRING );
5489+
5490+ if( vb->pVertexBuffer == (LPDIRECT3DVERTEXBUFFER9)vb ) /* 未初期化 */
5491+ {
5492+ g_iRefAll++;
5493+ }
5494+ else /* 初期化済の再割り当て */
5495+ {
5496+ RELEASE( vb->pVertexBuffer );
5497+ }
5498+
5499+ g_pD3DDevice->lpVtbl->CreateVertexBuffer( g_pD3DDevice, RSTRING_LEN(vstr), 0, 0, D3DPOOL_MANAGED, &vb->pVertexBuffer, NULL );
5500+
5501+ vb->pVertexBuffer->lpVtbl->Lock( vb->pVertexBuffer, 0, 0, &p, 0 );
5502+
5503+ memcpy( p, RSTRING_PTR(vstr), RSTRING_LEN(vstr) );
5504+
5505+ vb->pVertexBuffer->lpVtbl->Unlock( vb->pVertexBuffer );
5506+
5507+ return vstr;
5508+}
5509+
5510+static VALUE VertexBuffer_get_buf( VALUE self )
5511+{
5512+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, self );
5513+ VALUE vstr;
5514+ void *p;
5515+ D3DVERTEXBUFFER_DESC desc;
5516+
5517+ DXRUBY_CHECK_DISPOSE( vb, pVertexBuffer );
5518+ vb->pVertexBuffer->lpVtbl->GetDesc( vb->pVertexBuffer, &desc );
5519+
5520+ vb->pVertexBuffer->lpVtbl->Lock( vb->pVertexBuffer, 0, 0, &p, 0 );
5521+ vstr = rb_str_new( p, desc.Size );
5522+ vb->pVertexBuffer->lpVtbl->Unlock( vb->pVertexBuffer );
5523+
5524+ return vstr;
5525+}
5526+
5527+static VALUE VertexBuffer_set_vertices( VALUE self, VALUE vary )
5528+{
5529+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, self );
5530+ char *p;
5531+ int vertex_count, size, i, j, k;
5532+
5533+ DXRUBY_CHECK_DISPOSE( vb, pVertexBuffer );
5534+ Check_Type( vary, T_ARRAY );
5535+
5536+ if( vb->pVertexBuffer == (LPDIRECT3DVERTEXBUFFER9)vb ) /* 未初期化 */
5537+ {
5538+ g_iRefAll++;
5539+ }
5540+ else /* 初期化済の再割り当て */
5541+ {
5542+ RELEASE( vb->pVertexBuffer );
5543+ }
5544+
5545+ /* 頂点の数 */
5546+ vertex_count = RARRAY_LEN(vary) / vb->vertex_num_count;
5547+
5548+ /* 頂点バッファに必要なバイト数算出 */
5549+ size = vertex_count * vb->vertex_size;
5550+
5551+ /* 頂点バッファ生成 */
5552+ g_pD3DDevice->lpVtbl->CreateVertexBuffer( g_pD3DDevice, size, 0, 0, D3DPOOL_MANAGED, &vb->pVertexBuffer, NULL );
5553+
5554+ vb->pVertexBuffer->lpVtbl->Lock( vb->pVertexBuffer, 0, 0, &(void*)p, 0 );
5555+
5556+ k = 0;
5557+ for( i = 0; i < vertex_count; i++ )
5558+ {
5559+ for( j = 0; j < RARRAY_LEN(vb->vtype); j++ )
5560+ {
5561+ VALUE vtypeary = rb_ary_entry(vb->vtype, j);
5562+ switch(NUM2INT(rb_ary_entry(vtypeary, 0))) {
5563+ case D3DDECLTYPE_FLOAT1:
5564+ *(float*)p = NUM2FLOAT(rb_ary_entry(vary, k));
5565+ k++;
5566+ p += 4;
5567+ break;
5568+ case D3DDECLTYPE_UBYTE4:
5569+ *(unsigned char*)p = (unsigned char)NUM2UINT(rb_ary_entry(vary, k));
5570+ k++;
5571+ p += 1;
5572+ *(unsigned char*)p = (unsigned char)NUM2UINT(rb_ary_entry(vary, k));
5573+ k++;
5574+ p += 1;
5575+ *(unsigned char*)p = (unsigned char)NUM2UINT(rb_ary_entry(vary, k));
5576+ k++;
5577+ p += 1;
5578+ *(unsigned char*)p = (unsigned char)NUM2UINT(rb_ary_entry(vary, k));
5579+ k++;
5580+ p += 1;
5581+ break;
5582+ case D3DDECLTYPE_FLOAT2:
5583+ *(float*)p = NUM2FLOAT(rb_ary_entry(vary, k));
5584+ p += 4;
5585+ k++;
5586+ *(float*)p = NUM2FLOAT(rb_ary_entry(vary, k));
5587+ k++;
5588+ p += 4;
5589+ break;
5590+ case D3DDECLTYPE_FLOAT3:
5591+ *(float*)p = NUM2FLOAT(rb_ary_entry(vary, k));
5592+ p += 4;
5593+ k++;
5594+ *(float*)p = NUM2FLOAT(rb_ary_entry(vary, k));
5595+ k++;
5596+ p += 4;
5597+ *(float*)p = NUM2FLOAT(rb_ary_entry(vary, k));
5598+ k++;
5599+ p += 4;
5600+ break;
5601+ case D3DDECLTYPE_FLOAT4:
5602+ *(float*)p = NUM2FLOAT(rb_ary_entry(vary, k));
5603+ k++;
5604+ p += 4;
5605+ *(float*)p = NUM2FLOAT(rb_ary_entry(vary, k));
5606+ k++;
5607+ p += 4;
5608+ *(float*)p = NUM2FLOAT(rb_ary_entry(vary, k));
5609+ k++;
5610+ p += 4;
5611+ *(float*)p = NUM2FLOAT(rb_ary_entry(vary, k));
5612+ k++;
5613+ p += 4;
5614+ break;
5615+ case D3DDECLTYPE_D3DCOLOR:
5616+ *(unsigned int*)p = NUM2UINT(rb_ary_entry(vary, k));
5617+ k++;
5618+ p += 4;
5619+ break;
5620+ default:
5621+ break;
5622+ }
5623+ }
5624+
5625+ }
5626+
5627+ vb->pVertexBuffer->lpVtbl->Unlock( vb->pVertexBuffer );
5628+
5629+ return vary;
5630+}
5631+
5632+static VALUE VertexBuffer_get_vertices( VALUE self )
5633+{
5634+ // struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, self );
5635+ // VALUE vstr;
5636+ // void *p;
5637+ // D3DVERTEXBUFFER_DESC desc;
5638+
5639+ // DXRUBY_CHECK_DISPOSE( vb, pVertexBuffer );
5640+ // vb->pVertexBuffer->lpVtbl->GetDesc( vb->pVertexBuffer, &desc );
5641+
5642+ // vb->pVertexBuffer->lpVtbl->Lock( vb->pVertexBuffer, 0, 0, &p, 0 );
5643+ // vstr = rb_str_new( p, desc.Size );
5644+ // vb->pVertexBuffer->lpVtbl->Unlock( vb->pVertexBuffer );
5645+
5646+ // return vstr;
5647+ return self;
5648+}
5649+
5650+static VALUE VertexBuffer_get_size( VALUE self )
5651+{
5652+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, self );
5653+ D3DVERTEXBUFFER_DESC desc;
5654+ DXRUBY_CHECK_DISPOSE( vb, pVertexBuffer );
5655+
5656+ vb->pVertexBuffer->lpVtbl->GetDesc( vb->pVertexBuffer, &desc );
5657+ return INT2NUM(desc.Size);
5658+}
5659+
5660+static VALUE VertexBuffer_get_vertex_type( VALUE self )
5661+{
5662+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, self );
5663+ DXRUBY_CHECK_DISPOSE( vb, pVertexBuffer );
5664+ return vb->vtype;
5665+}
5666+
5667+static VALUE VertexBuffer_get_vertex_count( VALUE self )
5668+{
5669+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, self );
5670+ D3DVERTEXBUFFER_DESC desc;
5671+ DXRUBY_CHECK_DISPOSE( vb, pVertexBuffer );
5672+
5673+ vb->pVertexBuffer->lpVtbl->GetDesc( vb->pVertexBuffer, &desc );
5674+ return INT2NUM(desc.Size / vb->vertex_size);
5675+}
5676+
5677+
5678+
5679+/*********************************************************************
5680+ * CustomRenderTargetクラス
5681+ *
5682+ * 描画周りの処理をRubyで記述できる低レベルRenderTarget。
5683+ *********************************************************************/
5684+
5685+/*--------------------------------------------------------------------
5686+ CustomRenderTarget更新
5687+ ---------------------------------------------------------------------*/
5688+VALUE CustomRenderTarget_update( VALUE self )
5689+{
5690+ struct DXRubyRenderTarget *rt = DXRUBY_GET_STRUCT( RenderTarget, self );
5691+ DXRUBY_CHECK_DISPOSE( rt, surface );
5692+ RenderTarget_clear( self );
5693+ g_pD3DDevice->lpVtbl->Clear( g_pD3DDevice, 0, NULL, D3DCLEAR_TARGET | D3DCLEAR_STENCIL | D3DCLEAR_ZBUFFER,
5694+ D3DCOLOR_ARGB( rt->a, rt->r, rt->g, rt->b ), 1.0f, 0 );
5695+
5696+ rb_funcall( self, SYM2ID( symbol_custom_render ), 1, mLowLevelInterface );
5697+
5698+ rt->PictureCount = 0;
5699+ rt->PictureSize = 0;
5700+ rt->PictureDecideCount = 0;
5701+ rt->PictureDecideSize = 0;
5702+
5703+ return Qnil;
5704+}
5705+
5706+VALUE LLI_set_viewport( VALUE obj, VALUE vx, VALUE vy, VALUE vwidth, VALUE vheight, VALUE vminz, VALUE vmaxz )
5707+{
5708+ D3DVIEWPORT9 vp;
5709+
5710+ vp.X = NUM2INT(vx);
5711+ vp.Y = NUM2INT(vy);
5712+ vp.Width = NUM2INT(vwidth);
5713+ vp.Height = NUM2INT(vheight);
5714+ vp.MinZ = NUM2FLOAT(vminz);
5715+ vp.MaxZ = NUM2FLOAT(vmaxz);
5716+
5717+ return UINT2NUM(g_pD3DDevice->lpVtbl->SetViewport( g_pD3DDevice, &vp ));
5718+}
5719+
5720+VALUE LLI_begin_scene( VALUE obj )
5721+{
5722+ return UINT2NUM(g_pD3DDevice->lpVtbl->BeginScene( g_pD3DDevice ));
5723+}
5724+
5725+VALUE LLI_end_scene( VALUE obj )
5726+{
5727+ return UINT2NUM(g_pD3DDevice->lpVtbl->EndScene( g_pD3DDevice ));
5728+}
5729+
5730+VALUE LLI_set_fvf( VALUE obj, VALUE vfvf )
5731+{
5732+ return UINT2NUM(g_pD3DDevice->lpVtbl->SetFVF( g_pD3DDevice, NUM2UINT(vfvf) ));
5733+}
5734+
5735+VALUE LLI_set_stream( int argc, VALUE *argv, VALUE obj )
5736+{
5737+ int i, size;
5738+
5739+ /* 引数は全て頂点バッファであり、disposeされておらず、初期化されていること */
5740+ for( i = 0; i < argc; i++ )
5741+ {
5742+ struct DXRubyVertexBuffer *vb;
5743+ DXRUBY_CHECK_TYPE( VertexBuffer, argv[i] );
5744+ vb = DXRUBY_GET_STRUCT( VertexBuffer, argv[i] );
5745+ DXRUBY_CHECK_DISPOSE( vb, pVertexBuffer );
5746+ if( vb->pVertexBuffer == (LPDIRECT3DVERTEXBUFFER9)vb ) rb_raise( eDXRubyError, "VertexBuffer object is not initialize. - LLI_set_stream" );
5747+ }
5748+
5749+ size = 0;
5750+
5751+ /* エレメント構造体の必要サイズを算出する */
5752+ for( i = 0; i < argc; i++ )
5753+ {
5754+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, argv[i] );
5755+ size += RARRAY_LEN(vb->vtype);
5756+ }
5757+
5758+ {
5759+ int j, k = 0;
5760+ D3DVERTEXELEMENT9 *decl = alloca(sizeof(D3DVERTEXELEMENT9) * (size+1));
5761+
5762+ /* 頂点情報のセット */
5763+ for( i = 0; i < argc; i++ )
5764+ {
5765+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, argv[i] );
5766+ int offset = 0;
5767+
5768+ for( j = 0; j < RARRAY_LEN(vb->vtype); j++ )
5769+ {
5770+ VALUE vtypeary = rb_ary_entry(vb->vtype, j);
5771+ decl[k].Stream = i;
5772+ decl[k].Offset = offset;
5773+ decl[k].Type = NUM2INT(rb_ary_entry(vtypeary, 0));
5774+ decl[k].Method = D3DDECLMETHOD_DEFAULT;
5775+ decl[k].Usage = NUM2INT(rb_ary_entry(vtypeary, 1));
5776+ decl[k].UsageIndex = NUM2INT(rb_ary_entry(vtypeary, 2));
5777+ k++;
5778+
5779+ switch(NUM2INT(rb_ary_entry(vtypeary, 0))) {
5780+ case D3DDECLTYPE_FLOAT1:
5781+ case D3DDECLTYPE_UBYTE4:
5782+ case D3DDECLTYPE_D3DCOLOR:
5783+ offset += 4;
5784+ break;
5785+ case D3DDECLTYPE_FLOAT2:
5786+ offset += 8;
5787+ break;
5788+ case D3DDECLTYPE_FLOAT3:
5789+ offset += 12;
5790+ break;
5791+ case D3DDECLTYPE_FLOAT4:
5792+ offset += 16;
5793+ break;
5794+ default:
5795+ break;
5796+ }
5797+ }
5798+
5799+ }
5800+
5801+ /* 頂点の終端 */
5802+ decl[size].Stream = 0xff;
5803+ decl[size].Offset = 0;
5804+ decl[size].Type = D3DDECLTYPE_UNUSED;
5805+ decl[size].Method = 0;
5806+ decl[size].Usage = 0;
5807+ decl[size].UsageIndex = 0;
5808+
5809+ /* 頂点情報の定義 */
5810+ {
5811+ LPDIRECT3DVERTEXDECLARATION9 pVertexDeclaration;
5812+ g_pD3DDevice->lpVtbl->CreateVertexDeclaration( g_pD3DDevice, decl, &pVertexDeclaration );
5813+ g_pD3DDevice->lpVtbl->SetVertexDeclaration( g_pD3DDevice, pVertexDeclaration );
5814+
5815+ for( i = 0; i < argc; i++ )
5816+ {
5817+ struct DXRubyVertexBuffer *vb = DXRUBY_GET_STRUCT( VertexBuffer, argv[i] );
5818+ g_pD3DDevice->lpVtbl->SetStreamSource( g_pD3DDevice, i, vb->pVertexBuffer, 0, vb->vertex_size );
5819+ }
5820+
5821+ RELEASE( pVertexDeclaration );
5822+ }
5823+ }
5824+
5825+ return Qnil;
5826+}
5827+
5828+VALUE LLI_draw_primitive_up( VALUE obj, VALUE vtype, VALUE vcount, VALUE vstr, VALUE vstride )
5829+{
5830+ Check_Type( vstr, T_STRING );
5831+ return UINT2NUM(g_pD3DDevice->lpVtbl->DrawPrimitiveUP( g_pD3DDevice, NUM2INT(vtype), NUM2UINT(vcount), RSTRING_PTR(vstr), NUM2UINT(vstride) ));
5832+}
5833+
5834+VALUE LLI_draw_primitive( VALUE obj, VALUE vtype, VALUE vcount )
5835+{
5836+ return UINT2NUM(g_pD3DDevice->lpVtbl->DrawPrimitive( g_pD3DDevice, NUM2INT(vtype), 0, NUM2UINT(vcount) ));
5837+}
5838+
5839+VALUE LLI_using_shader( VALUE obj, VALUE vshader )
5840+{
5841+ struct DXRubyShader *shader;
5842+ struct DXRubyShaderCore *core;
5843+ int i, pass;
5844+
5845+ DXRUBY_CHECK_TYPE( Shader, vshader );
5846+
5847+ shader = DXRUBY_GET_STRUCT( Shader, vshader );
5848+ core = DXRUBY_GET_STRUCT( ShaderCore, shader->vcore );
5849+
5850+ DXRUBY_CHECK_DISPOSE( core, pD3DXEffect );
5851+
5852+
5853+ rb_hash_foreach( shader->vparam, Window_drawShader_func_foreach, shader->vcore );
5854+
5855+ core->pD3DXEffect->lpVtbl->Begin( core->pD3DXEffect, &pass, 0 );
5856+ for( i = 0; i < pass; i++ )
5857+ {
5858+ /* 描画 */
5859+ core->pD3DXEffect->lpVtbl->BeginPass( core->pD3DXEffect, i );
5860+ rb_yield( obj );
5861+ core->pD3DXEffect->lpVtbl->EndPass( core->pD3DXEffect );
5862+ }
5863+ core->pD3DXEffect->lpVtbl->End( core->pD3DXEffect );
5864+
5865+ return Qnil;
5866+}
5867+
5868+VALUE LLI_set_render_state( VALUE obj, VALUE vstate, VALUE vvalue )
5869+{
5870+ return UINT2NUM(g_pD3DDevice->lpVtbl->SetRenderState( g_pD3DDevice, NUM2UINT(vstate), NUM2UINT(vvalue) ));
5871+}
5872+
5873+
5874+
51965875 /*
51975876 ***************************************************************
51985877 *
@@ -5340,9 +6019,6 @@
53406019 rb_define_singleton_method( mWindow, "ox=" , Window_setOx , 1 );
53416020 rb_define_singleton_method( mWindow, "oy" , Window_getOy, 0 );
53426021 rb_define_singleton_method( mWindow, "oy=" , Window_setOy, 1 );
5343-#ifdef DXRUBY15
5344- rb_define_singleton_method( mWindow, "test_device_lost" , Window_test_device_lost, 0 );
5345-#endif
53466022 // rb_define_singleton_method( mWindow, "to_image", Window_to_image, 0 );
53476023 // rb_define_singleton_method( mWindow, "toImage", Window_to_image, 0 );
53486024
@@ -5447,12 +6123,6 @@
54476123 rb_define_method( cRenderTarget, "ox=" , RenderTarget_setOx , 1 );
54486124 rb_define_method( cRenderTarget, "oy" , RenderTarget_getOy, 0 );
54496125 rb_define_method( cRenderTarget, "oy=" , RenderTarget_setOy, 1 );
5450-#ifdef DXRUBY15
5451- rb_define_method( cRenderTarget, "regenerate_proc" , RenderTarget_getRegenerateProc , 0 );
5452- rb_define_method( cRenderTarget, "regenerate_proc=", RenderTarget_setRegenerateProc , 1 );
5453- rb_define_method( cRenderTarget, "regenerateProc" , RenderTarget_getRegenerateProc , 0 );
5454- rb_define_method( cRenderTarget, "regenerateProc=", RenderTarget_setRegenerateProc , 1 );
5455-#endif
54566126 rb_define_method( cRenderTarget, "clear" , RenderTarget_clear, 0 );
54576127
54586128 rb_define_method( cRenderTarget, "draw_shader", RenderTarget_drawShader, -1 );
@@ -5463,6 +6133,271 @@
54636133 rb_define_alloc_func( cRenderTarget, RenderTarget_allocate );
54646134
54656135
6136+ /* CustomRenderTargetクラス定義 */
6137+ cCustomRenderTarget = rb_define_class_under( mDXRuby, "CustomRenderTarget", cRenderTarget );
6138+ rb_define_method( cCustomRenderTarget, "update" , CustomRenderTarget_update , 0 );
6139+
6140+ rb_define_const( cCustomRenderTarget, "D3DFVF_RESERVED0", INT2NUM(D3DFVF_RESERVED0));
6141+ rb_define_const( cCustomRenderTarget, "D3DFVF_POSITION_MASK", INT2NUM(D3DFVF_POSITION_MASK));
6142+ rb_define_const( cCustomRenderTarget, "D3DFVF_XYZ", INT2NUM(D3DFVF_XYZ));
6143+ rb_define_const( cCustomRenderTarget, "D3DFVF_XYZRHW", INT2NUM(D3DFVF_XYZRHW));
6144+ rb_define_const( cCustomRenderTarget, "D3DFVF_XYZB1", INT2NUM(D3DFVF_XYZB1));
6145+ rb_define_const( cCustomRenderTarget, "D3DFVF_XYZB2", INT2NUM(D3DFVF_XYZB2));
6146+ rb_define_const( cCustomRenderTarget, "D3DFVF_XYZB3", INT2NUM(D3DFVF_XYZB3));
6147+ rb_define_const( cCustomRenderTarget, "D3DFVF_XYZB4", INT2NUM(D3DFVF_XYZB4));
6148+ rb_define_const( cCustomRenderTarget, "D3DFVF_XYZB5", INT2NUM(D3DFVF_XYZB5));
6149+ rb_define_const( cCustomRenderTarget, "D3DFVF_NORMAL", INT2NUM(D3DFVF_NORMAL));
6150+ rb_define_const( cCustomRenderTarget, "D3DFVF_PSIZE", INT2NUM(D3DFVF_PSIZE));
6151+ rb_define_const( cCustomRenderTarget, "D3DFVF_DIFFUSE", INT2NUM(D3DFVF_DIFFUSE));
6152+ rb_define_const( cCustomRenderTarget, "D3DFVF_SPECULAR", INT2NUM(D3DFVF_SPECULAR));
6153+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEXCOUNT_MASK", INT2NUM(D3DFVF_TEXCOUNT_MASK));
6154+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEXCOUNT_SHIFT", INT2NUM(D3DFVF_TEXCOUNT_SHIFT));
6155+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEX0", INT2NUM(D3DFVF_TEX0));
6156+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEX1", INT2NUM(D3DFVF_TEX1));
6157+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEX2", INT2NUM(D3DFVF_TEX2));
6158+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEX3", INT2NUM(D3DFVF_TEX3));
6159+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEX4", INT2NUM(D3DFVF_TEX4));
6160+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEX5", INT2NUM(D3DFVF_TEX5));
6161+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEX6", INT2NUM(D3DFVF_TEX6));
6162+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEX7", INT2NUM(D3DFVF_TEX7));
6163+ rb_define_const( cCustomRenderTarget, "D3DFVF_TEX8", INT2NUM(D3DFVF_TEX8));
6164+ rb_define_const( cCustomRenderTarget, "D3DFVF_LASTBETA_UBYTE4", INT2NUM(D3DFVF_LASTBETA_UBYTE4));
6165+ rb_define_const( cCustomRenderTarget, "D3DFVF_RESERVED2", INT2NUM(D3DFVF_RESERVED2));
6166+
6167+ rb_define_const( mDXRuby, "D3DDECLTYPE_FLOAT1", INT2NUM(D3DDECLTYPE_FLOAT1));
6168+ rb_define_const( mDXRuby, "D3DDECLTYPE_FLOAT2", INT2NUM(D3DDECLTYPE_FLOAT2));
6169+ rb_define_const( mDXRuby, "D3DDECLTYPE_FLOAT3", INT2NUM(D3DDECLTYPE_FLOAT3));
6170+ rb_define_const( mDXRuby, "D3DDECLTYPE_FLOAT4", INT2NUM(D3DDECLTYPE_FLOAT4));
6171+ rb_define_const( mDXRuby, "D3DDECLTYPE_D3DCOLOR", INT2NUM(D3DDECLTYPE_D3DCOLOR));
6172+ rb_define_const( mDXRuby, "D3DDECLTYPE_UBYTE4", INT2NUM(D3DDECLTYPE_UBYTE4));
6173+ rb_define_const( mDXRuby, "D3DDECLTYPE_SHORT2", INT2NUM(D3DDECLTYPE_SHORT2));
6174+ rb_define_const( mDXRuby, "D3DDECLTYPE_SHORT4", INT2NUM(D3DDECLTYPE_SHORT4));
6175+ rb_define_const( mDXRuby, "D3DDECLTYPE_UBYTE4N", INT2NUM(D3DDECLTYPE_UBYTE4N));
6176+ rb_define_const( mDXRuby, "D3DDECLTYPE_SHORT2N", INT2NUM(D3DDECLTYPE_SHORT2N));
6177+ rb_define_const( mDXRuby, "D3DDECLTYPE_SHORT4N", INT2NUM(D3DDECLTYPE_SHORT4N));
6178+ rb_define_const( mDXRuby, "D3DDECLTYPE_USHORT2N", INT2NUM(D3DDECLTYPE_USHORT2N));
6179+ rb_define_const( mDXRuby, "D3DDECLTYPE_USHORT4N", INT2NUM(D3DDECLTYPE_USHORT4N));
6180+ rb_define_const( mDXRuby, "D3DDECLTYPE_UDEC3", INT2NUM(D3DDECLTYPE_UDEC3));
6181+ rb_define_const( mDXRuby, "D3DDECLTYPE_DEC3N", INT2NUM(D3DDECLTYPE_DEC3N));
6182+ rb_define_const( mDXRuby, "D3DDECLTYPE_FLOAT16_2", INT2NUM(D3DDECLTYPE_FLOAT16_2));
6183+ rb_define_const( mDXRuby, "D3DDECLTYPE_FLOAT16_4", INT2NUM(D3DDECLTYPE_FLOAT16_4));
6184+ rb_define_const( mDXRuby, "D3DDECLTYPE_UNUSED", INT2NUM(D3DDECLTYPE_UNUSED));
6185+
6186+ rb_define_const( mDXRuby, "D3DDECLUSAGE_POSITION", INT2NUM(D3DDECLUSAGE_POSITION));
6187+ rb_define_const( mDXRuby, "D3DDECLUSAGE_BLENDWEIGHT", INT2NUM(D3DDECLUSAGE_BLENDWEIGHT));
6188+ rb_define_const( mDXRuby, "D3DDECLUSAGE_BLENDINDICES", INT2NUM(D3DDECLUSAGE_BLENDINDICES));
6189+ rb_define_const( mDXRuby, "D3DDECLUSAGE_NORMAL", INT2NUM(D3DDECLUSAGE_NORMAL));
6190+ rb_define_const( mDXRuby, "D3DDECLUSAGE_PSIZE", INT2NUM(D3DDECLUSAGE_PSIZE));
6191+ rb_define_const( mDXRuby, "D3DDECLUSAGE_TEXCOORD", INT2NUM(D3DDECLUSAGE_TEXCOORD));
6192+ rb_define_const( mDXRuby, "D3DDECLUSAGE_TANGENT", INT2NUM(D3DDECLUSAGE_TANGENT));
6193+ rb_define_const( mDXRuby, "D3DDECLUSAGE_BINORMAL", INT2NUM(D3DDECLUSAGE_BINORMAL));
6194+ rb_define_const( mDXRuby, "D3DDECLUSAGE_TESSFACTOR", INT2NUM(D3DDECLUSAGE_TESSFACTOR));
6195+ rb_define_const( mDXRuby, "D3DDECLUSAGE_POSITIONT", INT2NUM(D3DDECLUSAGE_POSITIONT));
6196+ rb_define_const( mDXRuby, "D3DDECLUSAGE_COLOR", INT2NUM(D3DDECLUSAGE_COLOR));
6197+ rb_define_const( mDXRuby, "D3DDECLUSAGE_FOG", INT2NUM(D3DDECLUSAGE_FOG));
6198+ rb_define_const( mDXRuby, "D3DDECLUSAGE_DEPTH", INT2NUM(D3DDECLUSAGE_DEPTH));
6199+ rb_define_const( mDXRuby, "D3DDECLUSAGE_SAMPLE", INT2NUM(D3DDECLUSAGE_SAMPLE));
6200+
6201+ rb_define_const( cCustomRenderTarget, "D3DPT_POINTLIST", INT2NUM(D3DPT_POINTLIST));
6202+ rb_define_const( cCustomRenderTarget, "D3DPT_LINELIST", INT2NUM(D3DPT_LINELIST));
6203+ rb_define_const( cCustomRenderTarget, "D3DPT_LINESTRIP", INT2NUM(D3DPT_LINESTRIP));
6204+ rb_define_const( cCustomRenderTarget, "D3DPT_TRIANGLELIST", INT2NUM(D3DPT_TRIANGLELIST));
6205+ rb_define_const( cCustomRenderTarget, "D3DPT_TRIANGLESTRIP", INT2NUM(D3DPT_TRIANGLESTRIP));
6206+ rb_define_const( cCustomRenderTarget, "D3DPT_TRIANGLEFAN", INT2NUM(D3DPT_TRIANGLEFAN));
6207+
6208+ rb_define_const( cCustomRenderTarget, "D3DRS_ZENABLE", INT2NUM(D3DRS_ZENABLE));
6209+ rb_define_const( cCustomRenderTarget, "D3DRS_FILLMODE", INT2NUM(D3DRS_FILLMODE));
6210+ rb_define_const( cCustomRenderTarget, "D3DRS_SHADEMODE", INT2NUM(D3DRS_SHADEMODE));
6211+ rb_define_const( cCustomRenderTarget, "D3DRS_ZWRITEENABLE", INT2NUM(D3DRS_ZWRITEENABLE));
6212+ rb_define_const( cCustomRenderTarget, "D3DRS_ALPHATESTENABLE", INT2NUM(D3DRS_ALPHATESTENABLE));
6213+ rb_define_const( cCustomRenderTarget, "D3DRS_LASTPIXEL", INT2NUM(D3DRS_LASTPIXEL));
6214+ rb_define_const( cCustomRenderTarget, "D3DRS_SRCBLEND", INT2NUM(D3DRS_SRCBLEND));
6215+ rb_define_const( cCustomRenderTarget, "D3DRS_DESTBLEND", INT2NUM(D3DRS_DESTBLEND));
6216+ rb_define_const( cCustomRenderTarget, "D3DRS_CULLMODE", INT2NUM(D3DRS_CULLMODE));
6217+ rb_define_const( cCustomRenderTarget, "D3DRS_ZFUNC", INT2NUM(D3DRS_ZFUNC));
6218+ rb_define_const( cCustomRenderTarget, "D3DRS_ALPHAREF", INT2NUM(D3DRS_ALPHAREF));
6219+ rb_define_const( cCustomRenderTarget, "D3DRS_ALPHAFUNC", INT2NUM(D3DRS_ALPHAFUNC));
6220+ rb_define_const( cCustomRenderTarget, "D3DRS_ALPHABLENDENABLE", INT2NUM(D3DRS_ALPHABLENDENABLE));
6221+ rb_define_const( cCustomRenderTarget, "D3DRS_STENCILENABLE", INT2NUM(D3DRS_STENCILENABLE));
6222+ rb_define_const( cCustomRenderTarget, "D3DRS_STENCILFAIL", INT2NUM(D3DRS_STENCILFAIL));
6223+ rb_define_const( cCustomRenderTarget, "D3DRS_STENCILZFAIL", INT2NUM(D3DRS_STENCILZFAIL));
6224+ rb_define_const( cCustomRenderTarget, "D3DRS_STENCILPASS", INT2NUM(D3DRS_STENCILPASS));
6225+ rb_define_const( cCustomRenderTarget, "D3DRS_STENCILFUNC", INT2NUM(D3DRS_STENCILFUNC));
6226+ rb_define_const( cCustomRenderTarget, "D3DRS_STENCILREF", INT2NUM(D3DRS_STENCILREF));
6227+ rb_define_const( cCustomRenderTarget, "D3DRS_STENCILMASK", INT2NUM(D3DRS_STENCILMASK));
6228+ rb_define_const( cCustomRenderTarget, "D3DRS_STENCILWRITEMASK", INT2NUM(D3DRS_STENCILWRITEMASK));
6229+ rb_define_const( cCustomRenderTarget, "D3DRS_CLIPPING", INT2NUM(D3DRS_CLIPPING));
6230+ rb_define_const( cCustomRenderTarget, "D3DRS_COLORWRITEENABLE", INT2NUM(D3DRS_COLORWRITEENABLE));
6231+ rb_define_const( cCustomRenderTarget, "D3DRS_BLENDOP", INT2NUM(D3DRS_BLENDOP));
6232+ rb_define_const( cCustomRenderTarget, "D3DRS_ANTIALIASEDLINEENABLE", INT2NUM(D3DRS_ANTIALIASEDLINEENABLE));
6233+ rb_define_const( cCustomRenderTarget, "D3DRS_TWOSIDEDSTENCILMODE", INT2NUM(D3DRS_TWOSIDEDSTENCILMODE));
6234+ rb_define_const( cCustomRenderTarget, "D3DRS_CCW_STENCILFAIL", INT2NUM(D3DRS_CCW_STENCILFAIL));
6235+ rb_define_const( cCustomRenderTarget, "D3DRS_CCW_STENCILZFAIL", INT2NUM(D3DRS_CCW_STENCILZFAIL));
6236+ rb_define_const( cCustomRenderTarget, "D3DRS_CCW_STENCILPASS", INT2NUM(D3DRS_CCW_STENCILPASS));
6237+ rb_define_const( cCustomRenderTarget, "D3DRS_CCW_STENCILFUNC", INT2NUM(D3DRS_CCW_STENCILFUNC));
6238+ rb_define_const( cCustomRenderTarget, "D3DRS_SRCBLENDALPHA", INT2NUM(D3DRS_SRCBLENDALPHA));
6239+ rb_define_const( cCustomRenderTarget, "D3DRS_DESTBLENDALPHA", INT2NUM(D3DRS_DESTBLENDALPHA));
6240+ rb_define_const( cCustomRenderTarget, "D3DRS_BLENDOPALPHA", INT2NUM(D3DRS_BLENDOPALPHA));
6241+ rb_define_const( cCustomRenderTarget, "D3DZB_FALSE", INT2NUM(D3DZB_FALSE));
6242+ rb_define_const( cCustomRenderTarget, "D3DZB_TRUE", INT2NUM(D3DZB_TRUE));
6243+ rb_define_const( cCustomRenderTarget, "D3DZB_USEW", INT2NUM(D3DZB_USEW));
6244+
6245+ rb_define_const( cCustomRenderTarget, "D3DFILL_POINT", INT2NUM(D3DFILL_POINT));
6246+ rb_define_const( cCustomRenderTarget, "D3DFILL_WIREFRAME", INT2NUM(D3DFILL_WIREFRAME));
6247+ rb_define_const( cCustomRenderTarget, "D3DFILL_SOLID", INT2NUM(D3DFILL_SOLID));
6248+
6249+ rb_define_const( cCustomRenderTarget, "D3DSHADE_FLAT", INT2NUM(D3DSHADE_FLAT));
6250+ rb_define_const( cCustomRenderTarget, "D3DSHADE_GOURAUD", INT2NUM(D3DSHADE_GOURAUD));
6251+ rb_define_const( cCustomRenderTarget, "D3DSHADE_PHONG", INT2NUM(D3DSHADE_PHONG));
6252+
6253+ rb_define_const( cCustomRenderTarget, "D3DBLEND_ZERO", INT2NUM(D3DBLEND_ZERO));
6254+ rb_define_const( cCustomRenderTarget, "D3DBLEND_ONE", INT2NUM(D3DBLEND_ONE));
6255+ rb_define_const( cCustomRenderTarget, "D3DBLEND_SRCCOLOR", INT2NUM(D3DBLEND_SRCCOLOR));
6256+ rb_define_const( cCustomRenderTarget, "D3DBLEND_INVSRCCOLOR", INT2NUM(D3DBLEND_INVSRCCOLOR));
6257+ rb_define_const( cCustomRenderTarget, "D3DBLEND_SRCALPHA", INT2NUM(D3DBLEND_SRCALPHA));
6258+ rb_define_const( cCustomRenderTarget, "D3DBLEND_INVSRCALPHA", INT2NUM(D3DBLEND_INVSRCALPHA));
6259+ rb_define_const( cCustomRenderTarget, "D3DBLEND_DESTALPHA", INT2NUM(D3DBLEND_DESTALPHA));
6260+ rb_define_const( cCustomRenderTarget, "D3DBLEND_INVDESTALPHA", INT2NUM(D3DBLEND_INVDESTALPHA));
6261+ rb_define_const( cCustomRenderTarget, "D3DBLEND_DESTCOLOR", INT2NUM(D3DBLEND_DESTCOLOR));
6262+ rb_define_const( cCustomRenderTarget, "D3DBLEND_INVDESTCOLOR", INT2NUM(D3DBLEND_INVDESTCOLOR));
6263+ rb_define_const( cCustomRenderTarget, "D3DBLEND_SRCALPHASAT", INT2NUM(D3DBLEND_SRCALPHASAT));
6264+ rb_define_const( cCustomRenderTarget, "D3DBLEND_BOTHSRCALPHA", INT2NUM(D3DBLEND_BOTHSRCALPHA));
6265+ rb_define_const( cCustomRenderTarget, "D3DBLEND_BOTHINVSRCALPHA", INT2NUM(D3DBLEND_BOTHINVSRCALPHA));
6266+ rb_define_const( cCustomRenderTarget, "D3DBLEND_BLENDFACTOR", INT2NUM(D3DBLEND_BLENDFACTOR));
6267+ rb_define_const( cCustomRenderTarget, "D3DBLEND_INVBLENDFACTOR", INT2NUM(D3DBLEND_INVBLENDFACTOR));
6268+
6269+ rb_define_const( cCustomRenderTarget, "D3DCULL_NONE", INT2NUM(D3DCULL_NONE));
6270+ rb_define_const( cCustomRenderTarget, "D3DCULL_CW", INT2NUM(D3DCULL_CW));
6271+ rb_define_const( cCustomRenderTarget, "D3DCULL_CCW", INT2NUM(D3DCULL_CCW));
6272+
6273+ rb_define_const( cCustomRenderTarget, "D3DCMP_NEVER", INT2NUM(D3DCMP_NEVER));
6274+ rb_define_const( cCustomRenderTarget, "D3DCMP_LESS", INT2NUM(D3DCMP_LESS));
6275+ rb_define_const( cCustomRenderTarget, "D3DCMP_EQUAL", INT2NUM(D3DCMP_EQUAL));
6276+ rb_define_const( cCustomRenderTarget, "D3DCMP_LESSEQUAL", INT2NUM(D3DCMP_LESSEQUAL));
6277+ rb_define_const( cCustomRenderTarget, "D3DCMP_GREATER", INT2NUM(D3DCMP_GREATER));
6278+ rb_define_const( cCustomRenderTarget, "D3DCMP_NOTEQUAL", INT2NUM(D3DCMP_NOTEQUAL));
6279+ rb_define_const( cCustomRenderTarget, "D3DCMP_GREATEREQUAL", INT2NUM(D3DCMP_GREATEREQUAL));
6280+ rb_define_const( cCustomRenderTarget, "D3DCMP_ALWAYS", INT2NUM(D3DCMP_ALWAYS));
6281+
6282+ rb_define_const( cCustomRenderTarget, "D3DSTENCILOP_KEEP", INT2NUM(D3DSTENCILOP_KEEP));
6283+ rb_define_const( cCustomRenderTarget, "D3DSTENCILOP_ZERO", INT2NUM(D3DSTENCILOP_ZERO));
6284+ rb_define_const( cCustomRenderTarget, "D3DSTENCILOP_REPLACE", INT2NUM(D3DSTENCILOP_REPLACE));
6285+ rb_define_const( cCustomRenderTarget, "D3DSTENCILOP_INCRSAT", INT2NUM(D3DSTENCILOP_INCRSAT));
6286+ rb_define_const( cCustomRenderTarget, "D3DSTENCILOP_DECRSAT", INT2NUM(D3DSTENCILOP_DECRSAT));
6287+ rb_define_const( cCustomRenderTarget, "D3DSTENCILOP_INVERT", INT2NUM(D3DSTENCILOP_INVERT));
6288+ rb_define_const( cCustomRenderTarget, "D3DSTENCILOP_INCR", INT2NUM(D3DSTENCILOP_INCR));
6289+ rb_define_const( cCustomRenderTarget, "D3DSTENCILOP_DECR", INT2NUM(D3DSTENCILOP_DECR));
6290+
6291+ rb_define_const( cCustomRenderTarget, "D3DBLENDOP_ADD", INT2NUM(D3DBLENDOP_ADD));
6292+ rb_define_const( cCustomRenderTarget, "D3DBLENDOP_SUBTRACT", INT2NUM(D3DBLENDOP_SUBTRACT));
6293+ rb_define_const( cCustomRenderTarget, "D3DBLENDOP_REVSUBTRACT", INT2NUM(D3DBLENDOP_REVSUBTRACT));
6294+ rb_define_const( cCustomRenderTarget, "D3DBLENDOP_MIN", INT2NUM(D3DBLENDOP_MIN));
6295+ rb_define_const( cCustomRenderTarget, "D3DBLENDOP_MAX", INT2NUM(D3DBLENDOP_MAX));
6296+
6297+ rb_define_const( cCustomRenderTarget, "D3DCOLORWRITEENABLE_RED", INT2NUM(D3DCOLORWRITEENABLE_RED));
6298+ rb_define_const( cCustomRenderTarget, "D3DCOLORWRITEENABLE_GREEN", INT2NUM(D3DCOLORWRITEENABLE_GREEN));
6299+ rb_define_const( cCustomRenderTarget, "D3DCOLORWRITEENABLE_BLUE", INT2NUM(D3DCOLORWRITEENABLE_BLUE));
6300+ rb_define_const( cCustomRenderTarget, "D3DCOLORWRITEENABLE_ALPHA", INT2NUM(D3DCOLORWRITEENABLE_ALPHA));
6301+
6302+
6303+
6304+ /* LowLevelInterfaceモジュール定義 */
6305+ mLowLevelInterface = rb_module_new();
6306+ rb_define_singleton_method( mLowLevelInterface, "set_viewport", LLI_set_viewport, 6 );
6307+ rb_define_singleton_method( mLowLevelInterface, "begin_scene", LLI_begin_scene, 0 );
6308+ rb_define_singleton_method( mLowLevelInterface, "end_scene", LLI_end_scene, 0 );
6309+ rb_define_singleton_method( mLowLevelInterface, "set_fvf", LLI_set_fvf, 1 );
6310+ rb_define_singleton_method( mLowLevelInterface, "set_stream", LLI_set_stream, -1 );
6311+ rb_define_singleton_method( mLowLevelInterface, "draw_primitive_up", LLI_draw_primitive_up, 4 );
6312+ rb_define_singleton_method( mLowLevelInterface, "draw_primitive", LLI_draw_primitive, 2 );
6313+ rb_define_singleton_method( mLowLevelInterface, "using_shader", LLI_using_shader, 1 );
6314+ rb_define_singleton_method( mLowLevelInterface, "set_render_state", LLI_set_render_state, 2 );
6315+ rb_global_variable( &mLowLevelInterface );
6316+
6317+
6318+
6319+ /* VertexBufferクラス定義 */
6320+ cVertexBuffer = rb_define_class_under( mDXRuby, "VertexBuffer", rb_cObject );
6321+
6322+ /* RenderTargetクラスにメソッド登録*/
6323+ rb_define_private_method( cVertexBuffer, "initialize", VertexBuffer_initialize, 1 );
6324+ rb_define_method( cVertexBuffer, "dispose" , VertexBuffer_dispose , 0 );
6325+ rb_define_method( cVertexBuffer, "disposed?" , VertexBuffer_check_disposed, 0 );
6326+
6327+ rb_define_method( cVertexBuffer, "buf=" , VertexBuffer_set_buf , 1 );
6328+ rb_define_method( cVertexBuffer, "buf" , VertexBuffer_get_buf , 0 );
6329+ rb_define_method( cVertexBuffer, "byte_size" , VertexBuffer_get_size , 0 );
6330+ rb_define_method( cVertexBuffer, "vertex_count" , VertexBuffer_get_vertex_count, 0 );
6331+ rb_define_method( cVertexBuffer, "vertices=", VertexBuffer_set_vertices , 1 );
6332+ rb_define_method( cVertexBuffer, "vertices" , VertexBuffer_get_vertices , 0 );
6333+ rb_define_method( cVertexBuffer, "vertex_type" , VertexBuffer_get_vertex_type , 0 );
6334+
6335+ /* VertexBufferオブジェクトを生成した時にinitializeの前に呼ばれるメモリ割り当て関数登録 */
6336+ rb_define_alloc_func( cVertexBuffer, VertexBuffer_allocate );
6337+
6338+
6339+ /* Viewportクラス定義 */
6340+ cViewport = rb_define_class_under( mDXRuby, "Viewport", rb_cObject );
6341+
6342+ /* Viewportクラスにメソッド登録*/
6343+ rb_define_private_method( cViewport, "initialize", Viewport_initialize, -1 );
6344+ rb_define_method( cViewport, "width" , RenderTarget_getWidth , 0 );
6345+ rb_define_method( cViewport, "height" , RenderTarget_getHeight , 0 );
6346+ rb_define_method( cViewport, "resize" , Viewport_resize , 2 );
6347+ rb_define_method( cViewport, "draw" , RenderTarget_draw , -1 );
6348+// rb_define_method( cRenderTarget, "draw_scale", RenderTarget_drawScale , -1 );
6349+// rb_define_method( cRenderTarget, "drawScale", RenderTarget_drawScale , -1 );
6350+// rb_define_method( cRenderTarget, "draw_rot" , RenderTarget_drawRot , -1 );
6351+// rb_define_method( cRenderTarget, "drawRot" , RenderTarget_drawRot , -1 );
6352+// rb_define_method( cRenderTarget, "draw_alpha", RenderTarget_drawAlpha , -1 );
6353+// rb_define_method( cRenderTarget, "drawAlpha", RenderTarget_drawAlpha , -1 );
6354+// rb_define_method( cRenderTarget, "draw_add" , RenderTarget_drawAdd , -1 );
6355+// rb_define_method( cRenderTarget, "drawAdd" , RenderTarget_drawAdd , -1 );
6356+// rb_define_method( cRenderTarget, "draw_sub" , RenderTarget_drawSub , -1 );
6357+// rb_define_method( cRenderTarget, "drawSub" , RenderTarget_drawSub , -1 );
6358+// rb_define_method( cRenderTarget, "draw_ex" , RenderTarget_drawEx , -1 );
6359+// rb_define_method( cRenderTarget, "drawEx" , RenderTarget_drawEx , -1 );
6360+// rb_define_method( cRenderTarget, "draw_font", RenderTarget_drawFont , -1 );
6361+// rb_define_method( cRenderTarget, "drawFont" , RenderTarget_drawFont , -1 );
6362+// rb_define_method( cRenderTarget, "draw_font_ex", RenderTarget_drawFontEx , -1 );
6363+// rb_define_method( cRenderTarget, "drawFontEx" , RenderTarget_drawFontEx , -1 );
6364+// rb_define_method( cRenderTarget, "draw_text", RenderTarget_drawFont , -1 );
6365+// rb_define_method( cRenderTarget, "drawText" , RenderTarget_drawFont , -1 );
6366+// rb_define_method( cRenderTarget, "draw_text_ex", RenderTarget_drawFontEx , -1 );
6367+// rb_define_method( cRenderTarget, "drawTextEx" , RenderTarget_drawFontEx , -1 );
6368+// rb_define_method( cRenderTarget, "draw_tile", RenderTarget_drawTile , -1 );
6369+// rb_define_method( cRenderTarget, "drawTile" , RenderTarget_drawTile , -1 );
6370+// rb_define_method( cRenderTarget, "draw_tiles", RenderTarget_drawTile , -1 );
6371+// rb_define_method( cRenderTarget, "drawTiles" , RenderTarget_drawTile , -1 );
6372+// rb_define_method( cRenderTarget, "draw_morph", RenderTarget_drawMorph , -1 );
6373+// rb_define_method( cRenderTarget, "drawMorph" , RenderTarget_drawMorph , -1 );
6374+// rb_define_method( cRenderTarget, "draw_pixel", RenderTarget_drawPixel , -1 );
6375+// rb_define_method( cRenderTarget, "drawPixel" , RenderTarget_drawPixel , -1 );
6376+// rb_define_method( cRenderTarget, "draw_line" , RenderTarget_drawLine , -1 );
6377+// rb_define_method( cRenderTarget, "drawLine" , RenderTarget_drawLine , -1 );
6378+// rb_define_method( cRenderTarget, "draw_box" , RenderTarget_drawBox , -1 );
6379+// rb_define_method( cRenderTarget, "drawBox" , RenderTarget_drawBox , -1 );
6380+// rb_define_method( cRenderTarget, "draw_box_fill" , RenderTarget_drawBoxFill , -1 );
6381+// rb_define_method( cRenderTarget, "drawBoxFill" , RenderTarget_drawBoxFill , -1 );
6382+// rb_define_method( cRenderTarget, "draw_circle" , RenderTarget_drawCircle , -1 );
6383+// rb_define_method( cRenderTarget, "drawCircle" , RenderTarget_drawCircle , -1 );
6384+// rb_define_method( cRenderTarget, "draw_circle_fill", RenderTarget_drawCircleFill , -1 );
6385+// rb_define_method( cRenderTarget, "drawCircleFill" , RenderTarget_drawCircleFill , -1 );
6386+// rb_define_method( cRenderTarget, "update" , RenderTarget_update , 0 );
6387+// rb_define_method( cRenderTarget, "decide" , RenderTarget_decide , 0 );
6388+// rb_define_method( cRenderTarget, "discard" , RenderTarget_discard , 0 );
6389+ rb_define_method( cViewport, "ox" , RenderTarget_getOx , 0 );
6390+ rb_define_method( cViewport, "ox=" , RenderTarget_setOx , 1 );
6391+ rb_define_method( cViewport, "oy" , RenderTarget_getOy, 0 );
6392+ rb_define_method( cViewport, "oy=" , RenderTarget_setOy, 1 );
6393+// rb_define_method( cRenderTarget, "draw_shader", RenderTarget_drawShader, -1 );
6394+// rb_define_method( cRenderTarget, "drawShader" , RenderTarget_drawShader, -1 );
6395+
6396+ /* Viewportオブジェクトを生成した時にinitializeの前に呼ばれるメモリ割り当て関数登録 */
6397+ rb_define_alloc_func( cViewport, Viewport_allocate );
6398+
6399+
6400+
54666401 rb_define_const( mDXRuby, "FORMAT_JPEG" , INT2FIX(FORMAT_JPEG));
54676402 rb_define_const( mDXRuby, "FORMAT_JPG" , INT2FIX(FORMAT_JPG) );
54686403 rb_define_const( mDXRuby, "FORMAT_PNG" , INT2FIX(FORMAT_PNG) );
@@ -5536,6 +6471,8 @@
55366471 symbol_discard = ID2SYM(rb_intern("discard"));
55376472 symbol_aa = ID2SYM(rb_intern("aa"));
55386473 symbol_call = ID2SYM(rb_intern("call"));
6474+ symbol_update = ID2SYM(rb_intern("update"));
6475+ symbol_custom_render = ID2SYM(rb_intern("custom_render"));
55396476
55406477 /* 終了時に実行する関数 */
55416478 rb_set_end_proc( Window_shutdown, Qnil );
--- branches/1.5dev/dxruby.h (revision 543)
+++ branches/1.5dev/dxruby.h (revision 544)
@@ -55,9 +55,13 @@
5555 #endif
5656
5757 #ifdef RUBY_VERSION_MAJOR
58-# if !(RUBY_VERSION_MAJOR == 1 || RUBY_API_VERSION_MAJOR == 1 || (RUBY_API_VERSION_MAJOR == 2 && RUBY_API_VERSION_MINOR == 0))
58+# if !(RUBY_VERSION_MAJOR == 1 || RUBY_API_VERSION_MAJOR == 1)
5959 # define DXRUBY_USE_TYPEDDATA
6060 # endif
61+#else
62+# if !(RUBY_API_VERSION_MAJOR == 2 && RUBY_API_VERSION_MINOR == 0)
63+# define DXRUBY_USE_TYPEDDATA
64+# endif
6165 #endif
6266
6367 #ifdef DXRUBY_USE_TYPEDDATA
@@ -142,8 +146,7 @@
142146 int y; /* y始点位置 */
143147 int width; /* イメージの幅 */
144148 int height;/* イメージの高さ */
145-// int lockcount; /* ロックカウント ここまでImageと共通 */
146- IDirect3DSurface9 *surface;
149+/* ここまでImageと共通 */
147150
148151 int PictureCount; /* ピクチャの登録数 */
149152 int PictureAllocateCount; /* ピクチャ登録のメモリ確保数 */
@@ -150,9 +153,15 @@
150153 int PictureSize; /* ピクチャデータの使用済みサイズ */
151154 int PictureAllocateSize; /* ピクチャデータのメモリ確保サイズ */
152155 char *PictureStruct;
153-
154156 struct DXRubyPictureList *PictureList;
157+ int PictureDecideCount; /* ピクチャの登録確定数 */
158+ int PictureDecideSize; /* ピクチャデータの登録確定サイズ */
159+ int ox; /* ビュー変換補正x */
160+ int oy; /* ビュー変換補正y */
161+/* ここまでViewportと共通 */
155162
163+ IDirect3DSurface9 *surface;
164+
156165 int minfilter; /* 縮小フィルタ */
157166 int magfilter; /* 拡大フィルタ */
158167
@@ -161,14 +170,27 @@
161170 int g; /* 背景クリア色 緑成分 */
162171 int b; /* 背景クリア色 青成分 */
163172
164-#ifdef DXRUBY15
165- VALUE vregenerate_proc;
166-#endif
173+ int clearflag; /* 1フレーム1回のクリア処理をやったかどうか */
167174
175+};
176+
177+/* Viewportオブジェクトの中身 */
178+struct DXRubyViewport {
179+ struct DXRubyTexture *texture;
180+ int x; /* x始点位置 */
181+ int y; /* y始点位置 */
182+ int width; /* イメージの幅 */
183+ int height;/* イメージの高さ */
184+/* ここまでImageと共通 */
185+
186+ int PictureCount; /* ピクチャの登録数 */
187+ int PictureAllocateCount; /* ピクチャ登録のメモリ確保数 */
188+ int PictureSize; /* ピクチャデータの使用済みサイズ */
189+ int PictureAllocateSize; /* ピクチャデータのメモリ確保サイズ */
190+ char *PictureStruct;
191+ struct DXRubyPictureList *PictureList;
168192 int PictureDecideCount; /* ピクチャの登録確定数 */
169193 int PictureDecideSize; /* ピクチャデータの登録確定サイズ */
170- int clearflag; /* 1フレーム1回のクリア処理をやったかどうか */
171-
172194 int ox; /* ビュー変換補正x */
173195 int oy; /* ビュー変換補正y */
174196 };
@@ -299,7 +321,15 @@
299321 VALUE vname;
300322 };
301323
324+/* VertexBuffer */
325+struct DXRubyVertexBuffer {
326+ LPDIRECT3DVERTEXBUFFER9 pVertexBuffer;
327+ VALUE vtype; /* 用途と使用方法インデックスのセット */
328+ int vertex_size; /* 頂点1個あたりのバイト数 */
329+ int vertex_num_count; /* 頂点1個あたりの数値の数 */
330+};
302331
332+
303333 #ifdef DXRUBY_EXTERN
304334 extern HINSTANCE g_hInstance; /* アプリケーションインスタンス */
305335 extern HANDLE g_hWnd; /* ウィンドウハンドル */
--- branches/1.5dev/matrix.c (revision 543)
+++ branches/1.5dev/matrix.c (revision 544)
@@ -807,6 +807,22 @@
807807 return vresult;
808808 }
809809
810+static VALUE Vector_norm2( VALUE self )
811+{
812+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
813+ float magsq = vec->v1*vec->v1 + vec->v2*vec->v2 + vec->v3*vec->v3 + vec->v4*vec->v4;
814+
815+ return rb_float_new( magsq );
816+}
817+
818+static VALUE Vector_norm( VALUE self )
819+{
820+ struct DXRubyVector *vec = DXRUBY_GET_STRUCT( Vector, self );
821+ float magsq = vec->v1*vec->v1 + vec->v2*vec->v2 + vec->v3*vec->v3 + vec->v4*vec->v4;
822+
823+ return rb_float_new( sqrt(magsq) );
824+}
825+
810826 static VALUE Vector_distance( VALUE klass, VALUE vvec1, VALUE vvec2 )
811827 {
812828 struct DXRubyVector *vec1;
@@ -1202,6 +1218,8 @@
12021218 rb_define_method( cVector, "xyz", Vector_get_xyz, 0 );
12031219 rb_define_method( cVector, "size", Vector_get_size, 0 );
12041220 rb_define_method( cVector, "normalize", Vector_normalize, 0 );
1221+ rb_define_method( cVector, "norm", Vector_norm, 0 );
1222+ rb_define_method( cVector, "norm2", Vector_norm2, 0 );
12051223 rb_define_method( cVector, "==", Vector_equal, 1 );
12061224 rb_define_method( cVector, "translate", Vector_translate, -1 );
12071225 rb_define_method( cVector, "rotate", Vector_rotate, -1 );
--- branches/1.5dev/messagethread.c (revision 543)
+++ branches/1.5dev/messagethread.c (revision 544)
@@ -56,7 +56,7 @@
5656 "ok",
5757 "out of memory",
5858 "Internal Error",
59- "not changed screen mode",
59+ "failed chang screen mode",
6060 "failed create window",
6161 "DirectX Graphics initialize error",
6262 "DirectInput initialize error"
@@ -173,6 +173,13 @@
173173 core->pD3DXEffect->lpVtbl->OnLostDevice( core->pD3DXEffect );
174174 }
175175
176+// /* 頂点バッファのロスト */
177+// for( i = 0; i < g_VertexBufferList.count; i++ )
178+// {
179+// struct DXRubyVertexBuffer *vb = (struct DXRubyVertexBuffer *)g_VertexBufferList.pointer[i];
180+// vb->pVertexBuffer->lpVtbl->OnLostDevice( vb->pVertexBuffer );
181+// }
182+
176183 /* 設定変更 */
177184 hr = g_pD3DDevice->lpVtbl->Reset( g_pD3DDevice, &g_D3DPP );
178185 if( FAILED( hr ) ) return 1;
@@ -207,6 +214,13 @@
207214 core->pD3DXEffect->lpVtbl->OnResetDevice( core->pD3DXEffect );
208215 }
209216
217+// /* 頂点バッファの復帰 */
218+// for( i = 0; i < g_VertexBufferList.count; i++ )
219+// {
220+// struct DXRubyVertexBuffer *vb = (struct DXRubyVertexBuffer *)g_VertexBufferList.pointer[i];
221+// vb->pVertexBuffer->lpVtbl->OnResetDevice( vb->pVertexBuffer );
222+// }
223+
210224 /* D3DXSprite復帰 */
211225 if( g_pD3DXSprite )
212226 {
@@ -374,6 +388,7 @@
374388 {
375389 g_pD3DXSprite->lpVtbl->OnResetDevice( g_pD3DXSprite );
376390 }
391+
377392 }
378393 else if( hr == D3DERR_DEVICELOST ) /* デバイスはロスト状態である */
379394 {
--- branches/1.5dev/sprite.c (revision 543)
+++ branches/1.5dev/sprite.c (revision 544)
@@ -34,7 +34,6 @@
3434 ID id_hit;
3535 ID id_update;
3636 ID id_draw;
37-ID id_render;
3837 ID id_vanished;
3938 ID id_visible;
4039
@@ -1165,35 +1164,6 @@
11651164 }
11661165
11671166
1168-static VALUE Sprite_class_render( VALUE klass, VALUE ary )
1169-{
1170- int i;
1171-
1172- if( TYPE( ary ) != T_ARRAY )
1173- {
1174- ary = rb_ary_new3( 1, ary );
1175- }
1176-
1177- for( i = 0; i < RARRAY_LEN( ary ); i++ )
1178- {
1179- VALUE p = RARRAY_AREF( ary, i );
1180-
1181- if( TYPE( p ) == T_ARRAY )
1182- {
1183- Sprite_class_draw( cSprite, p );
1184- }
1185- else if( !rb_respond_to( p, id_vanished ) || !RTEST( rb_funcall2( p, id_vanished, 0, 0 ) ) )
1186- {
1187- if( rb_respond_to( p, id_render ) )
1188- {
1189- rb_funcall2( p, id_render, 0, 0 );
1190- }
1191- }
1192- }
1193- return Qnil;
1194-}
1195-
1196-
11971167 static VALUE Sprite_class_clean( VALUE klass, VALUE ary )
11981168 {
11991169 int i;
@@ -1291,7 +1261,6 @@
12911261 rb_define_singleton_method( cSprite, "check", Sprite_check, -1 );
12921262 rb_define_singleton_method( cSprite, "update", Sprite_class_update, 1 );
12931263 rb_define_singleton_method( cSprite, "draw", Sprite_class_draw, 1 );
1294-// rb_define_singleton_method( cSprite, "render", Sprite_class_render, 1 );
12951264 rb_define_singleton_method( cSprite, "clean", Sprite_class_clean, 1 );
12961265
12971266 rb_define_alloc_func( cSprite, Sprite_allocate );
@@ -1300,7 +1269,6 @@
13001269 id_hit = rb_intern("hit");
13011270 id_update = rb_intern("update");
13021271 id_draw = rb_intern("draw");
1303- id_render = rb_intern("render");
13041272 id_vanished = rb_intern("vanished?");
13051273 id_visible = rb_intern("visible");
13061274
--- branches/1.5dev/version.h (revision 543)
+++ branches/1.5dev/version.h (revision 544)
@@ -1,10 +1,10 @@
11 /*
22 ###################################
33 #
4-# DXRuby 1.5.20dev
4+# DXRuby 1.5.21
55 #
66 ###################################
77 */
8-#define DXRUBY_VERSION "1.5.20dev"
8+#define DXRUBY_VERSION "1.5.21"
99
1010 #define DXRUBY15
Show on old repository browser