i3d plugin for Blender 3.6

Discuss your upcoming modding & editing projects here or shout out some ideas.
User avatar
NilsZ
Major
Posts: 437
Joined: Sun Dec 29, 2013 8:19 pm
Location: Germany

i3d plugin for Blender 3.6

Unread post by NilsZ » Tue Aug 29, 2023 9:41 pm

Hey guys,

as the title says I made a i3d plugin for Blender version 3.6. The plugin is based on blenders .3ds plugin. Sadly the plugin is not so far that we can get rid of 3ds max 3. At the moment it can only be used as "bridge" to convert models for Hidden and Dangerous Deluxe. (3ds format supports only 12 characters filenames for textures and has a buggy blender plugin)

The importer is more or less untouched compared to the 3ds plugin.

The exporter has following things supported at the moment:
- meshes with correct pivots and positions
- materials incl. long filenames
- UV maps

Not supported yet:
- Dummies
- Animations
- Bones
- NURBS
- Properties

The direct import from blender to hidden and dangerous is also not possible at the moment. HDD can't read the mesh geometry while 3ds max 3 somehow can. I need to fix that in the future.

To install just put the folder in %blender root dir%\3.6\scripts\addons and enable the plugin in preferences.

Have fun! thup01
Blender3.6 i3d plugin v0.1.7z
(23 KiB) Downloaded 987 times
Last edited by NilsZ on Wed Aug 30, 2023 9:23 am, edited 1 time in total.

User avatar
NilsZ
Major
Posts: 437
Joined: Sun Dec 29, 2013 8:19 pm
Location: Germany

Re: i3d plugin for Blender 3.6

Unread post by NilsZ » Tue Aug 29, 2023 9:45 pm

alps1.jpg
alps1.jpg (243.5 KiB) Viewed 69265 times
A little preview of the alps1 map from HD2 imported to HDD using 4ds tools for blender and i3d plugin.

battlefeel1942
Private
Posts: 14
Joined: Thu Jun 29, 2023 1:52 am

Re: i3d plugin for Blender 3.6

Unread post by battlefeel1942 » Fri Feb 16, 2024 2:58 am

I couldn't seem to preserve the UVMap when I loaded an i3d file from HD1 into Blender :/. We're you able to?

User avatar
NilsZ
Major
Posts: 437
Joined: Sun Dec 29, 2013 8:19 pm
Location: Germany

Re: i3d plugin for Blender 3.6

Unread post by NilsZ » Sat Feb 17, 2024 7:27 am

battlefeel1942 wrote:
Fri Feb 16, 2024 2:58 am
I couldn't seem to preserve the UVMap when I loaded an i3d file from HD1 into Blender :/. We're you able to?
yes indeed it needs a fix. At the moment only exporting to i3d preserves UV maps.

battlefeel1942
Private
Posts: 14
Joined: Thu Jun 29, 2023 1:52 am

Re: i3d plugin for Blender 3.6

Unread post by battlefeel1942 » Mon Feb 19, 2024 7:17 am

Do you know much about the i3d format?

I have been investigating this for a few days but am not getting very far. It looks like the typical UV chunk (MAPPINGCOORS 0x4140) is either missing or moved. Its quite strange.

I also discovered an unknown chunk 0x4200. The UV and other data might be here, im still looking into that.

battlefeel1942
Private
Posts: 14
Joined: Thu Jun 29, 2023 1:52 am

Re: i3d plugin for Blender 3.6

Unread post by battlefeel1942 » Mon Feb 19, 2024 8:17 pm

I need to do more testing but it looks like the Mapping Coordinates are storred at the beginning of the unknown chunk mentioned in the previous post.

It seems to conform to the 0x4140 standard at least
https://paulbourke.net/dataformats/3ds/
Mapping coordinates.
First 2 bytes: number of vertices.
Then, for each vertex 2 floats that give the mapping coordinates.
That is, if a point is at the center of the map it will have 0.5 0.5
as mapping coordinates.

There is other data in the chunk, I don't yet know what it relates to.

User avatar
NilsZ
Major
Posts: 437
Joined: Sun Dec 29, 2013 8:19 pm
Location: Germany

Re: i3d plugin for Blender 3.6

Unread post by NilsZ » Wed Feb 21, 2024 7:44 am

yes, i3d doesnt use that chunk for UV choords. It has its own chunk. The main difference is that UV choords are stored in a certain order with ID, x position, y position. The 3ds stores them for each face and in a different order.

Beside that i3d supports also bones and nurbs. But it didnt work on that yet.

I attached the sources of i3d plugin, so you can compare it with 3DS.
Max Plugins.7z
(35.9 KiB) Downloaded 463 times

User avatar
NilsZ
Major
Posts: 437
Joined: Sun Dec 29, 2013 8:19 pm
Location: Germany

Re: i3d plugin for Blender 3.6

Unread post by NilsZ » Wed Feb 21, 2024 7:48 am

Also keyframes were disabled in blenders 3ds plugin. They had a little byte length issue, that caused 3ds max to crash. I fixed that but i wrote no algorithm to store keyframes. At the moment the keyframe chunk is only used for position of the objects.
blenders i3d plugin tried to put the position into objects 3d matrix, that wasn't working. after one export-import cycle all positions were messed up.

battlefeel1942
Private
Posts: 14
Joined: Thu Jun 29, 2023 1:52 am

Re: i3d plugin for Blender 3.6

Unread post by battlefeel1942 » Wed Feb 21, 2024 9:58 am

Ok I found the address 0x4200 contains equivalents for both 0x4140 (TEX_VERTS) and 0x4120 (FACE_ARRAY) as well as a few bytes at the end, I don't know what these are yet.

So reading 0x4200
TEX_VERTS is at the beginning followed by a variant of FACE_ARRAY
Note, FACE_ARRAY is stored twice, at the usual .3ds of 0x4120 and again (a longer array and with slightly different values and no flags) inside 0x4200.

I feel like the FACE_ARRAY inside 0x4200 may be more relevant,but I don't know for sure. I need to keep digging into it.

Is there anything in the Max Plugins about this?

battlefeel1942
Private
Posts: 14
Joined: Thu Jun 29, 2023 1:52 am

Re: i3d plugin for Blender 3.6

Unread post by battlefeel1942 » Wed Feb 21, 2024 10:01 pm

Ugh, I'm at dead end.

I'm starting to think that the vertx data (points) and face data that exists at 0x4110 (POINT_ARRAY) and 0x4120 (FACE_ARRAY) may be for a collision mesh. which is why UV data was never included for it.

That would mean the vertex data we need to successfully import an i3d into blender exists somewhere else in the file

@NilsZ - When you load an .i3d in 3D Studio MAx, are there two models? One simplified (collision mesh) and one more detailed? The second model (if it exists) could be the same with more vertex/faces.

I'm just guessing now :cry:

User avatar
NilsZ
Major
Posts: 437
Joined: Sun Dec 29, 2013 8:19 pm
Location: Germany

Re: i3d plugin for Blender 3.6

Unread post by NilsZ » Thu Feb 22, 2024 8:04 am

battlefeel1942 wrote:
Wed Feb 21, 2024 10:01 pm
Ugh, I'm at dead end.

I'm starting to think that the vertx data (points) and face data that exists at 0x4110 (POINT_ARRAY) and 0x4120 (FACE_ARRAY) may be for a collision mesh. which is why UV data was never included for it.

That would mean the vertex data we need to successfully import an i3d into blender exists somewhere else in the file

@NilsZ - When you load an .i3d in 3D Studio MAx, are there two models? One simplified (collision mesh) and one more detailed? The second model (if it exists) could be the same with more vertex/faces.

I'm just guessing now :cry:
No, we dont use collision mesh in HDD.

Have a look at the code for better understanding:
Here from exporter, we create a chunk called FACE_MAP_CHANNEL Hex value is 0x4200

Code: Select all

                              //export mapping channels
            for(int i=1; i<mesh.getNumMaps(); i++){
               if(!mesh.mapSupport(i))
                  continue;
               struct S_hlp{
                  ObjectEntry *oe;
                  int num;
               } hlp = {oe, i};
               if(!DumpMeshChunk(FACE_MAP_CHANNEL, &hlp, dc))
                  return false;
            }
          
Here is how its saved. ObjectEntry is just a raising number of all objects in the file.
The task is to implement this into blenders i3d importer plugin.

Code: Select all

   case FACE_MAP_CHANNEL:
      {
         struct S_hlp{
            ObjectEntry *oe;
            int num;
         } *hlp = (S_hlp*)data;
         Mesh &mesh = hlp->oe->tri->mesh;
         const UVVert *uvverts = mesh.mapVerts(hlp->num);
         int num_uv_verts = mesh.getNumMapVerts(hlp->num);
         const TVFace *uvfaces = mesh.mapFaces(hlp->num);
         int num_faces = mesh.numFaces;

         int i;
                              //save map channel index
         dc.ck->Write(&hlp->num, sizeof(int));

                              //save map vertices
         dc.ck->Write(&num_uv_verts, sizeof(word));
         for(i=0; i<num_uv_verts; i++){
            dc.ck->Write(&uvverts[i].x, sizeof(float));
            dc.ck->Write(&uvverts[i].y, sizeof(float));
         }

                              //save map faces
         dc.ck->Write(&num_faces, sizeof(word));
         for(i=0; i<num_faces; i++){
            for(int j=0; j<3; j++){
               dc.ck->Write(&uvfaces[i].t[j], sizeof(word));
            }
         }
      }
      break;
I forgot to share with you the common header. Here are all translations for chunks and names.
Attachments
Common.7z
(3.46 KiB) Downloaded 459 times

battlefeel1942
Private
Posts: 14
Joined: Thu Jun 29, 2023 1:52 am

Re: i3d plugin for Blender 3.6

Unread post by battlefeel1942 » Thu Feb 22, 2024 10:31 am

I can successfully read 4200.

The problem I am having is, the number of UVs doesn’t match the number of Vertices

For example, door.i3d has 8 vertices and 24 UV coordinates.
domek.i3d has 23 vertices and 46 UV coordinates.
box3.i3d has 8 vertices and 24 UV coordinates.

I don't know enough about 3d modeling to say if the number of vertices match the UV’s 1:1 but that would be my guess.

I will have a look through your importer/exporter

User avatar
NilsZ
Major
Posts: 437
Joined: Sun Dec 29, 2013 8:19 pm
Location: Germany

Re: i3d plugin for Blender 3.6

Unread post by NilsZ » Thu Feb 22, 2024 5:15 pm

the UV and vertices cant be 1:1. Each face (triangular of course) has usually 3 UV coords.

battlefeel1942
Private
Posts: 14
Joined: Thu Jun 29, 2023 1:52 am

Re: i3d plugin for Blender 3.6

Unread post by battlefeel1942 » Thu Feb 22, 2024 9:55 pm

WIth what I have learned so far, I have imported an i3d into Blender. I dont have a working importer yet because to import just door.i3d required a hack for the vertex count. The same technique wont work for all assets. This manipulation was just a lucky guess.

The hack is, I needed to take the vertex array from 0x4110 and multiply it by 3 before blender loads it in eg. contextMesh_vertls = contextMesh_vertls * 3

So for example, in door.i3d.
Vertices at 4110
Vertex: X=-0.5000002384185791, Y=-0.04999801144003868, Z=0.0
Vertex: X=0.51291823387146, Y=-0.049997761845588684, Z=0.0
Vertex: X=-0.49999991059303284, Y=0.05000046268105507, Z=0.0
Vertex: X=0.51291823387146, Y=0.050000712275505066, Z=0.0
Vertex: X=-0.5000002384185791, Y=-0.04990645870566368, Z=3.0032970905303955
Vertex: X=0.51291823387146, Y=-0.049906209111213684, Z=3.0032970905303955
Vertex: X=-0.49999991059303284, Y=0.050095830112695694, Z=3.0032970905303955
Vertex: X=0.51291823387146, Y=0.05009607970714569, Z=3.0032970905303955

Need to become (before it will load correctly)
Vertex: X=-0.5000002384185791, Y=-0.04999801144003868, Z=0.0
Vertex: X=0.51291823387146, Y=-0.049997761845588684, Z=0.0
Vertex: X=-0.49999991059303284, Y=0.05000046268105507, Z=0.0
Vertex: X=0.51291823387146, Y=0.050000712275505066, Z=0.0
Vertex: X=-0.5000002384185791, Y=-0.04990645870566368, Z=3.0032970905303955
Vertex: X=0.51291823387146, Y=-0.049906209111213684, Z=3.0032970905303955
Vertex: X=-0.49999991059303284, Y=0.050095830112695694, Z=3.0032970905303955
Vertex: X=0.51291823387146, Y=0.05009607970714569, Z=3.0032970905303955
Vertex: X=-0.5000002384185791, Y=-0.04999801144003868, Z=0.0
Vertex: X=0.51291823387146, Y=-0.049997761845588684, Z=0.0
Vertex: X=-0.49999991059303284, Y=0.05000046268105507, Z=0.0
Vertex: X=0.51291823387146, Y=0.050000712275505066, Z=0.0
Vertex: X=-0.5000002384185791, Y=-0.04990645870566368, Z=3.0032970905303955
Vertex: X=0.51291823387146, Y=-0.049906209111213684, Z=3.0032970905303955
Vertex: X=-0.49999991059303284, Y=0.050095830112695694, Z=3.0032970905303955
Vertex: X=0.51291823387146, Y=0.05009607970714569, Z=3.0032970905303955
Vertex: X=-0.5000002384185791, Y=-0.04999801144003868, Z=0.0
Vertex: X=0.51291823387146, Y=-0.049997761845588684, Z=0.0
Vertex: X=-0.49999991059303284, Y=0.05000046268105507, Z=0.0
Vertex: X=0.51291823387146, Y=0.050000712275505066, Z=0.0
Vertex: X=-0.5000002384185791, Y=-0.04990645870566368, Z=3.0032970905303955
Vertex: X=0.51291823387146, Y=-0.049906209111213684, Z=3.0032970905303955
Vertex: X=-0.49999991059303284, Y=0.050095830112695694, Z=3.0032970905303955
Vertex: X=0.51291823387146, Y=0.05009607970714569, Z=3.0032970905303955

So now there is 24 Vertices and 24UV, which loads correctly, and gives me this
Image

User avatar
NilsZ
Major
Posts: 437
Joined: Sun Dec 29, 2013 8:19 pm
Location: Germany

Re: i3d plugin for Blender 3.6

Unread post by NilsZ » Thu Feb 22, 2024 10:37 pm

Did you just edit the door.i3d file before importing or did you edit the importer? If you edited the file, what program did you use?

btw. for which purpose do you need model from Hidden and Dangerous? They are all low quality, thats why i always worked only on exporting files to i3d.

Post Reply

Who is online

Users browsing this forum: No registered users and 15 guests