Quad64 v0.1.1 - A new open source SM64 level editor 1 2 »
Users browsing this thread: 1 Guest(s)

This is a project I've been working on for a few weeks; a brand new open source level editor for SM64 called Quad64. It is written in C# and uses Windows forms for the GUI and OpenTK for the 3D rendering.

[Image: izpuatU.png?1]

Features:
  • Edit the positions and properties of objects like Stars, Platforms, Enemies, etc. 
  • Edit Warps, Painting Warps, and Instant Warps.
  • You can view and edit up to 8 areas (starting with area 0) in a level. 
The main initial focus of Quad64 is to be like Skelux's Toad's Tool 64, but with better ROM compatibility.
  • Both the vanilla 8MB ROM & extended ROMs (including ROM hacks) can be modified using this tool** 
  • You can modify any of the 4 major regional versions of SM64, which includes the North American, European, Japanese, and Japanese Shindou edition ROMs
  • You can load and save ROM files as big endian(.z64), middle endian(.v64), or little endian(.n64)
  • Supports most of the N64 texture formats: RGBA16, RGBA32, IA16, IA8, IA4, I8, and I4. (CI textures are interpreted as grayscale)
** Note: Macro & Special objects are not editable with the vanilla 8MB ROM, since they are MIO0 compressed. You can use queueRAM's sm64extend tool to extend any vanilla ROM file, which will let you edit these objects.

Spoiler: Changelog
Version 0.1.1:
* The program will now ask you if you want to save the ROM file before opening a new ROM, launching the ROM in an emulator, or closing Quad64, etc. (if the file is not already saved).
* Added an option to cull triangle backfaces in settings
* Added an option to automatically save the ROM file when the "Launch ROM" button is pressed
* Added a black wireframe outline to the collision map, so now you should see where each triangle is.
* Fixed some crashing errors that appeared in some of Kaze's ROM hacks.
* Fixed a bug where the editor read the Macro Preset ID wrong, so Macro Objects should now no longer get corrupted.
* Fixed wireframe rendering
* The "Platform not supported" error message when trying to build the source code should be fixed. (Thanks Guccifer)

sm64extend GUI:

[Image: YvqJr1x.png]

If you want to be able to modify Macro & Special objects, then you will need to use an uncompressed extended ROM. I've made a simple graphical user interface for queueRAM's sm64extend program. This simple little tool will expand your ROM to the size you want and uncompress all of the MIO0 data. 

Improvements over VL-Tone's original SM64 extender:
  • Works with the European, Japanese, and Japanese (Shindou Edition) ROMs
  • Properly aligns the data blocks, so the extended ROMs should fully work on real N64 hardware.
  • Creates an extended ROM in less than a second.
Download Links:

Quad64 (Win32): [Download]
Quad64 Source Code : [Github]
sm64extend GUI (Win32):  [Download]
(This post was last modified: 09-07-2017, 01:50 AM by David.)

Nice job, finally a good alternative to TT64. Hopefully the hacking community will get a boost with improved productivity Smile

When the 0.1 is already far better than TT64.
Gone for a while.

Oh wow! This looks far less slow & clunky compared to TT64! The UI's visual design also seems far less distracting; no more annoying dark gradients or tiny text! If the SM64 Importer could be integrated as well, rom hack productivity would skyrocket.
(This post was last modified: 08-07-2017, 10:51 AM by Flame8765.)

I tried the program a bit and I found a little bug: if the emulator path is pointing to a non existing executable, the program throws an unhandled exception.

I also have some ideas for improving the tool:
  • Apply a diffuse shading to the collision map. it isn't possible to distinguish the shape of an object with flat shading.
  • Add an option to invert the camera pitch rotation: some people (maybe the majority) are more confortable with the camera looking up if they move the mouse down, not up (and vice versa).
  • When you switch level, the camera remains in the same position. Maybe this could be improved storing the transform of the camera for each level, so when you switch back to a level, you find the camera with the previous transform. Also areas suffer from this problem, but this may or may not be a problem (It's not a problem in segmented areas, like TTM's slide, i.e. all areas connected by 0x28 commands).
  • More fine-grained hex/decimal display settings (addresses, values, IDs, etc...).
  • built-in sm64extend. This can be invoked automatically when you want to operate on compressed data, and maybe compress back with sm64compress.
  • Those TT64 style commands... I think Blender-like camera/object controls could be more productive.
  • Add "Do you want to save?" dialog on closing and ROM opening if there are unsaved changes to the ROM.

Also I have a pair of question (my noobness section):
  • Is it technically possible to have a level with an area 0 in SM64?
  • Why are there four behavior parameters for 3D objects? 0x24 commands supports only two b. params.


EDIT: Found another bug: when you rotate a Macro 3D object, also the preset ID is changed. This is probable due to the bit misalignment of the elements in the Object Placement List. Each elements of the preset list is 10 bytes long, but the bug is about how the first two bytes are read or written (I believe that they are badly written, since an untouched ROM displays everything correctly). It represents both the Y-rotation and the preset type. More precisely, the first 7 bits represents the Y rotation, while the last 9 bits defines the model/behavior preset ID (also called the object combo).
The interesting part is that you made a post about those objects  Tongue
https://www.smwcentral.net/?p=viewthread&t=59070&page=107&pid=1207463#p1207463

EDIT #2: I've compiled the project (using NuGet packages to gather dependencies), but when I try to debug, or to launch the application, I get a PlatformNotSupportedException. This is the debug info I got (sorry for the Italian):

Spoiler :
Code:
************** Testo dell'eccezione **************
System.PlatformNotSupportedException: Operazione non supportata su questa piattaforma.
  in OpenTK.GLControlFactory.CreateGLControl(GraphicsMode mode, Control control)
  in OpenTK.GLControl.OnHandleCreated(EventArgs e)
  in System.Windows.Forms.Control.WmCreate(Message& m)
  in System.Windows.Forms.Control.WndProc(Message& m)
  in System.Windows.Forms.ScrollableControl.WndProc(Message& m)
  in System.Windows.Forms.ContainerControl.WndProc(Message& m)
  in System.Windows.Forms.UserControl.WndProc(Message& m)
  in System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
  in System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
  in System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Assembly caricati **************
mscorlib
   Versione assembly: 4.0.0.0
   Versione Win32: 4.7.2098.0 built by: NET47REL1LAST
   Base di codice: file:///C:/Windows/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll
----------------------------------------
Quad64
   Versione assembly: 1.0.0.0
   Versione Win32: 1.0.0.0
   Base di codice: file:///C:/dev/cs/Quad64/bin/Debug/Quad64.exe
----------------------------------------
System.Windows.Forms
   Versione assembly: 4.0.0.0
   Versione Win32: 4.7.2094.0 built by: NET47REL1LAST
   Base di codice: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System
   Versione assembly: 4.0.0.0
   Versione Win32: 4.7.2093.0 built by: NET47REL1LAST
   Base di codice: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Drawing
   Versione assembly: 4.0.0.0
   Versione Win32: 4.7.2046.0 built by: NET47REL1
   Base di codice: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
OpenTK
   Versione assembly: 2.0.0.0
   Versione Win32: 2.0.0
   Base di codice: file:///C:/dev/cs/Quad64/bin/Debug/OpenTK.DLL
----------------------------------------
OpenTK.GLControl
   Versione assembly: 1.1.0.0
   Versione Win32: 1.1.2349.61993
   Base di codice: file:///C:/dev/cs/Quad64/bin/Debug/OpenTK.GLControl.DLL
----------------------------------------
System.Configuration
   Versione assembly: 4.0.0.0
   Versione Win32: 4.7.2046.0 built by: NET47REL1
   Base di codice: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Core
   Versione assembly: 4.0.0.0
   Versione Win32: 4.7.2098.0 built by: NET47REL1LAST
   Base di codice: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll
----------------------------------------
System.Xml
   Versione assembly: 4.0.0.0
   Versione Win32: 4.7.2046.0 built by: NET47REL1
   Base di codice: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------
System.Windows.Forms.resources
   Versione assembly: 4.0.0.0
   Versione Win32: 4.7.2046.0 built by: NET47REL1
   Base di codice: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms.resources/v4.0_4.0.0.0_it_b77a5c561934e089/System.Windows.Forms.resources.dll
----------------------------------------
Newtonsoft.Json
   Versione assembly: 10.0.0.0
   Versione Win32: 10.0.3.21018
   Base di codice: file:///C:/dev/cs/Quad64/bin/Debug/Newtonsoft.Json.DLL
----------------------------------------
mscorlib.resources
   Versione assembly: 4.0.0.0
   Versione Win32: 4.7.2046.0 built by: NET47REL1
   Base di codice: file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/mscorlib.resources/v4.0_4.0.0.0_it_b77a5c561934e089/mscorlib.resources.dll
----------------------------------------
(This post was last modified: 08-07-2017, 02:57 PM by Fendoroid.)

Updated to version 0.1.1, which should fix most of the major bugs that people have reported.
  • The program will now ask you if you want to save the ROM file before opening a new ROM, launching the ROM in an emulator, or closing Quad64, etc. (if the file is not already saved).
  • Added an option to cull triangle backfaces in settings
  • Added an option to automatically save the ROM file when the "Launch ROM" button is pressed
  • Added a black wireframe outline to the collision map, so now you should see where each triangle is.
  • Fixed some crashing errors that appeared in some of Kaze's ROM hacks.
  • Fixed a bug where the editor read the Macro Preset ID wrong, so Macro Objects should now no longer get corrupted.
  • Fixed wireframe rendering
  • The "Platform not supported" error message when trying to build the source code should be fixed. (Thanks Guccifer)
@Fendoroid

I couldn't fit everything into this update due to lack of time, but I'll try to add in some more stuff later on. The Macro Object bug was me being an idiot and I read the preset ID from the wrong byte. lol

To answer your two questions:

1.) Super Mario 64 supports up to 8 areas, starting with area 0 and ending with area 7. I'm not sure why, but the developers only ever use 4 areas and start with the id of 1 instead of 0. I did test out having 8 areas in a custom level, and I can confirm that this works.

2.) VL-tone's notes said that there were only 2 parameters, but that is not technically the case. I do admit that the invalid info on the wiki was my mistake, which I will fix. All 4 bytes are loaded up as a 4-byte word and stored to Object->0x188, and then only the second byte in that word gets stored to Object->0x144. I noticed this behavior before with the Load Mario (0x25) levelscript command, but only recently did I discover that also happens with normal objects as well. 
(This post was last modified: 09-07-2017, 03:38 AM by David.)

I have some suggestions and ideas I'd like to see in future versions, since you were looking for a to-do list:
  • Change object combos. For whatever reason, I can't get this functionality to work most of the time. An example: I turn a coin into a 1UP, but the coin is still in-game even after saving. Is this a bug perhaps?
    EDIT: Figured out that you have to move the object first after changing its combo, so I'm guessing it's a bug
  • Undo and Redo
  • Copy and Paste
  • Ctrl+S and other common hotkeys
  • Pressing delete while an object is highlighted will turn it into an Empty Object. This is so you don't have to change its combo every time you want to get rid of something.
  • ABC or 123 sorting of object lists (I would prefer ABC by default)
  • Standard camera views such as Top, Bottom, Left, and Right. This helps with precision.
  • Arrows which move, elevate, or rotate objects one unit at a time in each axis.
  • Being able to select, move, or rotate multiple objects at once
  • (ambitious) SM64 Editor/Importer integration as well as other tools
  • Behavior, model ID, and parameter names plus a list to change each of these with
  • An option to invert camera panning vertically or horizontally
  • The option to name and save otherwise Unknown object combos (for example a normal object combo with its model ID changed or one of Kaze's objects)

Quad64 already feels much better than TT64 despite some limitations. You're doing a great job so far!
(This post was last modified: 09-07-2017, 05:22 AM by Flame8765.)

(09-07-2017, 05:14 AM)Flame8765 Wrote: I have some suggestions and ideas I'd like to see in future versions, since you were looking for a to-do list:
  • Change object combos. For whatever reason, I can't get this functionality to work most of the time. An example: I turn a coin into a 1UP, but the coin is still in-game even after saving. Is this a bug perhaps?
    EDIT: Figured out that you have to move the object first after changing its combo, so I'm guessing it's a bug
  • Undo and Redo
  • Copy and Paste
  • Ctrl+S and other common hotkeys
  • Pressing delete while an object is highlighted will turn it into an Empty Object. This is so you don't have to change its combo every time you want to get rid of something.
  • ABC or 123 sorting of object lists (I would prefer ABC by default)
  • Standard camera views such as Top, Bottom, Left, and Right. This helps with precision.
  • Arrows which move, elevate, or rotate objects one unit at a time in each axis.
  • Being able to select, move, or rotate multiple objects at once
  • (ambitious) SM64 Editor/Importer integration as well as other tools
  • Behavior, model ID, and parameter names plus a list to change each of these with
  • An option to invert camera panning vertically or horizontally
  • The option to name and save otherwise Unknown object combos (for example a normal object combo with its model ID changed or one of Kaze's objects)

Quad64 already feels much better than TT64 despite some limitations. You're doing a great job so far!

I second this, the tool seems like it's the Messiah for SM64 Hacking community lol, great job!!
I would add also a texture editor like TT64, but without the awkward alpha system and more like n64rip (and all the textures btw, inclusive HUD)
[Image: Mastery_sketchup.png] [Image: Mastery_paintdotnet.png]

A unhandled exception occurs when I try to open Skelux's Super Mario 64 Multiplayer rom 1.3.1. This happens in TT64 as well, very strange. This also happens when I open Super Mario Star Road Multiplayer 1.2.1. I guess the multiplayer code is making it crash?

EDIT: I also tested your sm64extender GUI program and sm64extend crashes if you go to custom and try to extend to 12MB and even all the way up to 18MB. So it works until you go under 18MB, it is supposed to be able to extend the size of a rom between 12MB to 64MB. Just a small bug, but it still crashes none the less.
(This post was last modified: 14-07-2017, 08:04 PM by SuperToad64.)

The tool sounds great! I'm sure this will boost the SM64 hacking community; with all of TT64's bugs and crashes.
I know catching up with TT64/adding features is a priority right now, but the UI could use some reworking.
-Why gradients in the move/rotate boxes when the whole UI is flat? I think it'd look better with flat colors. (you should drop the rounded corners too)
-Black font on dark grey background is a bit hard to read. You should change the text to white or make the background white.
-The serif font is weird.. You should use roboto/arial

Sorry if that sounds condescending it wasn't my intention Sad But anyway, hope you'll keep this in mind and thanks for giving a new start to the SM64 community!
(This post was last modified: 16-07-2017, 08:13 PM by Biobak Underscore.)
"Even if you build speed for 12 hours,  you can't escape the pain"

Quad64 v0.1.1 - A new open source SM64 level editor 1 2 »
Users browsing this thread: 1 Guest(s)