[Gambas-devel] Interface of gb.opengl.sge

Tomek tommyline at ...674...
Thu Mar 28 16:08:50 CET 2013


On 28.03.2013 09:53, Benoît Minisini wrote:
> Le 28/03/2013 09:24, Tomek a écrit :
>> On 28.03.2013 02:41, Benoît Minisini wrote:
>>> Hi Tomek,
>>>
>>> I took a glance at your code, and I strongly suggest the following
>>> changes to the gb.opengl.gse interface before you go further.
>>>
>>> Why these changes? Mainly because I try to make Gambas components have
>>> the most similar interfaces as possible, so that the learning curve is
>>> lower.
>>>
>>> By the way, not that there is a design problem too : the MD2 model
>>> loading routine only works if the endianness of the CPU is the same as
>>> the endianness of the file. You should ensure that if the endianness is
>>> different, you swap the binary data accordingly.
>>>
>>> Now the old interface :
>>>
>>> GB_DESC Md2ModelDesc[] =
>>> {
>>>       GB_DECLARE("Md2Model", sizeof(MD2MODEL)),
>>>       GB_NOT_CREATABLE(),
>>>       GB_STATIC_METHOD("Load", "Md2Model" , Md2Model_Load, "(Name)s"),
>>>       GB_METHOD("SetPosition", NULL, Md2Model_SetPosition, "(X)f(Y)f(Z)f" ),
>>>       GB_METHOD("DrawFrame", NULL, Md2Model_DrawFrame,
>>> "(Frame_No)i(Texture)i" ),
>>>       GB_METHOD("DrawInterFrame", NULL, Md2Model_DrawInterFrame,
>>> "(Frame_No)i(InterFrame)f(Texture)i" ),
>>>       GB_METHOD("GetFramesNo", "i", Md2Model_GetNoFrames, NULL ),
>>>       GB_METHOD("GetFrameName", "s", Md2Model_GetFrameName, "(FrameNumber)i" ),
>>>       GB_METHOD("Scale", NULL, Md2Model_Scale,
>>> "(Scale_x)f(Scale_y)f(Scale_z)f" ),
>>>       GB_METHOD("_free", NULL, Md2Model_free, NULL ),
>>>       GB_END_DECLARE
>>> };
>>>
>>> The new one I suggest:
>>>
>>> GB_DESC Md2ModelDesc[] =
>>> {
>>>       GB_DECLARE("Md2Model", sizeof(MD2MODEL)),
>>>       GB_NOT_CREATABLE(),
>>>       GB_STATIC_METHOD("Load", "Md2Model" , Md2Model_Load, "(Name)s"),
>>>       // 'SetPosition' renamed to 'Move'
>>>       GB_METHOD("Move", NULL, Md2Model_SetPosition, "(X)f(Y)f(Z)f" ),
>>>       // Three properties to get/set the one coordinate
>>>       GB_PROPERTY("X", "f", Md2Model_X),
>>>       GB_PROPERTY("Y", "f", Md2Model_X),
>>>       GB_PROPERTY("Z", "f", Md2Model_X),
>>>       // A virtual object for accessing frame properties and count
>>>       GB_PROPERTY_SELF("Frames", ".Md2Model.Frames"),
>>>       GB_METHOD("Scale", NULL, Md2Model_Scale, "(ScaleX)f(ScaleY)f(ScaleZ)f" ),
>>>       // Maybe you should add ScaleX, ScaleY and ScaleZ properties too.
>>>       GB_METHOD("_free", NULL, Md2Model_free, NULL ),
>>>       GB_END_DECLARE
>>> };
>>>
>>> GB_DESC Md2ModelFramesDesc[] =
>>> {
>>>       GB_DECLARE_VIRTUAL(".Md2Model.Frames"),
>>>       // Was Md2Model_GetNoFrames
>>>       GB_PROPERTY_READ("Count", "i", Md2Model_Frames_Count)
>>>       GB_METHOD("_get", ".Md2Model.Frame", Md2Model_Frames_get, "(Frame)i"),
>>>       GB_END_DECLARE
>>> }
>>>
>>> // The _get method of Md2Model_Frames is implemented that way:
>>>
>>> BEGIN_METHOD(Md2Model_Frames_get, GB_INTEGER frame)
>>>
>>>       // Store the frame number into the object, it will be used immediately
>>>       // by the method called on the virtual .Md2Model.Frame object.
>>>       // Maybe check that the frame number is valid now.
>>>       // And don't forget to add the 'frame' field into the object
>>>       // structure.
>>>       THIS->frame = VARG(frame);
>>>
>>> END_METHOD
>>>
>>> GB_DESC Md2ModelFrameDesc[] =
>>> {
>>>       GB_DECLARE_VIRTUAL(".Md2Model.Frame"),
>>>       // Was 'Md2Model.DrawFrame'
>>>       GB_METHOD("Draw", NULL, Md2Model_Frame_Draw, "(Texture)i"),
>>>       // Was 'Md2Model.DrawInterFrame'
>>>       GB_METHOD("DrawInterFrame", NULL, Md2Model_Frame_DrawInterFrame,
>>> "(InterFrame)f(Texture)i"),
>>>       GB_END_DECLARE
>>> }
>>>
>>> Tell me what you think about that and if you have questions!
>>>
>>> Regards,
>>>
>> Hi Benoit,
>>
>> Thanks for your suggestions, I will try to do as much a I can using
>> devel-api documentation page. It's the best way to learn I think. When
>> I'm stuck, I'll ask for your help, ok?
>> Question 1 - How do I check endianess of the CPU from component level?
> You must read a well known two or four bytes integer value from the file
> with fread, and see if you get it swapped or not.
>
> If you get it swapped, then you know that all binary values must be swapped.
>
> You can use the magic identifier at the beginning of the file, but
> beware that you must check it byte by byte before reading it as a binary
> data.
>
> Otherwise you may take some files starting with the magic number
> inverted as MD2 model files!
As I absolutely have no means to test Big-Endianness, I think I'll just 
put GB.Error("Big Endian not supported yet."), if reading header gives 
reversed value.


>> One more question - what would be the best way to make the class
>> creatable - Md2Model_new I suppose, but what should be in that function?
>> Can it be empty? Without creatable class I can't make an array of it.
> Yes, you must be able to create void models, and manage them in all
> functions.
>
> If a void model must not be used anywhere, you can use the "check hook".
>
> You declare the check hook in the class description structure with:
>
> GB_HOOK_CHECK(my_check_function),
>
> Then 'my_check_function' must be a function taking a pointer to a
> Md2Model object and returning an integer different from zero if that
> object is invalid. (The interpreter will raise the 'Invalid object' error).
>
> Moreover, you must think about implementing boolean operators between
> models if it has some sense (merging two models for example). I have no
> idea, not being an OpenGL expert, but if you want to implement such a
> thing, then a void model must be perfectly valid then.
>
> Regards,
>
Is it similar to cquad class in GLU? But Md2Model has no external 
initiator as quadric do.

I made some changes if file, but cant figure out how to return frame 
object. File Md2Model.c attached.

Tomek.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cmd2model.c
Type: text/x-csrc
Size: 17256 bytes
Desc: not available
URL: <http://lists.gambas-basic.org/pipermail/devel/attachments/20130328/a487d22d/attachment.c>


More information about the Devel mailing list