World: r3wp
[Core] Discuss core issues
older newer | first last |
shadwolf 13-Jan-2005 [131] | the main problem I think with this kind of hierarchical and dynamical size struct is to be anought performant and close to the original to save code writing time and tu enhance the loading performances in such tasks. Actually you need to parse and readapt each data from the binary dump file to rebol based things. And that's an heavy task This can be usefull for all langages that allow binary dump file read/wirte like C, VB and many others. |
eFishAnt 13-Jan-2005 [132x3] | if that is the struct of the data stored in a file, it should not be too hard to parse the file to get the information...looks like a 3-D rendering file or ? |
my REBOL coding is nearly as good as my C coding...but my C codding had a 22 year head start...;-) | |
coding = codding ... a slip of the fish | |
Geomol 14-Jan-2005 [135] | shadwolf, it seems, you need some kind of binary format, so external data can be loaded directly in to a REBOL structure. Maybe REBin? http://www.rebol.net/blogs/0044.html |
shadwolf 14-Jan-2005 [136x2] | this structure is the one for MD2 File format it contents vertex point position, texture, texture coordinates, frames of animation. In MD2 format each animation move is the difference beetwin 2 frame content . |
the goal is to provide to REBOL the capability to do such a load in the simpliest and fastest way I think the posibility of using a vectorial data like float myvar[3]; | |
eFishAnt 14-Jan-2005 [138] | is there a site with files I could look at? (just seems there would be a very simple way to do this without much problem) sorry I am not familiar with md2 (guess the enterprise work distracts me too much...;-( |
shadwolf 14-Jan-2005 [139] | you can find an example files in MD2 format here-> http://shadwolf.free.fr/hellpig.md2 |
eFishAnt 14-Jan-2005 [140] | what could I use to view it so I see what it looks like? |
shadwolf 14-Jan-2005 [141] | In fact the actual need to support MD2 file format is not requiered but We can use such a complicated hierarchical structure to simplify in REBOL/Core the C library branchement witch will in reallity very important if we want to have the true capabilité to exploite C library that use vectorial dat or vectorial structure based API |
eFishAnt 14-Jan-2005 [142x2] | understood. |
parsing binary is a bit different than parsing ASCII...and I have done a bit for mp4...but I think your point of making it simple is a good thing. | |
shadwolf 14-Jan-2005 [144x4] | To see it you can use the MD2 model viewer http://www.swissquake.ch/chumbalum-soft/md2v/ |
you need to download too the texture skin image http://shadwolf.free.fr/hellpig.bmp | |
you open in the modelviewer the hellpig.md2 file and tada you can playback the animation | |
an other way could be to use the MD2 importer script into blender but it's not anymore online for the moment (I have a copy of it on my local harddrive if you want to test it....) | |
eFishAnt 14-Jan-2005 [148x2] | ok...I see what it does...cool. |
when Josh appears, we will scratch each others heads and see if we can determine a way to parse this...he has done some work like this for his NASA project...and he is working on some crazy computer science parsing algorithms...I think he has been chatting with Ladislav too long ... ;-) | |
Ladislav 14-Jan-2005 [150] | SMD2Header: make struct! [ m_iMagicNum [int] ; Always IDP2 (844121161) m_iVersion [int] ; 8 m_iSkinWidthPx [int] m_iSkinHeightPx [int] m_iFrameSize [int] m_iNumSkins [int] m_iNumVertices [int] m_iNumTexCoords [int] m_iNumTriangles [int] m_iNumGLCommands [int] m_iNumFrames [int] m_iOffsetSkins [int] m_iOffsetTexCoords [int] m_iOffsetTriangles [int] m_iOffsetFrames [int] m_iOffsetGlCommands [int] m_iFileSize [int] ] none |
shadwolf 14-Jan-2005 [151x2] | oki if I can apport my own head to help finding the better solution to handle this just communicate it to me thrue skype or altme. Than we can give our reflexions solution to Carl in order for him to include it to core |
thank you ladislave for single int variable that's easy (like header) but for file content it's ver hard and harder I think to attribute to a REBOL struct based pointer the content of the file | |
Ladislav 14-Jan-2005 [153] | SMD2Vert: make struct! [ m_fVert1 [float] m_fVert2 [float] m_fVert3 [float] m_ucReserved [char] ] none |
shadwolf 14-Jan-2005 [154x2] | struct SMD2Frame { float m_fScale[3]; float m_fTrans[3]; char m_caName[16]; SMD2Vert * m_pVerts; //Cleans up after itself SMD2Frame() { m_pVerts = 0; } this hierarchical structure typical in C is very very very hard to adapt easyly to REBOL or maby I'm to idiot to do it ... |
>> a: make object! SMD2Header ** Script Error: Invalid argument: make struct! [ m_iMagicNum [int] m_iVersion [int] m_iSkinWidthPx [int] m_iSkinHeightPx [int] m_iFrameSize [int] m_iNumSkins [int] m_iNumVertices [int] m_iNumTexCoords [int] m_iNumTriangles [int] m_iNumGLCommands [int] m_iNumFrames [int] m_iOffsetSkins [int] m_iOffsetTexCoords [int] m_iOffsetTriangles [int] m_iOffsetFrames [int] m_iOffsetGlCommands [int] m_iFileSize [int] ] [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0] | |
Ladislav 14-Jan-2005 [156] | why do you want to make object? - it is a struct |
shadwolf 14-Jan-2005 [157x5] | that's not that way it has to be done sorry I made a mistake. It's only a: SMD2Header but in this case you can't have a declaration like SMD2Header *myheader; that is the common way to do it in C SMD2Header struct will became a type in C, In rebol you only make a pointer to the struct so with vectorials struct based array mofifying one data will modify all data in the array |
example SMD2Vert struct is use to make an aray of vertex position for each frame int SMD2Frame struct SMD2Frame Struct is use as type to make an array of frames | |
so MD2 format encapsulate many Frame as array and all those frames encapsulate many Vert that discribe for this frame each location of every point of my 3d Model | |
the we have the posibility to take a bunch of frame for example from 0 to 10 to say that's animation set correspond to run | |
animation | |
eFishAnt 14-Jan-2005 [162x3] | aha, you give me so many ideas for my editor... |
it is sometimes too mind expanding to write code while chatting. Sometimes I think I need a few more heads, and a couple more arms to type and click...maybe I should draw a new model of myself. | |
but I think I would use REBOL blocks rather than some silly C structs. blocks are such flexible containers. | |
shadwolf 14-Jan-2005 [165] | in my 3D engine I will make a switch to change the animation that are into my model that supose for me to have all my 3D model to get the identical set of animation or to make animation switch that could be adapted to every 3D Model Type (that's why 3D engeneers not even more use this format and prefert bone animation based file format like MDL or MD3/MD5) |
eFishAnt 14-Jan-2005 [166] | aha...a datatype-sensitive editor...see, I should close down the right side of my brain so the left side can type code easier. |
shadwolf 14-Jan-2005 [167x11] | for example if I say walk is frame 0 10 for human but for aliens in my game I nead to have only frames 0 to 5 for the walk I need to make 2 animation list and 2 animation switches to handle human (main caracter of my game for example) and alien |
If i have alien type 1 alien type 2 alien type 3 etc... and all of them with different set of animation it could be very heavy task to handle all of them using MD2 but that's not our purpose in fact :) | |
data-type sensitive editor but normally rebol is datatype unsensive :) | |
so or we allways ue struct! to typify our variables (wich can't be reuse). In C if I make SDM2Header *a, *b; a content and b content (physical memory localtion) will not be the same | |
in rebol a: SMD2Header and b: SMD2Header will point to the same memory chunk ... | |
>> a: SMD2Header >> b: SMD2Header >> a/m_iMagicNum: 1234234 == 1234234 >> probe b/m_iMagicNum 1234234 == 1234234 >> | |
and that normal becaus in C to initialise data I will use a malloc call witch will attrubute to a and b on the same based type different memory location | |
in my example program that exploite the SMD2Header strucure we can see: | |
//------------------------------------------------------------- //- Load //- Loads an MD2 model from file //------------------------------------------------------------- bool CMd2::Load(const char * szFilename) { unsigned char * ucpBuffer = 0; unsigned char * ucpPtr = 0; unsigned char * ucpTmpPtr = 0; int iFileSize = 0; FILE * f; if(!(f = fopen(szFilename, "rb"))) { APP->Log(COLOR_RED, "Could not open MD2 file %s", szFilename); return false; } //check file size and read it all into the buffer int iStart = ftell(f); fseek(f, 0, SEEK_END); int iEnd = ftell(f); fseek(f, 0, SEEK_SET); iFileSize = iEnd - iStart; //Allocate memory for whole file ucpBuffer = new unsigned char[iFileSize]; ucpPtr = ucpBuffer; if(!ucpBuffer) { APP->Log(COLOR_RED, "Could not allocate memory for %s", szFilename); return false; } //Load file into buffer if(fread(ucpBuffer, 1, iFileSize, f) != (unsigned)iFileSize) { APP->Log(COLOR_RED, "Could not read from %s", szFilename); delete [] ucpBuffer; return false; } //close the file, we don't need it anymore fclose(f); //get the header memcpy(&m_Head, ucpPtr, sizeof(SMD2Header)); //make sure it is a valid MD2 file before we get going if(m_Head.m_iMagicNum != 844121161 || m_Head.m_iVersion != 8) { APP->Log(COLOR_RED, "%s is not a valid MD2 file", szFilename); delete [] ucpBuffer; return false; } ucpTmpPtr = ucpPtr; ucpTmpPtr += m_Head.m_iOffsetFrames; //read the frames m_pFrames = new SMD2Frame[m_Head.m_iNumFrames]; for(int i = 0; i < m_Head.m_iNumFrames; i++) { float fScale[3]; float fTrans[3]; m_pFrames[i].m_pVerts = new SMD2Vert[m_Head.m_iNumVertices]; //expand the verices memcpy(fScale, ucpTmpPtr, 12); memcpy(fTrans, ucpTmpPtr + 12, 12); memcpy(m_pFrames[i].m_caName, ucpTmpPtr + 24, 16); ucpTmpPtr += 40; for(int j = 0; j < m_Head.m_iNumVertices; j++) { //swap y and z coords to convert to the proper orientation on screen m_pFrames[i].m_pVerts[j].m_fVert[0] = ucpTmpPtr[0] * fScale[0] + fTrans[0]; m_pFrames[i].m_pVerts[j].m_fVert[1] = ucpTmpPtr[2] * fScale[2] + fTrans[2]; m_pFrames[i].m_pVerts[j].m_fVert[2] = ucpTmpPtr[1] * fScale[1] + fTrans[1]; m_pFrames[i].m_pVerts[j].m_ucReserved = ucpTmpPtr[3]; ucpTmpPtr += 4; } } //Read in the triangles ucpTmpPtr = ucpPtr; ucpTmpPtr += m_Head.m_iOffsetTriangles; m_pTriangles = new SMD2Tri[m_Head.m_iNumTriangles]; memcpy(m_pTriangles, ucpTmpPtr, 12 * m_Head.m_iNumTriangles); //Read the U/V texture coords ucpTmpPtr = ucpPtr; ucpTmpPtr += m_Head.m_iOffsetTexCoords; m_pTexCoords = new SMD2TexCoord[m_Head.m_iNumTexCoords]; short * sTexCoords = new short[m_Head.m_iNumTexCoords * 2]; memcpy(sTexCoords, ucpTmpPtr, 4 * m_Head.m_iNumTexCoords); for(i = 0; i < m_Head.m_iNumTexCoords; i++) { m_pTexCoords[i].m_fTex[0] = (float)sTexCoords[2*i] / m_Head.m_iSkinWidthPx; m_pTexCoords[i].m_fTex[1] = (float)sTexCoords[2*i+1] / m_Head.m_iSkinHeightPx; } delete [] sTexCoords; //Read the skin filenames ucpTmpPtr = ucpPtr; ucpTmpPtr += m_Head.m_iOffsetSkins; m_pSkins = new SMD2Skin[m_Head.m_iNumSkins]; //Load textures for(i = 0; i < m_Head.m_iNumSkins; i++) { memcpy(m_pSkins[i].m_caSkin, ucpTmpPtr, 64); //hack off the leading parts and just get the filename char * szEnd = strrchr(m_pSkins[i].m_caSkin, '/'); if(szEnd) { szEnd++; strcpy(m_pSkins[i].m_caSkin, szEnd); } m_pSkins[i].m_Image.Load(m_pSkins[i].m_caSkin); ucpTmpPtr += 64; } delete [] ucpBuffer; return true; } | |
countainer class : | |
class CMd2 : public CModel { public: //Set skin to one of the files specified in the md2 files itself void SetSkin(unsigned int uiSkin); //Set skin to a different image void SetSkin(CImage& skin); //Load the file bool Load(const char * szFilename); //Render file at the initial position void Render(); //Render the file at a certain frame void Render(unsigned int uiFrame); //Animate the md2 model (start and end frames of 0 and 0 will loop through the WHOLE model void Animate(float fSpeed = 30.0f, unsigned int uiStartFrame = 0, unsigned int uiEndFrame = 0, bool bLoop = true); //constructors/destructo CMd2(); CMd2(const char * szFile); ~CMd2(); private: CTimer m_Timer; //file header information SMD2Header m_Head; //Frame information SMD2Frame * m_pFrames; //Triangles SMD2Tri * m_pTriangles; //Texure coords SMD2TexCoord * m_pTexCoords; //Skin files SMD2Skin * m_pSkins; //Interpolated vertices SMD2Vert * m_pVerts; //Current skin unsigned int m_uiSkin; //Using a custom skin? bool m_bIsCustomSkin; //The custom skin CImage * m_pCustSkin; }; | |
eFishAnt 14-Jan-2005 [178] | you go too fast for me...;-) I have to find some time this weekend to play with the first toys... |
shadwolf 14-Jan-2005 [179x2] | so you make a SDM2Header *m_Header; to declare your header type from structure SMD3Header, then you read the correct emont of data in the file storing it to ucpPtr then you init m_Header it using memcpy(&m_Head, ucpPtr, sizeof(SMD2Header)); |
if you want to load 3 MD2 files you need only to make other main pointer to the information you retrieve from the file | |
older newer | first last |