--Multipart_Thu_Dec_11_13:21:09_2003-1
Content-Type: text/plain; charset=ISO-2022-JP

なかだです。

At Thu, 11 Dec 2003 12:23:40 +0900,
U.Nakamura wrote:
> まったく何も試さないで憶測だけで言いますが(ごめんなさい)、

同じく。

> | require 'DirectXGraphicsTest'
> | 
> | test1  3D::MATERIAL9.new( )
>   d  est1.Diffuse
>   d.r  .0
> | 
> | while true
>     puts d.r
> | end
> 
> とすると大丈夫だったりしませんかね。

たぶん、ダメでしょう。
dはmD3D_cD3DMATERIAL9_get_Diffuse()で作られたCOLORVALUEのわ
けですが、

  obj  ata_Wrap_Struct( cD3DCOLORVALUE, 0, mD3D_cD3DCOLORVALUE_free, &p->Diffuse );

解放されるときにmalloc()されたのでないポインタをfree()しようと
しています。COLORVALUE自身はfreeしないようにして、dmarkで
MATERIAL9をマークするようにすればうまくいくかも知れません。

> あと、同様に、mD3D_cD3DCOLORVALUE_get_r()の中で毎回Floatのイ
> ンスタンスを生成しているのもいまいちな気がします。

一度生成したFloatを記憶しておいて、使い回すということ?

> 直し方は... いろいろ思いつきますけど、mD3D_cD3DMATERIAL9_new()
> の中で真面目にするのがいいんじゃないでしょうか;

蝶塚壮賭描鵡を直接使わずにもう一段間接参照にするとか。


--Multipart_Thu_Dec_11_13:21:09_2003-1
Content-Type: text/plain; charset=US-ASCII
Content-Disposition: attachment; filename="extconf.rb"
Content-Transfer-Encoding: 7bit

require "mkmf"

%w"d3d9.h".all?{|h|have_header(h)}
%w"d3d9".all?{|l|have_library(l)}
have_func("rb_define_alloc_func", "ruby.h")
create_makefile("DirectXGraphicsTest")

--Multipart_Thu_Dec_11_13:21:09_2003-1
Content-Type: text/plain charset="iso-2022-jp"; charset=US-ASCII
Content-Disposition: attachment; filename="DirectXGraphics.c"
Content-Transfer-Encoding: 7bit

#ifdef HAVE_D3D9_H
#include <d3d9.h>
#else
/* D3DCOLORVALUE 体 */
typedef struct _D3DCOLORVALUE {
    float r;
    float g;
    float b;
    float a;
} D3DCOLORVALUE;

/* D3DMATERIAL9体 */
typedef struct _D3DMATERIAL9 {
    D3DCOLORVALUE Diffuse;
    D3DCOLORVALUE Ambient;
    D3DCOLORVALUE Specular;
    D3DCOLORVALUE Emissive;
    float Power;
} D3DMATERIAL9;
#endif

#include "ruby.h"
#include "st.h"

static VALUE mD3D;

/* 体のクラス襖
齡癆蜒 崛盲稍劃地模雙遡嫖齡癆蜒 崛盲稍劃輿堙夘遡校
齡癆蜒 齡熹痰跂 鱚纈黼熬繙
 蝶鎮鰐碗崛盲体 */
static void
mD3D_cD3DCOLORVALUE_free(D3DCOLORVALUE *p)
{
    free(p);
}

static VALUE
mD3D_cD3DCOLORVALUE_alloc(VALUE self)
{
    D3DCOLORVALUE *p;
    return Data_Make_Struct(cD3DCOLORVALUE, D3DCOLORVALUE, NULL,
			    mD3D_cD3DCOLORVALUE_free, p);
}

static void
mD3D_cD3DCOLORVALUE_mark(void *ptr)
{
    st_data_t obj;
    if (st_lookup(reverse_ref, (st_data_t)ptr, &obj)) {
	rb_gc_mark((VALUE)obj);
    }
}

static void
mD3D_cD3DCOLORVALUE_unref(void *ptr)
{
    st_data_t p  st_data_t)ptr;
    st_delete(reverse_ref, &p, 0);
}

static VALUE
mD3D_cD3DCOLORVALUE_get_r(VALUE self)
{
    D3DCOLORVALUE *p;
    Data_Get_Struct(self, D3DCOLORVALUE, p);
    return rb_float_new(p->r);
}

static VALUE
mD3D_cD3DCOLORVALUE_set_r(VALUE obj, VALUE val)
{
    D3DCOLORVALUE *p;
    Data_Get_Struct(obj, D3DCOLORVALUE, p);
    p->r  float)NUM2DBL(val);
    return obj;
}

/* D3DMATERIAL9 体 */
static void
mD3D_cD3DMATERIAL9_free(D3DMATERIAL9 * p)
{
    free(p);
}

static VALUE
mD3D_cD3DMATERIAL9_alloc(VALUE self)
{
    D3DMATERIAL9 *p;
    return Data_Make_Struct(cD3DMATERIAL9, D3DMATERIAL9, NULL,
			    mD3D_cD3DMATERIAL9_free, p);
}

static VALUE
mD3D_cD3DMATERIAL9_get_diffuse(VALUE self)
{
    D3DMATERIAL9 *p;
    D3DCOLORVALUE *st;

    Data_Get_Struct(self, D3DMATERIAL9, p);
    st_insert(reverse_ref, (st_data_t)&p->Diffuse, (st_data_t)self);
    return Data_Wrap_Struct(cD3DCOLORVALUE,
			    mD3D_cD3DCOLORVALUE_mark,
			    mD3D_cD3DCOLORVALUE_unref,
			    &p->Diffuse);
}

static VALUE
mD3D_cD3DMATERIAL9_set_diffuse(VALUE self, VALUE val)
{
    D3DMATERIAL9 *p;
    D3DCOLORVALUE *st;
    Data_Get_Struct(self, D3DMATERIAL9, p);
    Data_Get_Struct(val, D3DCOLORVALUE, st);
    p->Diffuse  st;
    return self;
}

static VALUE mD3D_cD3DMATERIAL9_get_ambient(VALUE self)
{
    D3DMATERIAL9 *p;
    D3DCOLORVALUE *st;

    st_insert(reverse_ref, (st_data_t)&p->Ambient, (st_data_t)self);
    return Data_Wrap_Struct(cD3DCOLORVALUE,
			    mD3D_cD3DCOLORVALUE_mark,
			    mD3D_cD3DCOLORVALUE_unref,
			    &p->Ambient);
}

static VALUE mD3D_cD3DMATERIAL9_set_ambient(VALUE self, VALUE val)
{
    D3DMATERIAL9 *p;
    D3DCOLORVALUE *st;

    Data_Get_Struct(self, D3DMATERIAL9, p);
    Data_Get_Struct(val, D3DCOLORVALUE, st);
    p->Ambient  st;
    return self;
}

#ifndef HAVE_RB_DEFINE_ALLOC_FUNC
#define rb_define_alloc_func(klass, func) rb_define_singleton_method(klass, "new", func, 0)
#endif

void
Init_DirectXGraphicsTest()
{
    reverse_ref  t_init_numtable();
    mD3D  b_define_module("D3D");

    /* 体の定義 */
    cD3DCOLORVALUE  b_define_class_under(mD3D, "COLORVALUE", rb_cObject);
    cD3DMATERIAL9  b_define_class_under(mD3D, "MATERIAL9", rb_cObject);

    /* 体のメド */
    rb_define_alloc_func(cD3DCOLORVALUE, mD3D_cD3DCOLORVALUE_alloc);
    rb_define_method(cD3DCOLORVALUE, "r", mD3D_cD3DCOLORVALUE_get_r, 0);
    rb_define_method(cD3DCOLORVALUE, "r mD3D_cD3DCOLORVALUE_set_r, 1);
    rb_define_alloc_func(cD3DMATERIAL9, mD3D_cD3DMATERIAL9_alloc);
    rb_define_method(cD3DMATERIAL9, "diffuse", mD3D_cD3DMATERIAL9_get_diffuse, 0);
    rb_define_method(cD3DMATERIAL9, "diffuse mD3D_cD3DMATERIAL9_set_diffuse, 1);
    rb_define_method(cD3DMATERIAL9, "ambient", mD3D_cD3DMATERIAL9_get_ambient, 0);
    rb_define_method(cD3DMATERIAL9, "ambient mD3D_cD3DMATERIAL9_set_ambient, 1);
}

--Multipart_Thu_Dec_11_13:21:09_2003-1
Content-Type: text/plain; charset=ISO-2022-JP


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

--Multipart_Thu_Dec_11_13:21:09_2003-1--