Sweet Ever-loving Fark...
Congratulations, Jahrain. You have won The Internet.
Printable View
Sweet Ever-loving Fark...
Congratulations, Jahrain. You have won The Internet.
:hyper:
BEUTIFLE
+ reputation
Great job! Props to you and whoever helped you.
WOW. I really cant wait for this. Great job.
very fucking nice jah, you are damn talented.
DAY-UMMMMMMMN!
This is a step in the right direction. Hope you can figure out the normals issue, simply out of performance concerns; wouldn't it take a bit more processing time to render a double-sided face? If so, is it negligible?
Again, bravo. It's accomplishments like this that make me put faith into this community. I just hope Microsoft doesn't get its panties in a wad and ban anyone who has a map with custom render_models. :/
oh SNAP.
ftw
that is awesome. keep up the great work bro
+imaginary rep (<3 the rep system)
Thanks guys for the positive feedback.
Well it does eat up more memory as the polygon count is doubled, but as far as performance wise, double sided faces really doesn't impact frame rates that noticeably since either way, the video hardware culls the back sides of the faces during render time.
I have added options to manually flip the individual geometry section parts as the flipped polygons are random but uniform for each different part. Basically, if you load your model into the game, and you notice a certain part of the geometry has flipped triangles, you can go back to the upgrader and set that piece of geometry to have it's faces flipped. A model is divided up into parts based on which shader they used and which LOD they belong to so finding which geometry needs to be flipped isn't hard. So the problem has 2 optional work arounds until I figure out what causes the flipping of the polygons. I want to get a usable beta out as soon as possible and I won't let this problem halt it's release forever if I can't figure it out.
Well they have banned people from halo 2 xbox with such mods, but I doubt theres seriously a way for live to detect if a custom map is using a custom model or not. We will see.
Also, I'm planning on making an obj exporter for .render_model tags for referencing models, nodes, markers etc. Also as i promised, for anyone else who wants to make a importing script for 3ds max, this might help.
That is what I managed to map out for the the structure of the model just to be able to export it, so allot of data block and offset definitions are missing if one is to make an importer from it. But its a good start. It might also help anyone who wants to take a shot of making their own .render_model compiler/exporter. There are a few things that might be incorrect with it, but so far it work for me.Code:render_model structure
main
size = 264
0x83 = nameStringSize byte
0x104 = compressionInfoBlockCount int32
0x116 = regionBlockCount int32
0x128 = sectionCount int32
0x140 = invalidSectionPairBitCount int32
0x152 = sectionGroupCount int32
0x176 = nodeCount int32
0x200 = markerCount int32
0x212 = shaderCount int32
nameString string(Size = nameStringSize)
ImportDataBlock
size = 596
CompressedJMSFilesBlock
size = 540
0x392 = CompressedJMSFilesBlockSize int32
ZippedJMSDataBlock(s)
compressionInfoBlock
size = 56
0x0 = positionBoundsMinX float32
0x4 = positionBoundsMaxX float32
0x8 = positionBoundsMinY float32
0x12 = positionBoundsMaxY float32
0x16 = positionBoundsMinZ float32
0x20 = positionBoundsMaxZ float32
0x24 = texCoordsBoundsMinX float32
0x28 = texCoordsBoundMaxX float32
0x32 = texCoordsBoundsMinY float32
0x36 = texCoordsBoundMaxY float32
regionsBlock
size = 20
0x3 regionNameStringLenght byte
0x8 = permutationCount int32
permutationBlock
size = 16
0x3 = permNameStringLenght byte
0x4 = L1SectionIndex int16
0x6 = L2SectionIndex int16
0x8 = L3SectionIndex int16
0x10 = L4SectionIndex int16
0x12 = L5SectionIndex int16
0x14 = L6SectionIndex int16
permNameString string(permNameStringLenght)
regionNameString string(regionNameStringLenght)
sectionBlock
size = 104
0x4 = totalVertexCount int16
0x6 = totalTriangleCount int16
0x8 = totalPartCount int16
0x10 = shadowTriangleCount int16
0x12 = shadowPartCount int16
0x14 opPointCount int16
0x16 = opVertexCount int16
0x18 = opPartCount int16
0x22 = shadowRigidTriangleCount int16
0x26 = compressFlags 8bitBinary
compressBoundsBlock
size = 56
0x0 = positionBoundsMinX float32
0x4 = positionBoundsMaxX float32
0x8 = positionBoundsMinY float32
0x12 = positionBoundsMaxY float32
0x16 = positionBoundsMinZ float32
0x20 = positionBoundsMaxZ float32
0x24 = texCoordsBoundsMinX float32
0x28 = texCoordsBoundMaxX float32
0x32 = texCoordsBoundsMinY float32
0x36 = texCoordsBoundMaxY float32
sectionDataBlock
size = 180
0x0 = partsBlockCount int32
0x36 = vertexBlockCount int32
0x48 = stripIndexcount int32
0x164 = nodeMapCount int32
partsBlock
size = 72
0x6 = stripIndexStartIndex int16
0x8 = stripIndexLenght int16
0x14 = maxNodesPerVertex int16
0x16 = centroidX float32
0x20 = centroidY float32
0x24 = centriodZ float32
rawVertexBlock
size = 196
0x0 = vertexX float32
0x4 = vertexY float32
0x8 = vertexZ float32
0x28 = node0Weight float32
0x32 = node1weight float32
0x36 = node2weight float32
0x40 = node3weight float32
0x44 = node0index int32
0x48 = node1index int32
0x52 = node2index int32
0x56 = node3index int32
0x68 = texCoordx float32
0x72 = texCoordy float32
0x76 = normalI float32
0x80 = normalJ float32
0x84 = normalk float32
0x88 = binormalI float32
0x92 = binormalJ float32
0x96 = binormalK float32
0x100 = tangentI float32
0x104 = tangentJ float32
0x108 = tangentk float32
stripIndexBlock
size = 2
0x0 = vertexIndex int16
nodeMapBlock
size = 1
0x0 = nodeIndex byte
sectionGroupBlock
size = 16
nodeBlock
size = 96
0x3 = nodeNameStringLength byte
0x4 = parentNodeIndex int16
0x6 = firstChildNodeIndex int16
0x8 = nextSibblingNodeIndex int16
0x10 = importNodeIndex int16
0x12 = translationX float32
0x16 = translationY float32
0x20 = translationZ float32
0x24 = rotationI float32
0x28 = rotationJ float32
0x32 = rotationK float32
0x36 = rotationW float32
0x40 = inverseForwardI float32
0x44 = inverseForwardK float32
0x48 = inverseForwardJ float32
0x52 = inverseLeftI float32
0x56 = inverseLeftJ float32
0x60 = inverseLeftK float32
0x64 = inverseUpI float32
0x68 = inverseUpJ float32
0x72 = inverseUpK float32
0x76 = inversePositionX float32
0x80 = inversePositionY float32
0x84 = inversePositionZ float32
0x88 = inverseScale float32
0x92 = distanceFromParent float32
markerGroupBlock
size = 16
0x3 = markerNameString
0x4 = markerInstanceCount int32
markersBlock
size = 36
0x1 = regionIndex byte
0x2 = permutationIndex byte
0x3 = nodeIndex byte
0x4 = translationX float32
0x8 = translationY float32
0x12 = translationZ float32
0x16 = rotationI float32
0x20 = rotationJ float32
0x24 = rotationK float32
0x28 = rotationW float32
0x32 = scale float32
MarkerNameString string
shaderBlock
size = 52
0x24 = shaderStringLength byte
shaderStrings string(shaderStringLength)
On another note, Heres my first success with the first none h2 weapon model ingame. Btw, ignore 10 second job shaders.
http://i193.photobucket.com/albums/z...6-42-43-16.jpg
http://i193.photobucket.com/albums/z...6-42-34-50.jpg