Announcement

Collapse
No announcement yet.

[Mod tool] Sanae 3D - (no development)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • [Mod tool] Sanae 3D - (no development)

    This is a small python tool that I'm using for converting 3D formats.

    Although the main export format is MQO, I am now primarily exporting it to xx format because SB3U has a better renderer and the xx format can store more data than the MQO.

    The goal is to allow the user (ie: me) to

    1: provide a standardized way of importing and exporting various 3D formats
    2: add support for additional format types without having to re-write much code
    3: have access to common 3D editing functions like uv-flipping and axis-flipping.
    4: allow any other expansions easily if it comes up

    Downloads

    You can get it here:

    2011-08-28: http://www.mediafire.com/?ye67dkt02ds5cs5
    -added blender 2.49 support
    -some changes to directory structure
    -minor updates to libraries

    Mediafire folder containing all previous versions as well as plugin and sample folders: http://www.mediafire.com/?s54wfhm6le23t

    Requires python to be installed.

    Plugins

    xx import/export - Ready for testing. Requires 2011-08-10 version of Sanae 3D or later

    -bounding box automatically created
    -materials auto-assigned
    -limited bone functionality. Have not figured out how to build the skeleton (the frames)
    -Any format supported can be exported to XX, with some restrictions

    -parses xx fully

    x (OBJM, OBJG, OBJI, OGJF), and xm (for Battle raper and requiem hurts)
    teatime odf and mdl

    All plugins are available in the mediafire folder unless I decide to experiment with different things.
    I've also written a bunch of plugins for various MMO's and various formats that came with specs, but I didn't upload those.

    Instructions

    Spoiler
    Only a command-line interface exists so far.
    Syntax for running it is (may differ depending on your environment settings)

    Sanae.py filename
    Sanae.py [-options] filename

    Note that I use unix-style options. Haven't fully worked out the interface.
    Also note that if it doesn't work, try

    Python Sanae.py filename ...

    The following options are supported:

    -o <filename> (specify the name of the output file
    --invert (inverts the faces)
    --flipuv <direction> (flips the uv horizontally "u" or vertically "v")
    --tri (triangulates faces. Only supports quads so far)
    --scale <num> (scales model. Only works for single-mesh models for now for some reason)

    You would write a bunch of batch scripts for common functionality like UV-flipping.

    You can import the following formats...maybe

    *MQO
    *64-bit txt .x
    *32-bit txt .x (needs revising)
    *love death .mdl
    *wavefront .obj (needs revising)
    *vindictus .smd (and other smd maybe)

    Only MQO export is supported for now. Report any bugs and send me a copy of the file (I didn't test each format very thoroughly)

    I've made it so it tries to auto-detect the input format, but it doesn't work for all formats (ie: smd). I have not implemented any way to deal with these yet.
    The above formats are ones I've come across so far and can figure out since they're basically plain text files.

    Expansion

    Each format is represented by a class. I wrote a Model3D class that provides the data structures and functions for building the object.
    Once the object has been built properly, it can then be exported to MQO easily.

    For the most part, it is a matter of parsing the file and passing the data to my functions. It's also kind of rough so datatypes are a little weird lol.

    All supported formats are stored in the "plugins" folder. Each module contains one class and a couple functions related to the class.
    This is mainly for my own convenience.
    Last edited by xTsukihime; 10-16-2011, 12:09 PM.
    Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

    3D Tools Sanae 3D | Noesis XX Plugin

    Characters: Esk (Eskmate)

  • #2
    Recently got back to this project (had to side-track a lot to figure out stuff).
    Since this is more of an instructional tool for me, most of it is simply re-inventing the wheel (all of this can be done with blender I believe, though I never looked at it. I'm just assuming it has such capability since people refer to it often)

    The concepts are still the same: mass importer/exporter between various formats.

    Some additional input formats that have been added:
    -Silkroad Online (3DC, 3DO, SMOD)
    -Aika online (msh)

    Output formats are just
    -mqo
    -obj

    1. A better plug-in system will need to be done so that definitions don't need to be added everytime a new format is added.
    2. Still can't figure out binary formats on my own, but if specs are already provided then it's pretty easy to add support. Also if existing import scripts are around.
    3. File parsing and writing in general is still a challenge for me, and hence a pretty simple text format like obj is still rather difficult to read perfectly.
    4. Forget GUI, the program is most convenient with batch files since you can just specify a bunch of options. A GUI is useless cause there's really nothing to see.

    I'm looking to add xx export support cause that's been something I've been wanting to do but couldn't (hence, Quick XX was made), but I haven't looked at the xx format and there are different formats as well...so I'll probably just add one and then let SB3U deal with conversion.
    There is no need to import xx because it's easier to use SB3U (just because it doesn't contain only meshes)

    Legal issues may arise though, as not only does it export models, but the code is right there in front of you rather than hidden behind some dll or an exe.
    So in the end maybe only the common formats will be available for sharing, unless someone clarifies for me any legal misunderstandings I have.
    Last edited by xTsukihime; 06-27-2011, 07:47 AM.
    Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

    3D Tools Sanae 3D | Noesis XX Plugin

    Characters: Esk (Eskmate)

    Comment


    • #3
      I've tried to add .x support, but there are many possible variations and I'm not using any parser package (cause I didn't want to figure out how to use them)

      I've only done 32-bit txt parsing.
      A lot of the models that have been made for miku miku dance use 32-bit .x format, so I figured it'd be nice to be able to convert them without getting any specialized tools.


      The TSO decrypter for 3D custom girl also exports the models in 32-bit .x format. It works on the ones I've tested so far, but the textures used are not stored with the .x file.

      I demonstrated poor programming design by basing the parser on the sample files rather than the original specs, so it'll probably fail on anything outside of this scope.
      Some differences between 64-bit and 32-bit .x, and I don't support 64-bit yet (cause I don't store normals and texture coords with the faces, which I should)

      =====

      Here's a lite version of what I use (since it also converts proprietary formats. Although the specs are available on the internet, probably isn't the best to just give you the code).

      Currently only mqo exporting is done in-depth. It still duplicates vertices though, which I am trying to figure out how to work out.
      obj export is pretty simple, but I haven't gotten around to it. .x export shouldn't be too hard either.

      It can read mqo and 32-bit .x formats, as well as some smd files for vindictus.
      It also reads teatime mdl files.

      Attached is a sample .x file that I used.
      Attached Files
      Last edited by xTsukihime; 06-29-2011, 05:58 AM.
      Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

      3D Tools Sanae 3D | Noesis XX Plugin

      Characters: Esk (Eskmate)

      Comment


      • #4
        I've re-designed the overall program so that it is now much more plugin-based.
        In theory, you can import and export any format provided that you can write the parser and export functions.

        This isn't going to be a serious project. My intention for this was to simply have export functions available so that I can try to figure out formats without having to bother writing exporters again and again, as well as having a set of methods that will make it easier for me to write the parsers.

        Anyways, since this is the first time I've thought about how to design a plugin system, it probably isn't the most optimal.
        The idea is fairly simple

        1: The engine first imports all of the plugins and builds definition dictionaries
        2: It then takes a file, reads the first couple bytes, and then checks whether the header matches any of the existing definitions. If a match is found, it'll use that plugin. If not, it'll try checking for extension. If both fail, it will then tell you that the file was unrecognized. Since this is only an attempt to auto-detect the format, it's not perfect, so if you know it should work, you can provide the input format manually.

        All plugins are based on the same template, which I have provided.
        They all contain a class that will represent the specific 3D object, which inherits all the methods and data structures from my Model3D class.
        They also contain three functions that will be accessed by the engine: read_file, write_file, and definitions.

        read_file just parses the file and returns a Model3D object containing all of the data required to re-create the 3D object.

        write_file takes a Model3D object and writes it out.

        definitions is the function that the engine calls when importing plugins. It will tell the engine what header this format has, its extension, and a small description of it.

        To add support for new formats, simply take the template I provide, change the class name, add a definition entry, and then write the parser function.
        You should use the methods that I provide to access the data structures, although since it's python there's no enforced encapsulation. They are located in the ModelObject module, and are not documented, though you can probably guess what they're for from the method name.

        I may change the internal structures completely in the future to make things more efficient, so to try to minimize the damage that would do, you should use methods to add stuff.

        (since everything is done with dictionaries, hashing is done repeatedly. I may as well create Vertex, Material, and Face classes like blender to avoid hashing so much).

        When working with binary formats, you should open the file in 'rb' mode and then pass it to my StructReader class. It basically implements a bunch of Struct unpacking methods so you can simply say

        Code:
        yourFile.read_float(3)
        yourFile.read_string(21)
        Rather than having to figure out how to use the Struct module.

        To make it simple for myself, I only implemented what I've used so far, which isn't much. Experienced users will immediately note that there are many options that I don't support (like endian-ness). These will be added eventually once I need them (cause I have absolutely no idea what is needed beyond what is given).

        So a very simple format might have a parser function that looks like

        Code:
        charCount = self.inFile.read_long()[0]             #length of mesh name. Index needed since it returns a tuple
        meshName = self.inFile.read_string(charCount)[0]   #mesh name
        
        self.create_object(meshName)                       #create an entry for the mesh
        
        vertCount = read_long()[0]                         #number of vertices in the mesh
        for i in range(vertCount):
            vx, vy, vz = self.inFile.read_float(3)         #position coords
            tu, tv = self.inFile.read_float(2)             #tex coords
        
            self.create_vertex(meshName, i)                #create vertex number i for this mesh
            self.add_coords(meshName, i, [vx, vy, vz])     #add position coords to the vertex
            self.add_uv(meshName, i, [tu, tv])             #add the texture coords
        
        faceCount = self.inFile.read_long()[0]             #number of faces in the mesh
        for i in range(faceCount):
            v1, v2, v3 = self.inFile.read_short(3)         #assuming they're stored as shorts
            self.create_face(meshName, i)                  #create face number i for this mesh
            self.add_face_verts(meshName, i, [v1, v2, v3]) #add indices to this face
        Right now I just toss everything into the plugins folder because I haven't figured out how to do it any other way. Technically, the ModelObject, StructReader, and any non-plugin modules should go into another folder called "lib" or something, but I don't know how to get it to work like that yet.

        Currently I only have support for the following properties cause that's all I've read about and have worked with:

        Vertex
        -x,y,z coordinates
        -normals
        -texture coords

        Material
        -material name
        -texture name
        -specular
        -emissive
        -ambient
        -power (specular coefficient I guess)
        -RGBA

        Face
        -face indices (list of vertices)
        -normals (if stored with faces)
        -texture coords (if stored with faces, like MQO files)

        Bones, weights, frames, and any other things will probably be added later when I have a better understanding of them and how I should go about storing them.

        Downoad Sanae (2011-07-05)

        PS: no error checking whatsoever. lol...maybe in the future.
        Last edited by xTsukihime; 07-06-2011, 07:13 AM.
        Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

        3D Tools Sanae 3D | Noesis XX Plugin

        Characters: Esk (Eskmate)

        Comment


        • #5
          I am currently looking at alamar's xx parsing methods and will try to add a plugin for that (don't expect anything though, since I don't support frames so I can't even create a simple xx). It look like a pretty simple and straightforward format, with a bunch of unknowns here and there but the basic stuff is easy to get. Heck, it looks cleaner than the older formats like objf or objm where they pack absolutely everything into it.

          I also want to add support for the decrypted odf format cause that would be quite an exercise since all I have is out-dated specs that don't seem to apply to later versions of the odf format.

          I have some idea how I might work with the frames. It's like

          -assign each frame an ID
          -each frame will have a parent ID field, which stores a single int that represents the parent frame.
          -each frame will have a child ID field, which stores a list of int's that represent child frames.

          Each frame will also include a transformation matrix, and which mesh(es) it possibly contains.
          Once this is figured out, I will be able to write a better .x exporter.

          A similar idea will go with bones, but I don't even know how to work with them yet.

          I don't work with blender, nor have I decided on how I might store my own format, but since I plan to export it to some common formats anyways that's supported by blender, it wouldn't be an issue.

          If you have suggestions that would improve the program, you're welcome to post them.
          If you have better plugins, it would also be nice to have, since I wrote everything from scratch rather than using existing libraries (though, partly because I chose to NOT use established packages like blender which many would argue is a stupid move. Why re-invent the wheel when blender can do all of this and much more?)

          Expect bugs, and lots of it.
          This is only meant as an instructional tool after all.
          Last edited by xTsukihime; 07-05-2011, 06:12 PM.
          Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

          3D Tools Sanae 3D | Noesis XX Plugin

          Characters: Esk (Eskmate)

          Comment


          • #6
            Here's a parser plugin for the illusion xx file. This was mainly for me to have an idea of the format before trying to write an xx exporter, as well as to get an idea of how illusion chose to store the information.

            I pretty much followed alamar's xxparser code, so it should work with anything that SB3U supports.

            It parses an xx file and creates all of the textures.
            It parses each mesh separately and stores them in the appropriate data structures.

            It appends [0], [1], [2], ... for any meshes that were originally in multiple parts (ie: face[0], face[1], face[2]). For meshes that contained only one part, I just left it as it is.
            Materials are automatically assigned.

            Just put it in the plugins folder and you should be able to export xx files.

            Seeing how the mesh section is stored, my exporter may be implemented very simply, assuming a frame structure like

            Code:
            All_Root
               Scene_Root
                  Frame1
                     Mesh1
                  Frame2
                     Mesh2
                 ...
            With identity transform matrices and no bones (since I don't support bones or frames).
            With this design, you will need to place all of the textures together with the object. You won't be able to load separate model files into the xx since I take exactly one model and then export it to something else, so you will have to merge everything together.

            The xx version will always be 3, because format conversion can be done through SB3U so there's no point in me trying to add support for that, and there isn't much information on the unknown sections that are available in version 5+ anyways.

            It should be significantly faster than building the xx with Quick XX.

            Note: Because a mesh with multiple parts uses indices to indicate that it is part of that mesh (for material index reasons), I will be doing the same when I'm exporting the xx. That is, if your "Sword" uses two materials, then you should write Sword[0] and Sword[1] as the object name, otherwise I will just treat them as two separate meshes.
            Last edited by xTsukihime; 07-31-2011, 05:07 PM.
            Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

            3D Tools Sanae 3D | Noesis XX Plugin

            Characters: Esk (Eskmate)

            Comment


            • #7
              Well, xx exporter is difficult. Perhaps I will need to improve the program first since there's no easy way to write out values as it is to read them.

              On the other hand, I followed the ODF specs I found on UV and wrote an ODF parser plugin!
              I re-uploaded the specs here

              Unfortunately it only accepts decrypted odf files. I have not managed to write a decrypter myself, so that means you won't be able to just throw an odf and expect it to work. Just use teafileconv.exe (also re-uploaded) which will decrypt all odf's.

              The plugin will be posted later as I have only tested it with a limited number of files (mostly small stuff like kitchen items, food). Another reason why it will be posted later is because I have re-written the StructReader so all plugins will have to be updated.

              Aside from the list of things I might do (understand graphic formats so I can decrypt textures myself), I'm revisiting some of illusion's older formats (starting with OBJF). The file format looks rather similar to ODF at first glance (they use tags to distinguish each section). Unfortunately no specs seem to be available.

              here is the basic outline for parsing the OBJF format (other variations OBJ% are probably similar, just with different values here and there for each struct)

              Code:
              get_filesize()
              dword_4 magic
              dword_2 key
              
              while current_position != filesize
                 char_4 tag
                 dword section_length
                 if tag == "MESH":
                    parse_mesh
                 elif tag == "MATE":
                    parse_material
                 elif tag == "TEXT":
                    parse_textures
                 elif tag == "FRAM":
                    parse_frames
                 elif tag =="ANIM":
                    parse_animation
                 elif tag == <something else>:
                    <parse that too>
                 else
                    // in case we miss something
                    print "unknown tag", tag
                    skip section_length bytes
              Each section can contain any number of structs. Figure out the struct size, and then you know number of structs = section_length / struct_size
              I would imagine it might actually be the same as ODF...only the tag names are different lol

              So far, the material and texture structs are pretty much identical, but the mesh and submeshes are different, although the difference is only in the fields in the struct. Determining the end of the mesh section is the same.

              EDIT: OBJI files have the same material, texture, and mesh structs. Seems like there's minor variations between each format, possibly because they store a specific type of model (ie: skinned, non-skinned, etc.)

              At this rate almost all illusion model formats should be supported by Sanae, though, no bones.
              Last edited by xTsukihime; 07-08-2011, 01:08 PM.
              Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

              3D Tools Sanae 3D | Noesis XX Plugin

              Characters: Esk (Eskmate)

              Comment


              • #8
                Decrypted teatime ODF parser.
                Limited testing done.

                You will need the latest version of Sanae (2011-07-08), as I've changed the StructReader to make it more intuitive (although performance takes a hit)
                You will also need the teafileconv which is available in the TTTools package from here to decrypt the odf.

                Supports love death series 2, 3, 4, 555

                UPDATE: added support for the new HCT game.

                Hopefully it doesn't break anything since I just crudely threw in some extra logic.
                Attached Files
                Last edited by xTsukihime; 07-09-2011, 05:43 AM.
                Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

                3D Tools Sanae 3D | Noesis XX Plugin

                Characters: Esk (Eskmate)

                Comment


                • #9
                  Illusion OBJF and OBJM formats.

                  Games that should be supported (based on limited testing, which is just me throwing a list of models at a batch file)

                  -Biko 2 (objf)
                  -Brutish Mine (objf)
                  -Biko 3 (objm)
                  -Des blood VR (objm)
                  -Artificial Girl 2 (objm)
                  -A-ga (objm)

                  Use IGFTool to extract the files.

                  Interestingly, although BK2 and BM both use OBJF format, their mesh structs are different. There was nothing distinguishing between the two, except that BM mesh names use the absolute path (C:\RPG\...etc) which is kind of amusing, so I basically said if it started with "C:\" then parse it as BM, else Biko 2.

                  Note that for all of these models, especially character models, the meshes are all over the place. So a person will most likely be in pieces.
                  I don't know if frame transformations are done, nor have I figured out how to even transform a mesh.

                  I'm still looking for OBJG, OBJI, and OBJX files (I had a couple, but then I forgot where. They should be in these games though).

                  OBJN, which is used in all DB4 models, looks encrypted. Khayyam can read them, so maybe I'll look at that.

                  These appear to be the only a-ga monsters:

                  Last edited by xTsukihime; 07-31-2011, 05:06 PM.
                  Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

                  3D Tools Sanae 3D | Noesis XX Plugin

                  Characters: Esk (Eskmate)

                  Comment


                  • #10
                    Wrote a teatime mdl exporter before, but figured I'll add it to Sanae as well.
                    Requires decrypted mdl file (it is a plain text file).

                    You will need to mdl555 script from here

                    That one already does batch conversion.
                    I'm planning on re-writing the mdl555 code in python cause I think it's too slow right now, although it would probably be slow in python as well until I find better ways to do it.
                    Last edited by xTsukihime; 07-31-2011, 05:06 PM.
                    Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

                    3D Tools Sanae 3D | Noesis XX Plugin

                    Characters: Esk (Eskmate)

                    Comment


                    • #11
                      Teatime's HCT (after school custom girl) has a slightly different ODF format from the previous games, though the outline is the same.

                      The struct size for the textures is 136 as opposed to 204.
                      No way to distinguish between a love death ODF and an HCT ODF, so I based it on struct size (ie: whether it's divisible or not) and then assigned some arbitrary flag for it.

                      The BANM section also differs as the section_length = sectLen + 264.

                      I have updated the ODF plugin, but now am not sure how I should structure the post.

                      Last edited by xTsukihime; 07-09-2011, 05:51 AM.
                      Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

                      3D Tools Sanae 3D | Noesis XX Plugin

                      Characters: Esk (Eskmate)

                      Comment


                      • #12
                        Updated odf plugin.

                        -love death 3 maps have different frame size than other games (720 vs 976)
                        -not all materials have textures. Previous assumed all materials have textures and didn't do any checks for this, causing it to crash.

                        Check mediafire folder for the new plugin.
                        At this rate, I might have to look at every type of model.

                        ==========

                        Found that HCT has additional parameters for the material section in their mdl format.
                        I will need to re-write the material parser to handle arbitrary number of lines rather than hardcoding it.
                        Last edited by xTsukihime; 07-09-2011, 08:43 PM.
                        Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

                        3D Tools Sanae 3D | Noesis XX Plugin

                        Characters: Esk (Eskmate)

                        Comment


                        • #13
                          I've restructured the entire program so that "library" modules actually belong in a "lib" folder while the plugins folder contains only plugins.
                          Ya, sort of late I guess, but I couldn't figure out how to get relative imports working until now.

                          Version 2011-07-13 in MF folder. All plugins must be updated to reflect the new structure if you want to use the new version.
                          I will be uploading new versions of all plugins shortly, which would be incompatible with the previous releases.

                          Well, it's not like you should hold on to any old ones when major changes occur.

                          I'm trying to add a model viewer so you can see your results immediately (this should make it more convenient), but that's a whole different story.
                          Last edited by xTsukihime; 07-13-2011, 10:37 AM.
                          Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

                          3D Tools Sanae 3D | Noesis XX Plugin

                          Characters: Esk (Eskmate)

                          Comment


                          • #14
                            Found some obji files used in brutish mine.
                            Only difference is the frame struct (252 bytes each).

                            Requiem hurts uses xm/xa files. Haven't figured that out yet.

                            I've also added support for frames, based on what I've seen from illusion games.
                            The current scheme is as follows:

                            Each frame is will be ID'd by a unique integer (frame ID). This will be automatically assigned if one does not exist.
                            Each frame will hold its name, parent ID, contained mesh (if applicable), and a frame transform matrix (16-float tuple).

                            I have not seen how frames are implemented in other places, but that is how it will be for now.

                            I've begun to add transformations as well.
                            In addition to a list of meshes, I also have a mesh dictionary that will contain information about each mesh. Right now it's just the mesh transform matrix (which will be a 16-float tuple).

                            The transformations are currently not applied automatically, so they must be explicitly called in the export function.
                            It is simply

                            Code:
                            self.obj3D.transform_meshes()
                            and then it will update all mesh vertices and construct a new vertex dictionary.
                            You should run this at the beginning of the export process.

                            So far it seems to be working for a couple samples.
                            I'm curious whether this will export the characters properly or not, cause I would assume transforms are done to each frame (and thus, all submeshes) so that they will be positioned correctly?

                            One problem that still hasn't been resolved: for illusion/teatime games, it is structured like

                            Code:
                            FRAME
                               MESH
                                  SUBMESH1
                                  SUBMESH2
                                  SUBMESH3
                            You can see this in SB3Utility.

                            The transformation matrix is defined in the frame, which is then applied to the mesh (and consequently all submeshes).
                            For me, I have to assign the matrix to the mesh and each submesh as well (since they're treated as completely separate objects), so I'll have to find a way to show the relationship between a mesh and its submeshes.
                            Last edited by xTsukihime; 07-15-2011, 03:27 PM.
                            Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

                            3D Tools Sanae 3D | Noesis XX Plugin

                            Characters: Esk (Eskmate)

                            Comment


                            • #15
                              Working on the Source MDL format, since it's well-documented.
                              Since there are many versions and I only have samples from one game (vindictus) it's basically a vindictus MDL parser.

                              One reason is that their security system kicks in whenever I try to use MDL decompiler so it's probably easier to get straight to the source.
                              So far have gotten the geometry, no material assignment though.

                              If I feel like it I might try extend this by creating a generic MDL parser and then adding extra plugins for ones with custom structs.
                              Mod Tools: Quick XX | Quick MDL Decompiler | Yuusha Rename | Yuusha Loader | GUI Plst Tool

                              3D Tools Sanae 3D | Noesis XX Plugin

                              Characters: Esk (Eskmate)

                              Comment

                              Working...
                              X