Join also our Discord channel! Click here.

Spotlight: Señor Casaroja's Noesis

General game file tools that are useful for more than one game
User avatar
howfie
double-veteran
double-veteran
Posts: 930
Joined: Fri Jul 08, 2011 12:06 pm
Location: Torrance, CA
Has thanked: 10 times
Been thanked: 267 times

Re: Señor Casaroja's Noesis

Post by howfie » Thu Jun 27, 2013 8:26 pm

yo rich, got a question for ya...

I coded my own PS3 index buffer decompression routine based on docs from the SDK and help from chris, but it still doesn't generate the same indices that you get. It doesn't crash and it generates valid indices, but I think something is wrong with my two-bit stream processing. I think I am doing something out of order... is the processing like so?

two bytes, 8 triangles, 2-bits per triangle

is order
11010010-10101001 -> 11 01 00 10 10 10 10 01 (bits right-to-left, bytes left-to-right)

or

11010010-10101001 -> 10 00 01 11 01 10 10 10 (bits left-to-right, bytes left-to-right)

or something else? This is my code, processing the two-bit stream is the last step, coming after processing deltas and the one-bit stream (the incremental indices step).

Code: Select all

 // delta processing crap
 // ...

 // one-bit processing crap
 // ...

 // process two-bit data stream
 std::deque<uint32> idxbuffer;
 uint08* ptr = reinterpret_cast<uint08*>(&bs[(8 + onebits_bytes)]);
 uint32 new_index = 0;
 for(uint32 i = 0; i < twobits_bytes; i++)
    {
     uint08 b[4];
     b[0] = ((ptr[i] >> 6));
     b[1] = ((ptr[i] & 0x30) >> 4);
     b[2] = ((ptr[i] & 0x0C) >> 2);
     b[3] = ((ptr[i] & 0x03));

     for(uint32 j = 0; j < 4; j++)
        {
         uint32 size = idxbuffer.size();
         if(b[j] == 0) {
            uint32 i0 = idxbuffer[size - 3];
            uint32 i1 = idxbuffer[size - 2];
            idxbuffer.push_back(i1);
            idxbuffer.push_back(i0);
            idxbuffer.push_back(newlist[new_index++]);
           }
         else if(b[j] == 1) {
            uint32 i0 = idxbuffer[size - 3];
            uint32 i2 = idxbuffer[size - 1];
            idxbuffer.push_back(i0);
            idxbuffer.push_back(i2);
            idxbuffer.push_back(newlist[new_index++]);
           }
         else if(b[j] == 2) {
            uint32 i1 = idxbuffer[size - 2];
            uint32 i2 = idxbuffer[size - 1];
            idxbuffer.push_back(i2);
            idxbuffer.push_back(i1);
            idxbuffer.push_back(newlist[new_index++]);
           }
         else {
            idxbuffer.push_back(newlist[new_index++]);
            idxbuffer.push_back(newlist[new_index++]);
            idxbuffer.push_back(newlist[new_index++]);
           }

         std::cout << (idxbuffer[idxbuffer.size() - 3] + 1) << " ";
         std::cout << (idxbuffer[idxbuffer.size() - 2] + 1) << " ";
         std::cout << (idxbuffer[idxbuffer.size() - 1] + 1) << std::endl;
        }
    }
thx

User avatar
MrAdults
Moderator
Posts: 1007
Joined: Mon Mar 23, 2009 2:57 am
Has thanked: 44 times
Been thanked: 501 times

Re: Señor Casaroja's Noesis

Post by MrAdults » Mon Jul 01, 2013 4:55 am

Sorry, Edge stuff is a work-related conflict of interest for me now, so no comment.

User avatar
howfie
double-veteran
double-veteran
Posts: 930
Joined: Fri Jul 08, 2011 12:06 pm
Location: Torrance, CA
Has thanked: 10 times
Been thanked: 267 times

Re: Señor Casaroja's Noesis

Post by howfie » Mon Jul 01, 2013 7:31 pm

lol, no problem rich hahahahaha i will eventually figure it out.

User avatar
Demonsangel
mega-veteran
mega-veteran
Posts: 240
Joined: Fri Aug 05, 2011 9:31 pm
Location: Antwerp
Has thanked: 13 times
Been thanked: 41 times

Re: Señor Casaroja's Noesis

Post by Demonsangel » Wed Jul 03, 2013 1:17 pm

I know there is a binary find tool, but I'm not sure if it actually works from a Noesis script.
Bascally I'm trying to find certain byte groups within a NoeBitStream() and get their position.

I'm currently using

Code: Select all

def SearchChunk(self,byteArray,readFlag=1):
        found = 0
        byte1 = int(byteArray[:2],16)
        type2 = len(byteArray[2:])//2
        if type2 == 2:
            byte2 = int(byteArray[4:]+byteArray[2:4],16)
        else:byte2 = int(byteArray[2:],16)
        while found!=1:
            byte = self.data.readByte()
            if byte == byte1:
                if type2 == 2:flag = self.data.readShort()
                else:flag = self.data.readByte()
                if flag ==byte2:found=1
        if readFlag == 0: self.data.seek(-3,1)
        return
to find chunk headers and

Code: Select all

def findGEOM(self):
        fName=rapi.getInputName().split('\\')[-1]
        dirPath = rapi.getDirForFilePath(rapi.getInputName())
        f = open(dirPath + "/" + fName,'rb')
        file = f.read()
        f.close()
        offset = file.find(b"GEOM")
        self.data.seek(offset)
to find strings

But this isn't really efficient or failsafe. Just wondering what your input on this was.


EDIT:
I changed my string method to the following, which I guess is as good as any other.

Code: Select all

o3d = rapi.loadPairedFileOptional("Skeleton File","o3d")
offset = o3d.find(name.encode('utf-8'))

User avatar
MrAdults
Moderator
Posts: 1007
Joined: Mon Mar 23, 2009 2:57 am
Has thanked: 44 times
Been thanked: 501 times

Re: Señor Casaroja's Noesis

Post by MrAdults » Thu Jul 04, 2013 1:59 pm

I couldn't tell you what the absolute best Python method is for finding data in a bytearray, cause I'm not all that well-versed in Python myself. But I bet it's a question that's been addressed on stackoverflow.com if you can manage to figure out the right thing to search for.

Alsair
advanced
Posts: 66
Joined: Fri Jun 15, 2012 10:55 am
Has thanked: 4 times

Re: Señor Casaroja's Noesis

Post by Alsair » Fri Jul 05, 2013 10:32 am

Would be cool if Noesis in the future adds support for model creation and modification, what do ya say MrAdults, is it part of your plans?

User avatar
MrAdults
Moderator
Posts: 1007
Joined: Mon Mar 23, 2009 2:57 am
Has thanked: 44 times
Been thanked: 501 times

Re: Señor Casaroja's Noesis

Post by MrAdults » Fri Jul 12, 2013 1:37 am

Sorry for disappearing for a week again. My life is hell and stress and chaos.

I don't have any plans to really expand the visual editing capabilities of Noesis. It's meant more for processing of an automated nature. But you can build all of those things into it via the plugin framework, so anyone is free to if they really want to. There's a triangle picker plugin up on the official Noesis plugins repo that demonstrates how you'd go about something like that. All it does is let you select triangles of a(n optionally animated) model and export the selection as another model, but you could do anything you want there from assorted modeling functions to a full-blown topology-based modeling tool.

You can also override the rendering completely (that particular plugin just demonstrates rendering on top of the existing scene) and you have all the data you need to replace the base model renderer. So there's that too.

Justdragos
advanced
Posts: 69
Joined: Tue Feb 21, 2012 8:19 am

Re: Señor Casaroja's Noesis

Post by Justdragos » Sat Jul 13, 2013 7:13 pm

Hy guys! Is there any way to export maps or animation from dragon ball raging blast?
I am willing to donate 15 euro to the person who cand help me do that:D.

kilian277
ultra-n00b
Posts: 9
Joined: Sat Oct 13, 2012 2:45 pm
Has thanked: 2 times

Re: Señor Casaroja's Noesis

Post by kilian277 » Mon Jul 29, 2013 7:45 pm

Any change of getting multiexport , like that you can select multiple items in the listview and then export them all together ?

Thanks

kawayide
beginner
Posts: 37
Joined: Wed Nov 09, 2011 2:03 am
Has thanked: 7 times

Re: Señor Casaroja's Noesis

Post by kawayide » Sun Aug 04, 2013 9:38 am

Wrote an export plugin. When exporting a .GMO which has external texture file, texture count always be zero (i.e. pmdl->matData->numTextures zero). also can't get texture's filenames. Help plz.

(the obj dae exporters can find the texture filename)

User avatar
MrAdults
Moderator
Posts: 1007
Joined: Mon Mar 23, 2009 2:57 am
Has thanked: 44 times
Been thanked: 501 times

Re: Señor Casaroja's Noesis

Post by MrAdults » Sun Aug 04, 2013 5:25 pm

That's because there are no textures. Get the reference name from the material, and manually load up external textures as seen in the Quake 2 MD2 exporter code.

User avatar
MrAdults
Moderator
Posts: 1007
Joined: Mon Mar 23, 2009 2:57 am
Has thanked: 44 times
Been thanked: 501 times

Re: Señor Casaroja's Noesis

Post by MrAdults » Mon Aug 05, 2013 5:21 am

Was it you that submitted a Noesis GMO crash report? Your bone reference index is garbage in whatever broken model you tried to load, if so.

It's easier for me to find crashes like that in the loader if you simply send me your data.

kawayide
beginner
Posts: 37
Joined: Wed Nov 09, 2011 2:03 am
Has thanked: 7 times

Re: Señor Casaroja's Noesis

Post by kawayide » Mon Aug 05, 2013 11:59 am

MrAdults wrote:Was it you that submitted a Noesis GMO crash report? Your bone reference index is garbage in whatever broken model you tried to load, if so.

It's easier for me to find crashes like that in the loader if you simply send me your data.
I remember noesis didn't crashed, crashes I can recall are caused by my noesis plugin.

(If so, tell me file name, I can get I have it or not)
Last edited by kawayide on Mon Aug 05, 2013 1:48 pm, edited 3 times in total.

User avatar
MrAdults
Moderator
Posts: 1007
Joined: Mon Mar 23, 2009 2:57 am
Has thanked: 44 times
Been thanked: 501 times

Re: Señor Casaroja's Noesis

Post by MrAdults » Sun Aug 11, 2013 6:49 am

It was just some random file on someone's desktop. Probably incorrectly-extracted garbage or something.

User avatar
itoikenza
advanced
Posts: 52
Joined: Sat Jan 07, 2012 2:24 am
Has thanked: 9 times
Been thanked: 2 times

Re: Señor Casaroja's Noesis

Post by itoikenza » Wed Aug 14, 2013 6:37 pm

MrAdults wrote:Select a bone in the data viewer, then over the model preview, hold shift+left mouse and move the mouse around. It will modify the selected bone's rotation offset. As for individual frame export from the in-preview bone transforms, maybe at some point.
MrAdults is this broken "hold shift+left mouse" ? cause i tried with a paine.fbx and no dice...

oh and i haven't forgotten about helping you get your hands on a Qumarion. they just have been slow on allowing imports to addresses outside of japan, plus i don't have the funds yet...

Post Reply