Jump to content

Noesis script for ghg files


Sluicer
 Share

Recommended Posts

I once started to work on a skript for noesis that can open ghg files from the game LEGO Star Wars The Complete Saga. I mentioned it in a comment in a blog and decided to create a new topic for it. By this, I hope that it will be easier to find for people, that did not read the blog. There are a lot of comments because it is in development / research state. So here is the unfinished script:

from inc_noesis import *
import noesis
import rapi

def registerNoesisTypes():
    '''Register the plugin. Just change the Game name and extension.'''

    handle = noesis.register("LEGO TTGames Mesh (*pc.ghg)", ".ghg")
    noesis.setHandlerTypeCheck(handle, noepyCheckType)
    noesis.setHandlerLoadModel(handle, noepyLoadModel)
    return 1

def noepyCheckType(data):
    '''Verify that the format is supported by this plugin. Default yes'''
    bs = NoeBitStream(data)
    tmp = bs.readInt()
    if tmp == 0x3032554e: # NU20 #Batman
        return 1

    bs.seek(tmp, NOESEEK_REL)
    tmp = bs.readInt()
    if tmp == 0x3032554e: # NU20 #Star Wars
        return 1

    return 0

def noepyLoadModel(data, mdlList):

    bs = NoeBitStream(data)

    ctx = rapi.rpgCreateContext()
    stack = []
    textures = []
    materials = []

    NU20 = bs.readInt()
    if NU20 == 0x3032554e: # NU20 #Batman
        print("NU20 first")
    else:
        print("NU20 @ 0x%x" % NU20)
        numberImg = bs.readShort()
        print("numberImg %d" % numberImg)
        bs.seek(NU20+4, NOESEEK_ABS)
        bs.seek(0x4, NOESEEK_REL)

    bs.seek(0xc, NOESEEK_REL)

    #HEAD
    fourCC = bs.readInt()
    chunkSize = bs.readInt()
    absOffsetPNTR = bs.tell() + bs.readInt()
    offsetGSNH = bs.readInt()
    absOffsetGSNH = bs.tell() + offsetGSNH

    #NTBL
    fourCC = bs.readInt()
    chunkSize = bs.readInt()
    bs.seek(chunkSize-8, NOESEEK_REL)

    fourCC = bs.readInt()
    if (fourCC == 1178948180): # TREF
        chunkSize = bs.readInt()
        bs.seek(chunkSize-8, NOESEEK_REL)
        fourCC = bs.readInt()

    if (fourCC == 810832724): # TST0
        chunkSize = bs.readInt()
        bs.seek(chunkSize-8, NOESEEK_REL)
        fourCC = bs.readInt()

    #MS00 - Materials
    print("MS00 @ 0x%x" % (bs.tell()-4))
    #fourCC = bs.readInt()
    chunkSize = bs.readInt()
    numberMaterials = bs.readInt()
    bs.seek(4, NOESEEK_REL) # 0
    for i in range (0, numberMaterials):
        material = NoeMaterial("mat%03i"%i, "") #create a material
        bs.seek(0x38, NOESEEK_REL) #
        matId = bs.readInt()
        bs.seek(0x18, NOESEEK_REL) #
        material.setDiffuseColor(NoeVec4([bs.readFloat(), bs.readFloat(), bs.readFloat(), bs.readFloat()]))
        bs.seek(0x10, NOESEEK_REL) #
        texId = bs.readShort()
        if (texId != -1):
            material.setTexture("tex%03i"%texId)
        bs.seek(0x52, NOESEEK_REL) #
        colorRbga = bs.readBytes(4)
#        material.setDiffuseColor(NoeVec4([colorRbga[0]/255, colorRbga[1]/255, colorRbga[2]/255, colorRbga[3]/255]))
        bs.seek(0x1F8, NOESEEK_REL) #
        materials.append(material)

    bs.seek(absOffsetGSNH - 12, NOESEEK_ABS)
    #GSNH
    print("GSNH @ 0x%x" % bs.tell())
    fourCC = bs.readInt()
    chunkSize = bs.readInt()
    bs.readInt()
    numberImages = bs.readInt()
    print("NumberImages %d" % numberImages)
    absOffsetImagesMeta = bs.tell() + bs.readInt()
    bs.seek(0x28, NOESEEK_REL)
    absOffsetMeshMeta = bs.readInt() - 4 + bs.tell()
    bs.seek(0x130, NOESEEK_REL)
    numberBones = bs.readInt()
    absOffsetBones = bs.readInt() - 4 + bs.tell()
    print("NumberBones %d" % numberBones)
    absOffsetBones2 = bs.readInt() - 4 + bs.tell()
    absOffsetBones3 = bs.readInt() - 4 + bs.tell()
    bs.seek(24, NOESEEK_REL)
    numberLayer = bs.readInt()
    absOffsetLayer = bs.readInt() - 4 + bs.tell()
    print("NumberLayer %d" % numberLayer)

    # goto image meta
    bs.seek(absOffsetImagesMeta, NOESEEK_ABS)
    size = 0
    if NU20 == 0x3032554e: #Batman
        imageMetas = []
        for i in range (0, numberImages):
            tmp = bs.readInt()
            stack.append(bs.tell())
            bs.seek(tmp-4, NOESEEK_REL)
            width = bs.readInt()
            height = bs.readInt()
            bs.seek(0x10, NOESEEK_REL)
            bs.seek(0x2c, NOESEEK_REL)
            size = bs.readInt()
            print("Image{0}: width = {1:4d}; height = {2:4d}; size = {3:8d}".format(i, width, height, size))
            imageMetas.append(ImageMeta(width, height, size))
            bs.seek(stack.pop(), NOESEEK_ABS)
        bs.seek(absOffsetPNTR-8, NOESEEK_ABS) # goto PNTR
        #print("1 0x%x" % bs.tell())
        fourCC = bs.readInt()
        #print("2 0x%x" % bs.tell())
        chunkSize = bs.readInt()
        print("3 0x%x" % bs.tell())
        bs.seek(chunkSize-4, NOESEEK_REL) # goto EndOfPNTR
        print("4 0x%x" % bs.tell())
        for i in range (0, numberImages):
            data = bs.readBytes(imageMetas[i].size)
            texture = rapi.loadTexByHandler(data, ".dds") #NoeTexture(str(i), width, height, data, texFmt)
            texture.name = "tex%03i"%i
            textures.append(texture)
        #bs.seek(size, NOESEEK_REL)
        print("5 0x%x" % bs.tell())
    else:
        numberRealImages = 0
        for i in range (0, numberImages):
            tmp = bs.readInt()
            stack.append(bs.tell())
            bs.seek(tmp-4, NOESEEK_REL)
            width = bs.readInt()
            height = bs.readInt()
            print("Image{0}: width = {1:4d}; height = {2:4d}".format(i, width, height))
            if width != 0 and height != 0: numberRealImages += 1
            bs.seek(stack.pop(), NOESEEK_ABS)
        bs.seek(6, NOESEEK_ABS) #goto beginOfFile + 6
        for i in range (0, numberRealImages):
            pos = bs.tell()
            width = bs.readInt()
            height = bs.readInt()
            bs.readInt()
            bs.readInt()
            bs.readInt()
            size = bs.readInt()
            print("Image{0} @ {1:8x}: width = {2:4d}; height = {3:4d}".format(i, pos, width, height))
            data = bs.readBytes(size)
            texture = rapi.loadTexByHandler(data, ".dds") #NoeTexture(str(i), width, height, data, texFmt)
            texture.name = "tex%03i"%i
            textures.append(texture)
#            bs.seek(size, NOESEEK_REL)
    #End DDS

    vertexLists = []
    numberVertexLists = bs.readShort()
    for i in range (0, numberVertexLists):
        size = bs.readInt()
        vertexLists.append(bs.readBytes(size))

    indexLists = []
    numberIndices = bs.readShort()
    for i in range (0, numberIndices):
        size = bs.readInt()
        indexLists.append(bs.readBytes(size))

    bs.seek(absOffsetMeshMeta, NOESEEK_ABS)
    bs.seek(0x14, NOESEEK_REL)
    numberParts = bs.readInt()
    print("NumberParts %d" % numberParts)
    bs.seek(0x08, NOESEEK_REL)
    partPos = bs.tell()
    bytesForPositions = []
    stride = []
    bytesForIndexBuffer = []
    numIdx = []
    for i in range (0, numberParts):
        offsetPart = bs.readInt()
        bs.seek(offsetPart - 4, NOESEEK_REL)
        bs.readInt() // 6
        numberIndices = bs.readInt()+2
        sizeVertex = bs.readShort()
        bs.seek(0x0a, NOESEEK_REL)
        offsetVertex = bs.readInt()
        numberVertex = bs.readInt()
        offsetIndices = bs.readInt()
        indexList = bs.readInt()
        vertexList = bs.readInt()

        bytesForPositions.append(vertexLists[vertexList][offsetVertex*sizeVertex:offsetVertex*sizeVertex+numberVertex*sizeVertex])
        stride.append(sizeVertex)
        bytesForIndexBuffer.append(indexLists[indexList][offsetIndices*2:offsetIndices*2+numberIndices*2])
        numIdx.append(numberIndices)
        partPos += 4
        bs.seek(partPos, NOESEEK_ABS)

    bs.seek(absOffsetLayer, NOESEEK_ABS)
    layers = []
    for i in range (0, numberLayer):
        layer = Layer(i)
        absOffsetText = bs.readInt() - 4 + bs.tell()
        tmp = bs.readInt()
        if (tmp != 0):
            layer.p1 = bs.tell() + tmp - 4
        tmp = bs.readInt()
        if (tmp != 0):
            layer.p2 = bs.tell() + tmp - 4
        tmp = bs.readInt()
        if (tmp != 0):
            layer.p3 = bs.tell() + tmp - 4
        tmp = bs.readInt()
        if (tmp != 0):
            layer.p4 = bs.tell() + tmp - 4
        layers.append(layer)

    for layer in (layers):
        if (layer.p1 != 0):
            bs.seek(layer.p1, NOESEEK_ABS)
            for j in range (0, numberBones):
                #parts = 0
                tmp = bs.readInt()
                if (tmp != 0):
                    stack.append(bs.tell())
                    bs.seek(tmp-4, NOESEEK_REL)
                    bs.seek(8, NOESEEK_REL)
                    bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix
                    bs.seek(0xB0, NOESEEK_REL)
                    bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts
                    parts = bs.readInt()
                    bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials
                    partMaterials = []
                    for p in range (0, parts):
                        partMaterials.append(bs.readInt())
                    partMaterials = list(reversed(partMaterials))
                    bs.seek(stack.pop(), NOESEEK_ABS)
                    bonePartPair = BonePartPair(0, j, parts, partMaterials)
                    layer.bonePartPairs.append(bonePartPair)

        if (layer.p2 != 0):
            bs.seek(layer.p2, NOESEEK_ABS)
            bs.seek(8, NOESEEK_REL)
            bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix
            bs.seek(0xB0, NOESEEK_REL)
            bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts
            parts = bs.readInt()
            bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials
            partMaterials = []
            for p in range (0, parts):
                partMaterials.append(bs.readInt())
            partMaterials = list(reversed(partMaterials))
            #bs.seek(stack.pop(), NOESEEK_ABS)
            bonePartPair = BonePartPair(1, -1, parts, partMaterials)
            layer.bonePartPairs.append(bonePartPair)

        if (layer.p3 != 0):
            bs.seek(layer.p3, NOESEEK_ABS)
            for j in range (0, numberBones):
                #parts = 0
                tmp = bs.readInt()
                if (tmp != 0):
                    stack.append(bs.tell())
                    bs.seek(tmp-4, NOESEEK_REL)
                    bs.seek(8, NOESEEK_REL)
                    bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix
                    bs.seek(0xB0, NOESEEK_REL)
                    bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts
                    parts = bs.readInt()
                    bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials
                    partMaterials = []
                    for p in range (0, parts):
                        partMaterials.append(bs.readInt())
                    partMaterials = list(reversed(partMaterials))
                    bs.seek(stack.pop(), NOESEEK_ABS)
                    bonePartPair = BonePartPair(2, j, parts, partMaterials)
                    layer.bonePartPairs.append(bonePartPair)

        if (layer.p4 != 0):
            bs.seek(layer.p4, NOESEEK_ABS)
            bs.seek(8, NOESEEK_REL)
            bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> matrix
            bs.seek(0xB0, NOESEEK_REL)
            bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> number of parts
            parts = bs.readInt()
            bs.seek(bs.readInt() - 4, NOESEEK_REL) # --> materials
            partMaterials = []
            for p in range (0, parts):
                partMaterials.append(bs.readInt())
            partMaterials = list(reversed(partMaterials))
            #bs.seek(stack.pop(), NOESEEK_ABS)
            bonePartPair = BonePartPair(3, -1, parts, partMaterials)
            layer.bonePartPairs.append(bonePartPair)

    bs.seek(absOffsetBones, NOESEEK_ABS)
    bones = []
    bones0 = []
    bones1 = []
    bones2 = []
    boneNames = []
    bonePIndices = []
    globalCounter = 0
    for i in range (0, numberBones):
        boneMat = NoeMat44.fromBytes(bs.readBytes(0x40)).toMat43()
        bs.seek(0xc, NOESEEK_REL)
        boneIndex = i
        offsetText = bs.readInt()
        stack.append(bs.tell())
        bs.seek(offsetText - 4, NOESEEK_REL)
        boneName = bs.readString()
        boneNames.append(boneName)
        bs.seek(stack.pop(), NOESEEK_ABS)
        bonePIndex = bs.readByte()
        bonePIndices.append(bonePIndex)
        bs.readByte()
        bs.readByte()
        bs.readByte()
        bs.readInt()
        bs.readInt()
        bs.readInt()
        print(boneName + ": " + repr(i) + "-->" + repr(bonePIndex))
        bones0.append(boneMat)

    for i in range (0, numberBones):
        boneMat = NoeMat44.fromBytes(bs.readBytes(0x40)).toMat43()
        #print(boneMat)
        if (bonePIndices[i] != -1):
            boneMat = boneMat.__mul__(bones1[bonePIndices[i]])
        bone = NoeBone(i, boneNames[i], boneMat, None, bonePIndices[i])
        bones.append(bone)
        bones1.append(boneMat)

    for i in range (0, numberBones):
        boneMat = NoeMat44.fromBytes(bs.readBytes(0x40)).toMat43()
        #print(boneMat)
        bones2.append(boneMat)

    globalCounter = 0
    for layer in (layers):
        print("Layer: %d" % layer.layer)
        if layer.bonePartPairs:
            for bonePartPair in (layer.bonePartPairs):
                print("  Pointer: " + repr(bonePartPair.pointer) + " Bone: " + repr(bonePartPair.bone) + " Parts: " + repr(bonePartPair.parts))
                if (bonePartPair.bone != -1):
                    rapi.rpgSetTransform(bones1[bonePartPair.bone])
                else:
                    rapi.rpgSetTransform(None)
                print(bonePartPair.partMaterials)
                for j in range (0, bonePartPair.parts):
                    rapi.rpgBindPositionBuffer(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 0)
                    if (stride[globalCounter] == 44):
                        rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 28)
                        #rapi.rpgBindBoneIndexBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 40, 4)
                        #rapi.rpgBindBoneWeightBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 36, 4)
                    if (stride[globalCounter] == 40):
                        rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 24)
                        #rapi.rpgBindBoneIndexBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 36, 4)
                        #rapi.rpgBindBoneWeightBufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_UBYTE, stride[globalCounter], 32, 4)
                    if (stride[globalCounter] == 36):
                        if NU20 == 0x3032554e: #Batman
                            rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 20)
                        else:
                            rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 28)
                    if (stride[globalCounter] == 32):
                        rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 24)
                    if (stride[globalCounter] == 28):
                        if NU20 == 0x3032554e: #Batman
                            rapi.rpgBindUV1BufferOfs(bytesForPositions[globalCounter], noesis.RPGEODATA_FLOAT, stride[globalCounter], 20)
                    rapi.rpgSetMaterial("mat%03i"%bonePartPair.partMaterials[j])
                    rapi.rpgCommitTriangles(bytesForIndexBuffer[globalCounter], noesis.RPGEODATA_SHORT, numIdx[globalCounter], noesis.RPGEO_TRIANGLE_STRIP, 1)
                    globalCounter = globalCounter + 1
                    rapi.rpgClearBufferBinds()

            mdl = rapi.rpgConstructModel()
            mdl.setModelMaterials(NoeModelMaterials(textures, materials))
            mdl.setBones(bones)
            mdlList.append(mdl)             #important, don't forget to put your loaded model in the mdlList

    return 1


class Layer(object):
    def __init__(self, layer):
        self.layer = layer
        self.bonePartPairs = []
        self.p1 = 0
        self.p2 = 0
        self.p3 = 0
        self.p4 = 0

class BonePartPair(object):
    def __init__(self, pointer, bone, parts, partMaterials):
        self.pointer = pointer
        self.bone = bone
        self.parts = parts
        self.partMaterials = partMaterials

class ImageMeta(object):
    def __init__(self, width, height, size):
        self.width = width
        self.height = height
        self.size = size

You can create results like this with the script:

kSuAzcw.png

I have updated the script, so that materials will also be respected now. You can get models like in the following posts.

  • Like 6
Link to comment
Share on other sites

I am working on an update. Then it should be possible to export also the textures. But I do not know how noesis will react:

xl2qXrr.png        4W4XQLh.png

I have updated the script in the first post!

 

 

Edited by Sluicer
Link to comment
Share on other sites

will it work on Lego batman?

Please read.

I once started to work on a skript for noesis that can open ghg files from the game LEGO Star Wars The Complete Saga.

Link to comment
Share on other sites

The file formats of the games are similar. But not exactly the same. E.g. are the images in the files one time at the beginning of the files and the other time at the end of the files. That is the reason why I asked

if NU20 == 0x3032554e: # NU20

The script is prepared to read also the files from the batman game, but there is currently no support for material and textures (due to additional chunks). The vertex lists might also differ for some files, but I have to crosscheck that. I do not remember exactly and the scripts are far of beeing finished.

I was able to open some of the batman files and I am working on the materials currently.

----

I updated the script, so that it can handle many of the Batman files too. I will post some samples in the Batman thread.

Edited by Sluicer
Skript update
Link to comment
Share on other sites

  • 3 months later...

Hello Sluicer I have tried this script as long as I tried the Extractpcghg that you have released on a GHG from Lego Dimensions without any success I got this error by the script :

---------------------------
Noesis Python Error
---------------------------
Traceback (most recent call last):
  File "C:\3d\noesis\plugins\python\ttgames.py", line 20, in noepyCheckType
    bs.seek(tmp, NOESEEK_REL)
  File "C:\3d\noesis\plugins\python\inc_noesis.py", line 164, in seek
    self.toUnpacker(); r = noeSuper(self).seek(addr, isRelative); self.fromUnpacker(); return r
  File "C:\3d\noesis\plugins\python\inc_noesis.py", line 160, in fromUnpacker
    self.setOffset(self.byteOfs)
  File "C:\3d\noesis\plugins\python\inc_noesis.py", line 77, in setOffset
    noesis.bsSetOfs(self.h, ofs)
RuntimeError: Tried to set offset beyond buffer size. (1627586564 > 90773)

---------------------------

I suppose this is a new GHG format

Link to comment
Share on other sites

This script is only for LEGO Star Wars The Complete Saga and the first Batman game.

The ExtractPcGhg Tool is only for *pc.ghg files.

The ExtractNxgMesh Tool is for *nxg.gsc and *nxg.ghg files.

The ExtractDx11Mesh Tool is for *dx11.gsc and *dx11.ghg files.

All tools do not cover everything. So you have to inform me, when you detect a file that is not working.

I already experimented with lego worlds a bit, but I have no access to Lego Dimensions.

Link to comment
Share on other sites

This script is only for LEGO Star Wars The Complete Saga and the first Batman game.

The ExtractPcGhg Tool is only for *pc.ghg files.

The ExtractNxgMesh Tool is for *nxg.gsc and *.nxg.ghg files.

The ExtractDx11Mesh Tool is for *dx11.gsc and *dx11.ghg files.

All tools do not cover everything. So you have to inform me, when you detect a files that is not working.

I already experimented with lego worlds a bit, but I have no access to Lego Dimensions.

that's clearer now..

I have tried the latest ExtractNxgMesh with Lego Dimensions NXG.GHG without success :

index out of bound in ExtractNxgMESH.ExtractNxgMESH.readTXGH()
   in ExtractNxgMESH.ExtractNxgMESH.Extract()
   in ExtractNxgMESH.Program.Main(String[] args))

while the script for noesis work with a PC.ghg file from Lego Indiana Jones 2 (just to let you know)

I would like to help you if you need to working on Dimensions File

thank you

 

Link to comment
Share on other sites

I can only work on the files, if I have access to them. But I do not own the game and currently I have no intension in buying it. Do you have the possibility to share one or two files?

Link to comment
Share on other sites

  • 4 weeks later...
  • 1 month later...

Hello, I just found these forums a few days ago, and I'm very interested in creating many new skins and hopefully models for the game. I've loved these games since the first one came out, and after seeing all the improved character models in Lego TFA, I thought it could be cool to try and use some of those to improve the Complete Saga. I have a fair amount of experience with modding, as I've been working on things for Star Wars Jedi Academy since this past December. If you guys are interested let me know, because I still have some questions for compiling all the data and getting it in game.

Link to comment
Share on other sites

1 minute ago, Xiron said:

No need to ask. Of course we are! :P

Awesome, so I have a few questions. First, does all of the game data need to be stored in specifically named .dat files (game.dat, episode1.dat) or can it be separate with any random name?

Link to comment
Share on other sites

Fluffy Cupcake

I think TCS is capable of running with extracted files, I don't know if a recompiler even exists for TT LEGO games 'cause it was never really needed.

Link to comment
Share on other sites

1 minute ago, Xiron said:

I think TCS is capable of running with extracted files, I don't know if a recompiler even exists for TT LEGO games 'cause it was never really needed.

Hmm, alright, well I'm going to need to sleep soon, so I'll get back to you tomorrow for more on the project.

Link to comment
Share on other sites

I've again found myself at too late of an hour to really do anything, so for now if anyone could send me an example of a working modded file and what to do with it that'd be appreciated. I want to see what a working mod looks like as something of a template.

Link to comment
Share on other sites

I was able to get a mod to work in game for the customizable character, but for the normal characters do I have to recompress the ghg files after extracting and editing?

Link to comment
Share on other sites

  • 1 month later...
Fluffy Cupcake

That is the file. I'm not sure the full details, but the gist of it is that you copy & paste the {code} contents in OP in a text editor and save the file with a .py extension and put the file in Noesis' plugins folder.

 

Link to comment
Share on other sites

  • 1 month later...
Spergalicious
On 1/4/2016 at 10:39 AM, Sluicer said:

Here is a new version of the tool:http://oresome.rockraidersunited.com/download/305

It now could also handle many files from the games dimensions and worlds.

I hope it works.

 

Hey there, first time poster.

I'm probably overlooking something really obvious here, but I can't seem to get this to work with Noesis. I haven't had any issues with it running the other plugins I've installed, but it doesn't want to recognize this one. I got the one in the OP to work fine, but it won't read the files from Lego LOTR like I'm trying to do.

Link to comment
Share on other sites

On 5.12.2015 at 1:38 AM, Sluicer said:

This script is only for LEGO Star Wars The Complete Saga and the first Batman game.

The ExtractPcGhg Tool is only for *pc.ghg files.

The ExtractNxgMesh Tool is for *nxg.gsc and *nxg.ghg files.

The ExtractDx11Mesh Tool is for *dx11.gsc and *dx11.ghg files.

All tools do not cover everything. So you have to inform me, when you detect a file that is not working.

I already experimented with lego worlds a bit, but I have no access to Lego Dimensions.

There is the script to work with Noesis and only with the games Star Wars The Complete Saga and the first Batman.

There are stand alone tools, that can extract mesh information from different games (depending on the file extentions) into obj files.

  • Like 2
Link to comment
Share on other sites

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.