I'm forming a list of topics I want to cover in a series of video tutorials
others have said before that there is no need for anymore tutorials. However clearly people are always asking questions here on a daily basis.
So I would like to offer my own spin on things and offer my guidance on porting models to brawl
But before I do that I would like to compile a list of topics that I can discuss in the video. so that no question is left unanswered. Bare in mind, I know nothing about animation, just 3D editing.. such as porting
anyways here's my current outline, feel free to critiqued it and add in anything you want covered.
Quote
Porting WalkThrough
1. Overview Discuss what will be covered, and the various softwares required. Discuss the Scene, example where to get models
2. Playing SSBB On PC Walkthrough the process of installing the Dolphin Emulator and running SSBB Demostrate how to install a mod to the virtrual SDcard
3. 3DSMAX Warning Advisory about Max2012 and Max2013 (Buggy) Introduction to using 3dsmax and its enviroment.
4. Models Where to get models How to get the textures to show Fixing Common Mesh/Texture Problems Fixing Smoothing Issues How to handle double sided polygons (DDF Script)
5. Rigging (Basic) DAE/Collada Plugins and the Correct Versions Use DAE<=>FBX Converter, if Using Max2009 or lower Using a Ripped model on a pre-exsisting brawl skeleton Tips on how to get your model to fit that skeleton Importing a model from brawlbox and demostrating how SKIN works. Adding SKIN to your model and assigning vertex weights How to use "Paint" and the "Weight Tool" to assign vertex weights Tips on weighting, such as Blending and Mirroring Using the Animation Slider to test your Weights
6. Rigging (Advanced) How to ProOptimize if your model is too large Remap UV Layout to get the most out of your texture resolution Planning Ahead for Face Expressions etc How to Bake Shadows and Lighting into your Model How to UVwrap if your model
7. Exporting Cut your model by Texture group (Detachby ID Script) Set Vertex Normals (-90)
8. Compiling Export from 3DSmAX to BrawlBox Getting Textures to BrawlBox Make sure all textures have dimensions multiple of 2 Set Desired Material Effects Using Shaders Set Attachments for Face Expressions Testing in Dolphin
9. Brawl Vault Introduction to using Brawl Vault How to Make a Rad Render of your Import in 3DSmax How to Replace your Character Select Picture (CSP) How to Publish your Work
I wanted to get the models from this game, and figured I would store my progress here.. others can follow and help or learn whatever.
So far I've got the files extracted and have just been looking over the file formats.. I usually start by finding my target file.. a file that contains model data. Then I write a quick tool to import vertices from the file, that lets me take pokes at the data. Then I can make a determination on if I have targeted the right file or not...
If everythings cool, I further inspect the file, trying to search for patterns. Once the patterns are found you can start to form an idea of how the file is written. And further from that you'll be able to find adderss tables or counts that you'll need to help you automate reading of the file...
Now if your interested in how to get data files off your game disc, this is what I did last night; - Download imgBurn (www.imgburn.com) use that to make a copy of your disc into a ISO file - Use CUE's ISO extractor on your ISO file (http://www.romhacking.net/forum/index.php?topic=7790.15) > I had to compile it, here download my exe, compiled on win7 64bit (http://dl.dropbox.com/u/86746436/StarOcean3_dumptools.7z) requires 7zip to unpack > the tool is command line here is an example of what to type "triAce-PS2.exe starocean3.iso C:\starocean3\"
and thats about it, your files spit out, but they'll be alot of different file types. SLZ files are compressed and should be uncompressed using either the BMS script or CUE's slz.exe program.. which you can just drag and drop files to
As far as the file cracking, heres a pic of the FPS format, which I believe to be the mesh file.
That pattern near the end is a repeating pattern, so infact they are the vertices that makeup the model. for every 3 vertices a face is formed between them.. so its pretty simple. the start of the file contains information on how to make a program read these vertices automatically for us..
Anyway just wanted to post this, it'll likely be well into the weekend before I get time to do anything
A free program called "123D CATCH" http://www.123dapp.com/catch takes a series of photos and stitches them together into a full 3D model!
I've been messing with it for the last few weeks, and for a free program it isn't half bad ^_^ Thought I would share this little treasure with the rest of you guys. I'm going to be trying to port myself into brawl ^_^
You can see CATCH was able to reconstruct a 3D scene, just from a variety of 40 photos take around me.
I'm happy with the amount of detail that CATCH was able to capture from my images.
The unfortunate thing, is that the models are too large for brawl to use. So I've been modeling a low mesh in 3dsmax, to transfer the texture over to.
Here are some PVC figures I used CATCH on aswell. I had planned to port them to brawl... but it would be easier just to model from from scratch. rather then trying to Tpose a slop of vertices :\
Does anyone know where the vertex weights are located?
in sabretooth's old MDL0 notes, he notes that the weights are in the nodeMix.. but editing that doesn't seem to have any effect. I believe that file may just give information about the vertex weights.
the only other logical place the weights would be, is in the Polygon files.. but I dont see how?
doesnt anyone have an idea? this is important for vertexhacking
<this is a repost of my original "unanswered" question>
Hey guys, I'm new to brawl modding, but not a n00b to modding, I can get myself around 2d/3d and hex editors..
but anyways I'm having an issue trying to get models into brawl.
First I ripped Aya from onechanbara, and based on the MDL0 guides, after all this hexing the model should work in game.
but every time I load it as a stage, or character, it crashes.. with an annoying buzzing sound is there something I overlooked in the tutorial... do I have to include a certain file, or rename all the bones O_o the guides just all end.. saying it should now load in brawl
This is just a central place to put any new hacks I'm doing.. updates etc... random stuff that will be planned and constructed until fully beta tested and uploaded officially.
THIS TUTORIAL IS OBSOLETE! BRAWLBOX ALLOWS FOR FULL MODEL IMPORT
[WARNING: this tutorial is just a quick mockup, and isn't 100% complete]
Hello everybody!
I'm mariokart64n, I've been doing texture and model hacks\mods for the past 5 years. admitlying I wasn't good at using paintshop or 3dsmax, until 2 years ago.. it took 3 years! just to get the hang of it. so that being said, this topic is a guide geared towards the elite modders, you should already have a good grasp of how to navigate and use 3dsmax, and any sort of 2D editor, such as Adobe's Photoshop.
if you are new to 3dsmax, and never used a 3D editor in the past, or have no concept of what HEX is.. then this is the wrong guide for you. please refer to KC-MM's video on vert hacking, to get an idea oh what we are doing here.
#Invalid YouTube Link#
Otherwise, lets get this show on the road!...
Overview: Basically we'll be taking the basic technique of the above video and improving apon the procedure to give us more control over how we edit.
by using the aid of 2 other apps, we can now create full body edits, like never before! Below are the basic steps of what you'll be doing. please read them before watching the 2hour Video Tutorial.
Outline: 1. import the DAE from AIS 2. Edit whatever you want 2B under the conditions I stated before ..dont add delete.. change to poly 3. once you are ready to export back, you need to create a patch 4 create a patch by starting a new scene in max 5 import the DAE again 6 highlight the mesh you were working on before and click "create patch" on my script it'll prompt you to open the vertset export the vert set as usually as per the old DDVB tut so it'll be named vertex.ddf a patch will be made ( this is a difference file ) to help roughly push most of the verts where they need to be 7 then just open you edited max scene, highlight your edit mesh, click patch on my maxscript to apply the patch 8 model should now cluster back into a raw but it wont be 100% right follow the end part of the DDVB tut you'll need to use some trial and error to fix the not working spots
if you want, here is a theory video, talking about only the basic steps, which are stated above
#Invalid YouTube Link#
Frequently Asked Questions: [-UnderConstruction-]
Video Guide: Please be aware half way through the video I lost all my data. I tried to finish the end of it, but it was 1AM in the morning. after rewatching it, my speech is really splurd lol anyway I apologize and if you need further clarification, I'll be glad to help.
YOU CAN FIND THE FILES AND DOWNLOADS AT THE END OF THIS POST
Vishkugeta Did a very excellent written guide on the process you might want to read it over, its sure to be more comprehensive then my videos.
How to do the new vertex method without DasDonkey Vertex Box (+ Without Patching)
In this tutorial I'm going to be making Ness' head bigger. You can do whatever you want, but this is just an example. Mariokart's new script makes it so DasDonkey Vertex box isn't needed anymore, and the only tutorials that mariokart has up are videos, so this is for people who want to take things at their own pace. The reason why it's good to not use DasDonkey Vertex Box anymore, is that vertex sets that previously didn't work (Peach's crown, Pokemon Trainer's hat/hair, etc) should work now.
First, export the .brres of the first model data.
You'll need to download AiS which converts the .brres into a .dae, so you can open it in 3DS max. For this to work, make sure that the .brres contains a model which is unedited. If it is edited, then AiS will not work and will simply make a log file. You can download AiS here: http://cid-c59ea3c98a300f31.skydrive.live.com/self.aspx/.Public/Programs/ais0.1.3.zip
Next, export the vertex group that you want to edit in Brawlbox.
Now open 3DS Max 8 (and note that this only works in Max 8 not 9, 2008, 2009 or 2010), and run mariokart64n's script:
Code:
fn readBEshort fstream = ( short = readshort fstream #unsigned short = bit.swapBytes short 1 2 return short ) fn readBElong fstream = ( long = readlong fstream long = bit.swapBytes long 1 4 long = bit.swapBytes long 2 3 return long ) fn ReadBEfloat fstream = ( fpt=readfloat fstream itger = bit.floatAsInt fpt hih = bit.intashex itger while hih.count < 8 do hih = "0" + hih shn = (substring hih 7 2) + \ (substring hih 5 2) + \ (substring hih 3 2) + \ (substring hih 1 2) bit.intAsFloat (bit.hexasint shn) ) -- fn floatSwap2 f = ( -- i = bit.floatAsInt f -- h = bit.intashex i -- while h.count < 8 do h = "0" + h -- s = (substring h 7 2) + (substring h 5 2) + (substring h 3 2) + (substring h 1 2) -- bit.intAsFloat (bit.hexasint s) -- ) fn WriteBEFloat fnum = ( intgr = bit.floatAsInt fnum honey = bit.intashex intgr while honey.count < 8 do honey = "0" + honey sign = (substring honey 7 2) + \ (substring honey 5 2) + \ (substring honey 3 2) + \ (substring honey 1 2) xintgr=bit.intAsFloat (bit.hexasint sign) return xintgr )
on edt1 entered txt do( if txt != "" do( typedOffset=txt as float if typedOffset<=0 do( typedOffset=typedOffset*-1 ) local typedOffset ) )
on btn1 pressed do( fsource = GetOpenFileName \ caption:"Brawl Vert Import" types: \ "All files (*.*)|*.*|" f= fopen fsource "rb" fpath= getFilenamePath fsource fname = getFilenameFile fsource
vertArray=#() uvwArray=#() faceArray=#()
fSize=readBElong f mdlOffset=readBElong f dataOffset=readBElong f strOffset=readBElong f vertID=readBElong f vUkn1=readBElong f --flag? is XYZ? dataType=readBElong f entryStride=readBEshort f numVertices=readBEshort f eMinX=readBEfloat f eMinY=readBEfloat f eMinZ=readBEfloat f eMaxX=readBEfloat f eMaxY=readBEfloat f eMaxZ=readBEfloat f pad=readBElong f pad=readBElong f
if entryStride==12 then( for x = 1 to numVertices do( vX=readBEfloat f vY=readBEfloat f vZ=readBEfloat f append vertArray[vX,vY,vZ] append uvwArray[0,0,0] ) ) else( for x = 1 to numVertices do( vX=readBEfloat f vY=readBEfloat f vZ=0 append vertArray[vX,vY,vZ] append uvwArray[0,0,0] ) )
on btn2 pressed do( doVerts=chk5.checked doUVs=rdo1.state do3DS=chk1.checked doDUMP=chk2.checked doMDL=chk3.checked doOffset=chk4.checked if doUVs==1 do( obj=getCurrentSelection() obj.pos = [0,0,0] obj.rotation = quat 0 0 0 0 local mdlSize="" local mdlOffset="" local numEntrtices="" -- if doOffset==true then( fsource = GetOpenFileName \ caption:"Select UVSet to Replace" types: \ "All files (*.*)|*.*|" f=fopen fsource "rb" mdlSize=readBElong f-64 mdlOffset=(readBElong f*-1)+64 dataOffset=readBElong f strOffset=readBElong f vertID=readBElong f vUkn1=readBElong f --flag? is XYZ? dataType=readBElong f entryStride=readBEshort f numEntrtices=readBEshort f fclose f
) else(
for g = 1 to obj.count do( tmesh = snapshotAsMesh obj[g] num_verts = tmesh.numverts num_uvws = tmesh.numtverts num_faces = tmesh.numfaces
print "ffff" print mdlOffset for wr = 1 to mdlOffset do( read=readbyte f write=writebyte s read )
fseek f -34 #seek_cur lenCheck=readBEshort f fseek f 32 #seek_cur
if numEntrtices==lenCheck then(
for g = 1 to obj.count do( tmesh = snapshotAsMesh obj[g] num_verts = tmesh.numverts num_uvws = tmesh.numtverts num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
for t = 1 to numEntrtices do( tv=getVert tmesh t nSwap=writeBEfloat tv[1] write=writelong s (bit.floatasint nSwap) nSwap=writeBEfloat tv[2] write=writelong s (bit.floatasint nSwap) nSwap=writeBEfloat tv[3] write=writelong s (bit.floatasint nSwap) )
-- for p = 1 to padding do( -- write=writelong s 0 -- write=writelong s 0 -- )
delete tmesh )
fseek f (mdlOffset+(numEntrtices*12)) #seek_set for wr = 1 to (fsize-(mdlOffset+(numEntrtices*12))) do( read=readbyte f #unsigned write=writebyte s read ) messageBox "DONE!" ) else( gc() fclose f fclose s deleteFile (fpath+fname+fext) renameFile (fpath+fname+"_backup"+fext) (fpath+fname+fext) messageBox "ERROR! Wrong Offset?" )
-- if doOffset==true then( fsource = GetOpenFileName \ caption:"Select UVSet to Replace" types: \ "All files (*.*)|*.*|" f=fopen fsource "rb" mdlSize=readBElong f-64 mdlOffset=(readBElong f*-1)+64 dataOffset=readBElong f strOffset=readBElong f vertID=readBElong f vUkn1=readBElong f --flag? is XYZ? dataType=readBElong f entryStride=readBEshort f numEntrtices=readBEshort f fclose f
) else(
for g = 1 to obj.count do( tmesh = snapshotAsMesh obj[g] num_verts = tmesh.numverts num_uvws = tmesh.numtverts num_faces = tmesh.numfaces
print "ffff" print mdlOffset for wr = 1 to mdlOffset do( read=readbyte f write=writebyte s read )
for g = 1 to obj.count do( tmesh = snapshotAsMesh obj[g] num_verts = tmesh.numverts num_uvws = tmesh.numtverts num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
if num_uvws!=0 then( for t = 1 to numEntrtices do( tv=getTVert tmesh t nSwap=writeBEfloat tv[1] write=writelong s (bit.floatasint nSwap) nSwap=writeBEfloat tv[2] write=writelong s (bit.floatasint nSwap) ) ) else( for t = 1 to numEntrtices do( tv=getVert tmesh t nSwap=writeBEfloat tv[1] write=writelong s (bit.floatasint nSwap) nSwap=writeBEfloat tv[2] write=writelong s (bit.floatasint nSwap) ) )
-- for p = 1 to padding do( -- write=writelong s 0 -- write=writelong s 0 -- )
delete tmesh )
fseek f (mdlOffset+(numEntrtices*8)) #seek_set for wr = 1 to (fsize-(mdlOffset+(numEntrtices*8))) do( read=readbyte f #unsigned write=writebyte s read )
) gc() fclose f fclose s )
on btn3 pressed do( fsource = GetOpenFileName \ caption:"Brawl Vert Import" types: \ "All files (*.*)|*.*|" f= fopen fsource "rb" fpath= getFilenamePath fsource fname = getFilenameFile fsource
vertArray=#() uvwArray=#() faceArray=#()
fSize=readBElong f mdlOffset=readBElong f dataOffset=readBElong f strOffset=readBElong f vertID=readBElong f vUkn1=readBElong f --flag? is XYZ? dataType=readBElong f entryStride=readBEshort f numVertices=readBEshort f eMinX=readBEfloat f eMinY=readBEfloat f eMinZ=readBEfloat f eMaxX=readBEfloat f eMaxY=readBEfloat f eMaxZ=readBEfloat f pad=readBElong f pad=readBElong f
for x = 1 to numVertices do( vX=readBEfloat f vY=readBEfloat f vZ=readBEfloat f append vertArray[vX,vY,vZ] append uvwArray[0,0,0] )
obj=getCurrentSelection() obj.pos = [0,0,0] obj.rotation = quat 0 0 0 0 max modify mode addModifier obj (edit_poly()) subobjectLevel = 1 -- modPanel.setCurrentObject obj.modifiers[#Edit_Poly] diffArray=#() directionArray=#() for x = 1 to numVertices do( $.modifiers[#Edit_Poly].SetSelection #Vertex #{} $.modifiers[#Edit_Poly].Select #Vertex #{x} vert=$.modifiers[#Edit_Poly].GetVertex x -- $.modifiers[#Edit_Poly].SetOperation #Transform
createFile (fpath+fname+"_patch.pta") s = fopen (fpath+fname+"_patch.pta") "ab" vcount=writelong s numVertices for x = 1 to numVertices do( write=writefloat s (diffArray[x][1]) write=writefloat s (diffArray[x][2]) write=writefloat s (diffArray[x][3]) write=writelong s 0x0 )
vertArray=#() vcount=readlong f #unsigned for x = 1 to vcount do( vX=readfloat f vY=readfloat f vZ=readfloat f dmy=readshort f #unsigned side=readshort f #unsigned append vertArray[vX,vY,vZ,side] )
disableSceneRedraw() st = timestamp() --get start time in milliseconds undo off( geo=$polygon* -- print geo for x = 1 to geo.count do( addModifier geo[x] (Normalmodifier ()) geo[x].modifiers[#Normal].flip = on addModifier geo[x] (smooth ()) geo[x].modifiers[#Smooth].smoothingBits = 1 collapseStack geo[x] m2010=chk6.checked if m2010==true do( --rotate geo[x] (quat -1 0 0 0) geo[x].scale = [2.54,2.54,2.54] ) ) delete $helpers for x = 1 to geo.count do( -- aBox = Box length:0.2 width:0.2 height:0.2 name:"dummy" aBox = Box() aBox.rotation = quat 0.707107 0 0 0.707107 convertTo aBox TriMeshGeometry ) dmy=$Box* myBoxes=#() myMeshes=#() for x = 1 to geo.count do( objA= dmy[x] objB= geo[x] append myBoxes objA append myMeshes objB )
for x = 1 to geo.count do( myBoxes[x].name = myMeshes[x].name attach myBoxes[x] myMeshes[x] )
for x = 1 to geo.count do( for i = 1 to 8 do( delete geo[x].verts[#{1}] ) addModifier geo[x] (Morpher ()) )
addModifier $Polygon* (Edit_Mesh ())
) et = timestamp() --get end time in milliseconds enableSceneRedraw() gc() print ("Operation Completed In: "+(((et-st)/60)as string)+" Seconds") --print time to finish ) )
createDialog DDV
At the top of 3DS max, you'll find that it says MAXScript. Press new script and a box will open up. Copy mariokart's script and paste it in there. Then save it as whatever you like. (I saved it as "vertex"). Now you'll have to run the script and you'll see that a box that says "Vertex Modding Patcher" will open up.
However, this can be fixed easily. Make sure that "Scale AIS Import" is selected in the Vertex Modding Patcher and press "Fix AiS Import". Scale AIS Import will correct the size of the model so you don't need to make over exaggerated changes for something to look correct in Brawlbox.
There, the model looks normal now.
Now what you do, is choose the polygon that you want to edit. Since I'm editing Ness' face, I'll right click on his face and press "Hide unselected".
Creepy, eh? XD
Now in the Vertex Modding Patcher, click "Import Verts". Select the vertex set which you previously exported from Brawlbox.
The vertex group is now opened up. They won't show up unless you click the button (the one with the three red dots), but you don't need them to show up anyways.
Now that that's done, on the right you should see something that says "Modifier List". Below that is something that says:
+ Edit Mesh Morpher + Editable Mesh
Click Morpher. Below, you should see buttons that say "-empty-" and "0.0" beside them.
Right click on the first "-empty-" and press "Pick from scene". Then press "H" on your keyboard.
This box should show up. Select your vertex set, and then press Pick.
There, now leave that as it is. (We'll come back to it later) Above that, click "+ Edit Mesh" and now you can start editing as you wish like you normally would.
Now that we're done with the editing...
Go back to "Morpher" and raise the "0.0" up to 100.
As you can see, the model looks messed up now. Don't worry though, that's normal.
Next, you have to lay the model on it's back. You can either do the hard way or the easy way. The hard way being rotating the model by yourself and making sure the angles at the bottom (X, Y and Z) say 0, or by doing the easy way which is:
Press "B" and then "P" on your keyboard. It changes the view of the window. "B" lays it on it's back, and "P" puts it back into your perspective view.
Now click on your model and on the right side, right click on +Edit Mesh and press Collapse All.
A warning will pop up, but just press "Yes".
Now press "H" on your keyboard and select the vertex set.
Go to Modifier List and then select Morpher. Right click the -empty- like before, but this time click the polygon/model and raise the 0.0 up to 100.
In Brawlbox, export the model (FitNess00 in my case) and check the MDL0 Offset of your vertex set.
Now go back to the Vertex Modding Patcher box and write down the MDL0 Offset in the box. Make sure that Read Offset from file is unchecked or you'll get an error. (in the pic it's not unchecked though, but don't mind that).
Then press Export Verts and choose your model that you exported.
Replace the model in brawlbox, and success! Now you can go edit other parts to make the model look even better.
History(Optional Read) Ok, AIS is the only other "functional" brawl converter. you can use this instead of that whack DDVB method of going through animator to get your 3ds file
AIS however was built on free collada, now no longer in exsistance.. although google for MaxCollada, it's probably still floating around. but unlikely for max2011 or 2010, or 2009 .. Personally I'm running max8
once you import the DAE "Collada" into 3dsmax, the names should match up to the names in brawlbox. so say you dumped polygon2's Vertset from brawlbox.. it'll be the exact same vert set used by the imported model from AIS. essentially brawl box and AIS are just reading the same data, therefore this data is interchnagable. by that i mean the verts, faces, and uvs.. etc etc.. I could if I wanted replace ta models skin weights, texture corrdinates etc just by exporting the off the mesh imported from AIS.
the DDVB method is crappy, and outdated. though not as difficult to do, from a modders standpoint. my method requires more knowledge!
sucks brawl box doesnt support export import.. shame on krystal..
once you've gotten the AIS mesh is, edit it to your hearts content.. just don't delete or add anything to the model.. like faces, or vertices.. and remember. NEVER CONVERT TO EDITABLE POLY
The "real" problem is when your ready to place those new edits now back into brawl... we just need to get that data back into a raw form, so we can re-inject using DDVB
understand that the verts that are stored in the PAC/BRRES/MDL0 are effected by positioning data, and the bone matrix that form the fully assembled mesh. its extremely hard to compensate for that, without reversing the entire model format. and besides some really hard to follow source code.. there is no format spec on the MDL0 format
anyway.. I attempted to create a maxscript to generate a polyedit modifier, that you can use in 3dsmax. and sort of roughly patch back the positioning corrdinates of the RAW vertset.
unfortunately, without reading the bones and their weight values, I cannot compensate for the matrix that would be effecting the verts.. so there is alot of trial and error that must take place in order for it to work again in brawl/ brawlbox
Conclusion: basically my method has its pros and cons, just as the old DDVB method does but the advantage of full figure editing is something I'm willing to wager will put me above the rest although you could stick with the old DDVB method, only take my method and apply faces that way you dont work with full figure, and dont have out of alignment verts
I'm basically remodeling from scratch in 3dsmax then moving verts dozens of times until it works properly in brawlbox lol
sadly my maxscript isn't complete, and is more or less a BETA.. a very early beta.. it lacks the main function I was meaning to get to, which is direct injection. no more brawl box, or DosDonkeyVertexBox
on edt1 entered txt do( if txt != "" do( typedOffset=txt as float if typedOffset==undefined do( typedOffset=0 messageBox "Error: User Input \n Value Cannot be Identified \n as either a dec or hex number" ) if typedOffset<=0 do( typedOffset=typedOffset*-1 ) local typedOffset ) )
on btn1 pressed do( fsource = GetOpenFileName \ caption:"Brawl Vert Import" types: \ "All files (*.*)|*.*|" if fsource!=undefined do( f= fopen fsource "rb" fpath= getFilenamePath fsource fname = getFilenameFile fsource
vertArray=#() uvwArray=#() faceArray=#()
fSize=readBElong f mdlOffset=readBElong f dataOffset=readBElong f strOffset=readBElong f vertID=readBElong f vUkn1=readBElong f --flag? is XYZ? dataType=readBElong f entryStride=readBEshort f numVertices=readBEshort f eMinX=readBEfloat f eMinY=readBEfloat f eMinZ=readBEfloat f eMaxX=readBEfloat f eMaxY=readBEfloat f eMaxZ=readBEfloat f pad=readBElong f pad=readBElong f
if entryStride==12 then( for x = 1 to numVertices do( vX=readBEfloat f vY=readBEfloat f vZ=readBEfloat f append vertArray[vX,vY,vZ] append uvwArray[0,0,0] ) ) else( for x = 1 to numVertices do( vX=readBEfloat f vY=readBEfloat f vZ=0 append vertArray[vX,vY,vZ] append uvwArray[0,0,0] ) )
on btn2 pressed do( doVerts=chk8.checked doUVs=rdo1.state do3DS=chk1.checked doDUMP=chk2.checked doMDL=chk3.checked doOffset=chk4.checked if doUVs==1 do( obj=getCurrentSelection() obj.pos = [0,0,0] obj.rotation = quat 0 0 0 0 local mdlSize="" local mdlOffset="" local numEntrtices="" -- if doOffset==true then( fsource = GetOpenFileName \ caption:"Select UVSet to Replace" types: \ "All files (*.*)|*.*|" if fsource!=undefined do( f=fopen fsource "rb" mdlSize=readBElong f-64 mdlOffset=(readBElong f*-1)+64 dataOffset=readBElong f strOffset=readBElong f vertID=readBElong f vUkn1=readBElong f --flag? is XYZ? dataType=readBElong f entryStride=readBEshort f numEntrtices=readBEshort f fclose f
) ) else(
for g = 1 to obj.count do( tmesh = snapshotAsMesh obj[g] num_verts = tmesh.numverts num_uvws = tmesh.numtverts num_faces = tmesh.numfaces
print "ffff" print mdlOffset for wr = 1 to mdlOffset do( read=readbyte f write=writebyte s read )
fseek f -34 #seek_cur lenCheck=readBEshort f fseek f 32 #seek_cur
if numEntrtices==lenCheck then(
for g = 1 to obj.count do( tmesh = snapshotAsMesh obj[g] num_verts = tmesh.numverts num_uvws = tmesh.numtverts num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
for t = 1 to numEntrtices do( tv=getVert tmesh t nSwap=writeBEfloat tv[1] write=writelong s (bit.floatasint nSwap) nSwap=writeBEfloat tv[2] write=writelong s (bit.floatasint nSwap) nSwap=writeBEfloat tv[3] write=writelong s (bit.floatasint nSwap) )
-- for p = 1 to padding do( -- write=writelong s 0 -- write=writelong s 0 -- )
delete tmesh )
fseek f (mdlOffset+(numEntrtices*12)) #seek_set for wr = 1 to (fsize-(mdlOffset+(numEntrtices*12))) do( read=readbyte f #unsigned write=writebyte s read ) messageBox "DONE!" ) else( gc() fclose f fclose s deleteFile (fpath+fname+fext) renameFile (fpath+fname+"_backup"+fext) (fpath+fname+fext) messageBox "ERROR! Wrong Offset?" )
-- if doOffset==true then( fsource = GetOpenFileName \ caption:"Select UVSet to Replace" types: \ "All files (*.*)|*.*|" if fsource!=undefined do( f=fopen fsource "rb" mdlSize=readBElong f-64 mdlOffset=(readBElong f*-1)+64 dataOffset=readBElong f strOffset=readBElong f vertID=readBElong f vUkn1=readBElong f --flag? is XYZ? dataType=readBElong f entryStride=readBEshort f numEntrtices=readBEshort f fclose f
) ) else(
for g = 1 to obj.count do( tmesh = snapshotAsMesh obj[g] num_verts = tmesh.numverts num_uvws = tmesh.numtverts num_faces = tmesh.numfaces
print "ffff" print mdlOffset for wr = 1 to mdlOffset do( read=readbyte f write=writebyte s read )
for g = 1 to obj.count do( tmesh = snapshotAsMesh obj[g] num_verts = tmesh.numverts num_uvws = tmesh.numtverts num_faces = tmesh.numfaces
padding=((mdlSize/8)-numEntrtices)
if num_uvws!=0 then( for t = 1 to numEntrtices do( tv=getTVert tmesh t nSwap=writeBEfloat tv[1] write=writelong s (bit.floatasint nSwap) nSwap=writeBEfloat tv[2] write=writelong s (bit.floatasint nSwap) ) ) else( for t = 1 to numEntrtices do( tv=getVert tmesh t nSwap=writeBEfloat tv[1] write=writelong s (bit.floatasint nSwap) nSwap=writeBEfloat tv[2] write=writelong s (bit.floatasint nSwap) ) )
-- for p = 1 to padding do( -- write=writelong s 0 -- write=writelong s 0 -- )
delete tmesh )
fseek f (mdlOffset+(numEntrtices*8)) #seek_set for wr = 1 to (fsize-(mdlOffset+(numEntrtices*8))) do( read=readbyte f #unsigned write=writebyte s read )
) ) gc() fclose f fclose s )
on btn3 pressed do( fsource = GetOpenFileName \ caption:"Brawl Vert Import" types: \ "All files (*.*)|*.*|" if fsource!=undefined do( f= fopen fsource "rb" fpath= getFilenamePath fsource fname = getFilenameFile fsource
vertArray=#() uvwArray=#() faceArray=#()
fSize=readBElong f mdlOffset=readBElong f dataOffset=readBElong f strOffset=readBElong f vertID=readBElong f vUkn1=readBElong f --flag? is XYZ? dataType=readBElong f entryStride=readBEshort f numVertices=readBEshort f eMinX=readBEfloat f eMinY=readBEfloat f eMinZ=readBEfloat f eMaxX=readBEfloat f eMaxY=readBEfloat f eMaxZ=readBEfloat f pad=readBElong f pad=readBElong f
for x = 1 to numVertices do( vX=readBEfloat f vY=readBEfloat f vZ=readBEfloat f append vertArray[vX,vY,vZ] append uvwArray[0,0,0] )
obj=getCurrentSelection() obj.pos = [0,0,0] obj.rotation = quat 0 0 0 0 max modify mode addModifier obj (edit_poly()) subobjectLevel = 1 -- modPanel.setCurrentObject obj.modifiers[#Edit_Poly] diffArray=#() directionArray=#() for x = 1 to numVertices do( $.modifiers[#Edit_Poly].SetSelection #Vertex #{} $.modifiers[#Edit_Poly].Select #Vertex #{x} vert=$.modifiers[#Edit_Poly].GetVertex x -- $.modifiers[#Edit_Poly].SetOperation #Transform
createFile (fpath+fname+"_patch.pta") s = fopen (fpath+fname+"_patch.pta") "ab" vcount=writelong s numVertices for x = 1 to numVertices do( write=writefloat s (diffArray[x][1]) write=writefloat s (diffArray[x][2]) write=writefloat s (diffArray[x][3]) write=writelong s 0x0 )
on btn4 pressed do( fsource = GetOpenFileName \ caption:"Brawl Vert Patcher" types: \ "Patch(*pta)|*.pta|All files (*.*)|*.*|" if fsource!=undefined do( f= fopen fsource "rb" fpath= getFilenamePath fsource
vertArray=#() vcount=readlong f #unsigned for x = 1 to vcount do( vX=readfloat f vY=readfloat f vZ=readfloat f dmy=readshort f #unsigned side=readshort f #unsigned append vertArray[vX,vY,vZ,side] )
disableSceneRedraw() st = timestamp() --get start time in milliseconds undo off( delete $helpers if chk7.checked==true then( geo=getCurrentSelection() delete $helpers stuff=#() if geo.count!=0 do( for x = 1 to geo.count do(
for x = 1 to geo.count do( myBoxes[x].name = myMeshes[x].name attach myBoxes[x] myMeshes[x] )
for x = 1 to geo.count do( for i = 1 to 8 do( delete geo[x].verts[#{1}] ) addModifier geo[x] (Morpher ()) ) addModifier $Polygon* (Edit_Mesh ()) ) ) et = timestamp() --get end time in milliseconds enableSceneRedraw() gc() print ("Operation Completed In: "+(((et-st)/60)as string)+" Seconds") --print time to finish ) )
createDialog DDV
EDIT
Quote
[OLD POST, NOT REVIEWED OR EDITED YET....] after that failure, I turned to vertex hacking.. which seems like a sound method. however I found that the current method only just modifies the raw dump of the vertices.. so everything clumped in the middle GAWD! O.O insane...
So I used Pharrox's AIS converter to import the model parts.. but the models are repositioned and fully built.
the good part is that I can now morph the fully assembled mesh into the vert cloud. making it easier to work with.. but not so great for a full character edits
I'm was thinking that it be ok to make edits to the full assembled mesh. then reform it back into the vert cloud. so I scripted a tool to move the assembled mesh into the raw vert cloud. this creates a patch, which when supplied should offset the coordinates back into a cloud position... its simple math. A - B = C (therefore) A + C = B (and) B + C = A
C is my patch, which would make the necessary offsets to reform my assembled mesh back into a cloud position..
WELL... my theory was totally wrong.. when the practice is put into motion, I get a problem... the entire left side of the model enlarges O_O!! but only on the mesh parts that rotated.. hard to explain.. but a offsetting trick only works effective against shifted verts.. rotated ones seem to be a special case.. I'm uncertain how to compensate for that :\
any ideas on tricks to fix this ? or even what I did wrong with my initial MDL0 Swap mdl also included in RS link
Please Help Me...
-Mario_Kart64n
spent all day trying to get this right. its' not perfect, but the base for Aya is complete. now for the skinning, and the head and hair are a new day of problems :\