Writing vertices to my own file format

Started by
8 comments, last by unbird 9 years, 11 months ago

I am abit stuck on how to read vertices from a binary file,here is my code,the result is in the picture i have added

struct CUSTOMVERTEX

{

FLOAT X, Y, Z;

D3DVECTOR NORMAL;

FLOAT U, V;

};

// create the vertices using the CUSTOMVERTEX struct
CUSTOMVERTEX vertices[] =
{
{ -3.0f, -3.0f, 3.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, }, // side 1
{ 3.0f, -3.0f, 3.0f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, },
{ -3.0f, 3.0f, 3.0f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, },
{ 3.0f, 3.0f, 3.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, },
{ -3.0f, -3.0f, -3.0f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, }, // side 2
{ -3.0f, 3.0f, -3.0f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, },
{ 3.0f, -3.0f, -3.0f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, },
{ 3.0f, 3.0f, -3.0f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, },
{ -3.0f, 3.0f, -3.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, }, // side 3
{ -3.0f, 3.0f, 3.0f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, },
{ 3.0f, 3.0f, -3.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, },
{ 3.0f, 3.0f, 3.0f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, },
{ -3.0f, -3.0f, -3.0f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, }, // side 4
{ 3.0f, -3.0f, -3.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, },
{ -3.0f, -3.0f, 3.0f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, },
{ 3.0f, -3.0f, 3.0f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, },
{ 3.0f, -3.0f, -3.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, }, // side 5
{ 3.0f, 3.0f, -3.0f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, },
{ 3.0f, -3.0f, 3.0f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, },
{ 3.0f, 3.0f, 3.0f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, },
{ -3.0f, -3.0f, -3.0f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, }, // side 6
{ -3.0f, -3.0f, 3.0f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, },
{ -3.0f, 3.0f, -3.0f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, },
{ -3.0f, 3.0f, 3.0f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, },
};
//Write to out outstream file as a new binary format
outfile.write((char*)vertices,sizeof(CUSTOMVERTEX)*24);
outfile.close();
//Now read from the newly created file
CUSTOMVERTEX vertsArray[23];
infile.read((char*)VertsArray,sizeof(CUSTOMVERTEX)*24);
//Now load the data that was fetched from the binary in to the directx vertexbuffer
// create a vertex buffer interface called v_buffer
d3ddev->CreateVertexBuffer(24*sizeof(CUSTOMVERTEX),
0,
CUSTOMFVF,
D3DPOOL_MANAGED,
&v_buffer,
NULL);
VOID* pVoid; // a void pointer
// lock v_buffer and load the vertices into it
v_buffer->Lock(0, 0, (void**)&pVoid, 0);
// memcpy(pVoid, vertices, sizeof(vertices)); //loading from a hardcoded struct array which works fine
memcpy(pVoid, VertsArray, sizeof(CUSTOMVERTEX)*24); //loading from an array loaded with ifstream
v_buffer->Unlock();
:)
Advertisement

Why is your vertsArray only 23 elements instead of 24?

oh your right,i was thinking 0 to 23 is 24 allocations

:)

That's incorrect. The code you have right now is reading file data in one beyond the end of the array. The number in the array declaration specifies the size of the array, not the last index. It needs to be:

CUSTOMVERTEX vertsArray[24];

would it be possible to write the "texture.jpg" as data to the binary file and load it that way ?

:)

do you mean write the texture itself, or write a locator like a path or a filename? it's a yes in both cases, but the former may be a lot of work. Take a look at the OBJ format to see how materials can be bundled with geometry.

...but the former may be a lot of work...

Hmmm, I sort of disagree. In the simplest form you write the size of the sub-blob (and also a format tag for proper dispatch at loading) and then the blob itself. Think of concatenating files to one file (or rather non-compressing archivers like tar). At loading the size and tag help you split it up again.

Or am I missing something ?

oh your right,i was thinking 0 to 23 is 24 allocations

0 to 23 is 24 allocations, but you need to declare the array with size 24, not size 23 which is what you've done:

CUSTOMVERTEX vertsArray[23];

This isn't 0 to 23, this is 0 to 22. The "[23]" isn't the last element in the array, it's the size of the array, so this array only has space for 23 CUSTOMVERTEX structs.

Direct3D has need of instancing, but we do not. We have plenty of glVertexAttrib calls.

...but the former may be a lot of work...

Hmmm, I sort of disagree. In the simplest form you write the size of the sub-blob (and also a format tag for proper dispatch at loading) and then the blob itself. Think of concatenating files to one file (or rather non-compressing archivers like tar). At loading the size and tag help you split it up again.

Or am I missing something ?

I was thinking parsing a single field that can be passed directly to a ::load() function would be less work, but after reading your thoughts it does seem quite comparable in difficulty.

Yeah, depends on what functions/library you have at your disposal. Assuming D3DX9 is used, this is really simple, since the texture functions come with overloads for both files and memory. One can even (ab)use them to convert texture formats in-memory.

This topic is closed to new replies.

Advertisement