Microsoft 3D Movie Maker Source Code
github.com
github.com
Jez also offered this interesting BRender anecdote in an email:
When Sam Littlewood designed BRender, he didn’t write the code. And then document it.
The way most things were built at the time.
First, he wrote the manual. The full documentation
That served as the spec. Then the coding started.I guess perhaps you are working with some very obfuscated code, still if you are black box profiling code it might make sense to crack open that box as much as possible. Unless what you are working with is DRM-level "performs like cow dung in a blender" horrifically inefficient, I can't imagine it is obfuscated that badly.
At any rate, hopefully you are paid well for it, reverse engineering is difficult, to say the least.
That means you have to study the old code, which is of course poorly documented and probably buggy; and then try to reproduce it in a sane way.
- https://github.com/ruby/ruby.wasm (compile Ruby to WASM)
- https://mame.github.io/emruby/ (example of Ruby compiled to WASM)
- https://opalrb.com/ (compile a subset of Ruby to JS)
This requires downloading several MB of code (and then caching it in-browser) so would be ideal for internal-only stuff.
(Part of my thinking with this solution is to broadcast "you are asking me to do something that requires a solution this complex to wrangle the problem space effectively" to try to fend off similar inanity in the future, admittedly, perhaps I'm being a bit optimistic/unrealistic heh.)
I decompiled the app, documented the UI and which variable is what. Rewrote the whole app. It was quite painful but good learning experience. I would love to do another one.
Actually implementing something is left to the final 30% of a project. One must first bore themselves to death with design and documentation before a single line of code is written.
This really only works if you have done the same or something very very similar before and so you have practically no unknowns. Notice that the developer who did that commented above that they had already done similar work at the past.
Also related this quote about how Joe Armstrong (of Erlang fame) approached problems (from [0]):
> Joe wrote amazingly simple programs and he did so in a peculiar way. First he wrote down the program any old way just to get it out of his head. Then once it worked he would then immediately create a new directory program2 and write it again. He would repeat this process five or six times (program5, program6, ...) and each time he would understand the problem a little better and sense which parts of the program were essential enough to re-type. He thought this was the most natural thing in the world: of course you throw away the first few implementations, you didn't understand the problem when you wrote those!
I'm incredibly impressed with programmers that can visualize a large program and the end product actually resembles what they originally envisioned. That is a gift.
It's been very pleasant, and allowed me to make good sense of what I was doing and where I was going.
1: https://tom.preston-werner.com/2010/08/23/readme-driven-deve...
You start e.g. with a press release and then make your way backwards to the user stories and backlog.
It's a very useful approach to think big and focus on the problem instead of the many little issues that need to be solved.
The problem is that programming is still knowledge work. That means you can not specify everything beforehand without doing the actual work. (Like writing a novel, which can not specified before.) The solution would imho be a good balance between description the big picture/desired result (good) and spec'ing out every little detail and screen in advance (bad).
It was pitched as something like "wishful thinking programming" IIRC. First you write the highest-level "business logic" code that you want to write with made-up constructs that have no implementation, then only once you've established that it feels good to write code using those constructs do you implement them.
I remember this also being the same approach that was used in a CPU-building course I took (NAND 2 Tetris): start with the instruction set, then implement it.
Oftentimes in the book, they will write out a function with reliance on a variety of other functions that haven't been written yet, but which show a blissfully declarative outline of exactly what the function does. Then you go and write the sub-functions.
Looking at the code after is quite nice, but it takes a bit to wrap your head around writing large swaths of code that can't run -- especially when you're used to writing REPL-driven code and consistently checking/"testing" it
I think you should consider writing unit tests before coding but then delete them and then write regression tests after. Though, haven't tried this approach yet.
The starting point for BRender was a sequence of software rendering experiments that grew from 'never doing it like our hand coded asm real mode x86 renderers ever again'. There were various diversions, eg: an achingly beautiful plane sweep that only rendered the visible parts of each output scanline, whilst murdering the cache so comprehensively that there are likely still lines waiting to be filled even now. Fortunately, to get the FX Fighter team going with something stable whilst debugging continued, I knocked up a Z buffer implementation, and was given a sharp lesson on caching when it blew all the previous attempts away (notably with consistency of performance).
Arriving at this point we figured there might be a product in it and looking at our own interaction with other libraries, it was clear that a manual was key to this. If I remember correctly, the API was a negotiation between myself proposing designs, and Crosbie Fitch documenting it - pushing back with ways to make things easier to explain.
It worked out very well, and we took it into later Argonaut hardware projects. The hardware guys had enough tools to do frame capture and replay from various games/apps at a low level, so were not desperate for a full software stack. The clients had very particular views about how APIs should look, depending on planned uses, in house style, compatibility etc. We would negotiate the API documentation back and forth - including lots of sample code.
This sample code was important, (and BRender would have benefited from more of this). I took lots of real use cases, then wrote proper code to implement them against the proposed APIs and included them in the docs as tutorial and example code. Importantly - they were a representative sampling of the anticipated uses (not just the easy ones), they were not 'handwavy' and included all appropriate resource management and error handling, and they had to read well on the page. As the API negotiation continued, so the examples and tutorials got updated.
This process also had the benefit that we only started investing in client specific software development once the project had got enough momentum (typically committing hardware NRE).
These days I am always being rushed through sprints barely knowing what is going on.
What you described sounds like a wonderful way to actually engineer a great API.
Just because you say you want it in 2 weeks does not make it so. Don't over promise, you will be severely disappointed. Software breaks, it does not care for deadlines.
The thing I was talking about was larger scale projects like the ones mentioned by the author (of the sort I work on at my day job) where you have teams of stakeholders and outside influence combined with a desire to release rapidly in an iterative form.
Software these days is just done differently in those contexts...we can't slow down enough to do what was detailed above...I just wish the world was sorted in a way or slowed down enough to do REAL engineering.
Whilst the official progress is top down, the duck's feet are working hard feeling along the bottom to check for obstacles.
a more elegant weapon, from a more civilized age, may the forth be with you ;)
Very evocative writing, I love it.
The code was mostly C, with some protected mode x86 for inner loops. Prior to that point, all our PC games had been real mode x86- and BRender was a result of moving away from that.
I dug into the released BRender source until I found the inner loops, then I "Nope!"'d all the way out and remembered why I never went back to assembler.
Thanks for the memories. I'm glad the code survived all these years until it could be released.
If it is, "Hello Sam!"
I still remember winning the 'Bog Roll d'Or' for being last man standing in the Phall eating competition.
Oh, and the Yaohan Plaza (aka Oriental City, Hendon).
1. In linux
2. Install wine 7.5 (other versions may work, this is what I used)
3. Create a 32-bit wineprefix on a *case-insensitive* ext4 drive (https://www.collabora.com/news-and-blog/blog/2020/08/27/usin...)
4. Download MSVC 2.0 (https://winworldpc.com/product/visual-c/2x), extract and install it into the 32-bit wineprefix - Make sure you use `wine32 winecfg` and set the OS to Windows 95
5. Copy the files to C:\3d inside the wineprefix
6. Enter command prompt from wine (`wine32 cmd`)
7. `set include=C:\MSVC20\INC`
8. `.\setvars.bat`
9. `nmake`
Unfortunately wine segfaults for me when compiling one of the BRender files :'(
EDIT: Now I have Bren and Engine building! Studio does not build, reports that it doesn't know how to generate 'C:\3d\kauai\obj\wins\utilglob.obj'. Probably something simple...
Just create a disk image and mkfs.ext4 it :)
mkdir -p ~/wine/prefix
truncate -s 10G ~/wine/wine.img
mkfs.ext4 -flags -foo -bar ~/wine/wine.imgthere are subtile changes between the very early studio versions but when reaching VS2005/2008 everything is fine for upgrade
https://github.com/benstone/Microsoft-3D-Movie-Maker
there are a few that started to port: https://github.com/microsoft/Microsoft-3D-Movie-Maker/networ...
Argonaut rang a bell, and sure enough - Jez developed Starglider, one of my all time favourite games on the Amiga.
I can still remember it today, nearly four decades later: It was the first time I visited a new friend, who was the first in our neighbourhood to get the Amiga. He fired up Starglider- and I was simply blown away.
My C64 didn't cut it anymore - I just had to get the Amiga. An involvement in the Norwegian demo scene followed. This later had a big impact on my career as a SWE; thanks very much for this, Jez, if you're here!
But wireframe only, I think?
I think Starglider 2 was inspired in part by Zarch on the Archimedes, and the free Lander demo that came with every Archie.
https://www.youtube.com/watch?v=mFwpsb75omg
It is hard to put into words how amazing it was to see this running, live and playable, on a home computer in 1987.
Jez San also co-designed the SuperFX 3D accelerator chip in the SNES game Starfox. That evolved into the ARC RISC CPU family.
An ARC core was the Intel Management Engine chip in Intel CPUs before they switched to an x86 ME controller running Minix 3.
https://en.wikipedia.org/wiki/Intel_Management_Engine#Hardwa...
And that ARC core ran ThreadX, which is the same OS that runs on the GPU of every Raspberry Pi.
https://en.wikipedia.org/wiki/ThreadX
San offered me a job once, nearly 30Y ago. I should have accepted it. :-D
btw, the arc core got used in lots of things that you never hear about... like in Sandisk memory cards (no relation), and various set top box chips (mpeg etc), and wifi chips (at the time, most intel wifi chips used arc)
we used the opposite approach to design the Super FX chip (we called it the Mario chip - likely the first ever gpu)
Carl & Pete would write code to do 3d math and render polygons... and write and re-write the code hundreds of times, using an imaginary assembler language. they would invent new instructions on the fly to let their code get tighter. they would keep coming up with new instructions, new registers, new ways of forming instructions and referencing registers etc... until the code was the tightest... and THEN, we designed a microprocessor from scratch to execute those instructions.
Also, likely the opposite way that microprocessors were designed... because (in the past) the designers had no idea what their cpus were going to be used for, whereas we knew what we wanted to achieve, so got to use software to drive the hardware design.
this was the first time that a cpu was able to be designed using programmable gate arrays. literally Ben & Rob could make a change to the hardware design - the netlist, and email it off to the usa, and actel would Fedex back the next day a working chip for us to try out. this was before you could program your own fpga's yourself (and Xilinx at the time wasn't large enough to fit a whole microprocessor). this iterative approach allowed us to design the optimum 'gpu' for the task.
If I missed something then apologies.
wrote my first 3d games on the bbc computer (1982-1983) and then got a Mac in 1984.. and did more 3d on the Mac. I started StarGlider on the Mac, written in 68000 code.. and then ported it to the Amiga and Atari ST when they came out. I had the first Amiga outside the USA.
https://www.amazon.co.uk/Principles-Interactive-Computer-Gra...
https://www.amazon.com/Applied-Concepts-Microcomputer-Graphi...
(And how did Nintendo find a company in the UK to work with considering the language barriers?)
They pulled out a Nintendo Gameboy and proceeded to put an unlicensed prototype game cartridge in it, which booted successfully even without Nintendo's approval
Nintendo was so impressed with the engineering talent they agreed to work with them thereafter
And Fuzzz (aka James Hakewill, now at Tesla AI) was designing silicon including The ARC.
its a pretty well known story as to how we got involved with Nintendo.
I went up to a senior Nintendo guy at a CES show and showed him some stuff that blew him away. I was on a flight to meet Mr Yamauchi in Japan a few days later.
We had Argonaut team members stationed inside Nintendo working directly for Mr Miyamoto, et al
our team back in UK did the tech stuff, and the team inside Nintendo built the games.
It was only the second time that Nintendo had worked with a company outside Japan (the first was Rare ltd)
Even my (younger) brother remembered Starglider well; he's also gone on to do well for himself with a leading role in IT administration in the health sector.
we thought that if we built a trustless casino technology that used smart contracts to power the games and generate provably fair random numbers so that no customer would ever have to play an unfair game.. and that no funds had to be held in the custody of the casino... that there'd be a market for that. we wuz wrong. the market doesn't seem to care about something that's non-custodial or guaranteed fair. we shuttered it about 18 months ago.
so we've pivoted. we're experimenting with NFTs, and driving games. And investing in other worthy projects.
Thanks for your work on open sourcing awesome old Microsoft stuff!
[1] https://www.radbasic.dev/ https://news.ycombinator.com/item?id=31202696 (3 points, 4 days ago, 0 comments)
1. <Company> releases source code to old useless thing that's only of historical interest
2. Ginormous community forms around it (see also: retrocomputing in general, niche hyperfocused interest groups around old software like this)
3. Community basically picks old useless thing up off the ground and rocket-boosts it into being fun and genuinely usable
4. Now-useful thing becomes a way to do cool stuff; it is now relevant!!1
This phenomena can only work if one very specific thing is true: if the functionality made available by the software in question is closed-ended. DOS 3.30 is closed-ended; it doesn't support all the APIs of DOS 6. This software is also closed-ended, in the sense that there would be no real-world value gained from trying to make this specific codebase line up with contemporary standards (of code design, or render quality, etc etc); such a project would universally be easier to start from scratch, even if it was using this as a base for inspiration. Community effort to fix something like this without completely ship-of-Thesesus-ing it will get a decent bit of the way there, but (being a tad objective) it'll have a stopping point. I think this scope limitation is a key part of what makes it possible to release old stuff like this.
Win98 and VB6 and things of a similar class have both huge niche focus and interest by the retrocomputing community, AND they are fundamentally open in the sense that Win98 is an entire operating system, and VB6 is an entire development environment. The purpose of both products is fundamentally to enable. To enable you to run software and enable you to build it. So, couple all that potential with the reception the release would bring, and... oops, the community forked Win98 and made it run on the latest CPUs and added VM window resize support and started backporting random NT (and brand-new) APIs to make it do new and random stuff. And then they went and fixed all the bugs in VB6's runtime and added a JIT (!) and WASM support and ThEn ThE FaTeFuL GiThUb IsSuE #42 GoT OpEnEd WhErE SoMeOnE AcTuAlLY OuTlInEd HoW To SuCcEsSfUlLy PoRt iT tO LiNuX.
The other problem is that things like old versions of Windows or Visual Basic are of a scale that's an order of magnitude larger than smaller releases like the one presented here, making community enablement that much more impactful - maybe not to the full order of magnitude, but to an extent that is nontrivial... and might hit the tipping-point of virality that would really attract attention to the project and get it front-and-center into the pop-culture limelight.
My working theory is that there's isn't anything fundamentally wrong with this, to the extent that it's quite possible legal wouldn't fundamentally be totally against it. Rather, you have
<Company> officially open sources thing -> community promptly hefts thing onto their collective shoulders -> thing is now relevant -> thing's open-endedness combined with its relevance turns it into a serious contender for contemporary mindshare -> everyone starts looking at <company> and making noises about how the original release was technically official -> people start asking why <company> "has abandoned *thing*"
D:
If anyone could shoot down this idea and let me know it is actually some other type of legal ramification (that maybe I could get further details about in person someday) I would be very appreciative.
EDIT: This is now at 0. Okay... interested to hear more details. (Edit2 just before it locks: it's back to 1 at least heh)
Someone needs to work on these releases and the big ones can be scary, especially from a legal point of view. So they'll just slowly release one small item at a time, and hopefully over time most of them are out in the open. Maybe we even get some big fish, like Win98.
They're already out there as source code leaks, but it would be nice to be able to view it legally and perhaps more completely, in a similar way to how we can view the .NET reference source.
I really enjoyed browsing the NT4 and 2000 leaks, it was fascinating to see how Windows works under the hood, and I was interested to see how well (or not) my understanding of the disassembly matched up with where it came from. It also helped massively with troubleshooting and understanding API surfaces, particularly the kernel side.
Could this ever happen, is there the political will internally to be even more open on the OS side?
Besides the fact that they have to scan the code, remove offensive bits, figure out if some code is still in use and it might have security vulnerabilities or could disclose things they don't want disclosed, etc.
I guess they're slowly open sourcing kind of stand alone components, to bank on nostalgia.
I wouldn't be surprised if 20 years from now all the Windows plumbing is open source (it's not a money maker for them, anyway), à la Darwin and MacOS, and they just keep the management layer proprietary: settings, shell, UI toolkit, etc.
Is this position hiring? :D
(New career goals: become high up enough in the company that I can decree that the open-source office and company archivist positions get merged into the same team.)
I'd love to see classic Notepad and MS Paint too.
But the most important part of notepad was the editing component, which was a standard win32 component, and wasn’t part of the leak. It’s also unlikely they’ll release it since it’s part of current windows.
You can find torrents of the source code online and dig around in it if you don't mind breaking the law (or ruining your chances of being allowed to contribute to Wine or ReactOS in the future).
I should see if I still have my CDs for it somewhere so I can run it in a VM.
I think there's a viscerally satisfying feeling you get when making something that you just don't get when you're playing someone else's game. 3DMM might have had 1% of the budget of a modern Call of Duty game, but I'll remember the time I spent playing 3DMM substantially more.
You don't need to know how to draw or sketch. Just write. Inform7 it's a logical clause based language, that's it, you just state conditions and the compiler makes your adventure. Inform6 it's object oriented but it's the easiest OOP language ever, you can create a 10x10 "room" size town in minutes and defining the objects can take less than an hour. The logic and debug, well, maybe some days/weeks, but far less than a graphical game.
And the most crazy stuff: after that, you'll game will run under DOS, Amiga, Android, GNU/Linux, BSDs, Windows, IOS, everywhere where a Z-Machine interpreter like frotz exists.
Opening your adventime game on a DOS/Amiga emulator and watching it running in the same way as your desktop PC it's astounding.
When I opened my prototype (In Spanish, thanks to INFSP6 for Inform6) under UAE with Amiga OS 3.1 and Frotz, and later, Frotz for DOS under DOSBox, the feeling was incredible.
That definitely falls within my framework though; I think people sometimes underestimate how much fun creation can be when it's straightforward. It makes me sad that Project Spark for the Xbox One never really took off, since I feel like it followed in the footsteps of RPG Maker for the PS1 or Fighter Maker for the PS2.
I also was a bit saddened when Project Spark got shutdown. It had some great ideas, it just couldn't compete with Minecraft and Microsoft bought Minecraft. I keep wondering why more of Project Spark's good ideas don't show up in Minecraft at this point, though.
Seriously. It'll likely both take a little while, yet be usable much sooner than you expect.
There is a community still going around this where people post there movies and stuff - https://www.3dmm.com/
Oh wow, good times!
I then attempted to make a technically complex movie myself, and of course my HDD crashed - seems as a kid I could never catch a break when it came to technology :P
hope they will every release the good old Basic Compiler bascom/basrun stuff
> The infamous Comic Sans font also made its first appearance in 3D Movie Maker
"Comic Sans was designed by Vincent Connare to fit the theme of Microsoft Bob and was inspired by comics like Watchmen and Batman. It would have fit Bob’s animated interface, but it wasn’t completed in time for the release. Given the short lifespan of Bob, we’d never learn to use Windows in Comic Sans. The font did get included in later Microsoft programs starting with Microsoft 3D Movie Maker."
From https://uxdesign.cc/the-ugly-history-of-comic-sans-bd5d07f8c...
I feel like it's almost a shame that it has been deemed as "unprofessional", I think largely because of people using it in places that it doesn't really fit (e.g. the aforementioned research papers). I think there exists an alternate universe where people appreciate Comic Sans for the treasure that it is, and I suppose I can thank both MS Bob and 3DMM for it :).
I'm definitely not dyslexic, but I genuinely do just find Comic Sans to be easy to read. Serifs don't throw me off or anything and they look pretty, but they do kind of feel like noise when I'm actually just trying to read. Comic Sans just feels...legible? Like it was intended to be read-first, don't worry about impressing.
I did find a noticeable speed improvement in NaNoWriMo attempts when writing in Comic Sans. I find that fascinating.
You can be "productive" with 3DMM in a matter of minutes, vs the few hours it takes for Godot. Of course, Godot is infinitely more capable than 3DMM, so it's sort of apples and oranges.
This org chart is as accurate as it was in 2011:
https://www.cultofmac.com/102917/apple-ms-google-etc-imagine...
One group is moving forward and another one is putting ads in the OS...
- https://youtu.be/PGJKeESLBpQ
- https://youtu.be/X0pEBE_eYdU
- https://youtu.be/H8Nbd4yO1qw (this is a reup from 2009)
- https://youtu.be/VqqRRWIYiy8?t=16
Actually there is an entire playlist you can enjoy:
https://www.youtube.com/playlist?list=PL_7_xaiHt-pegi1SwC1tV...
A random aside. Note on the videos from 2006/7, you've got comments from the last year joking that the authors are time-travelers spreading Gen-Z humor to the past.
https://archive.org/details/nick3dmoviemaker
https://nickelodeon.fandom.com/wiki/Nickelodeon_3D_Movie_Mak...
They already did great jobs with expanding the tools via RE but I wonder if anyone will start adding new features.
Other goals, as far as I remember, are removing limitations on number of objects etc., the ability to export in a modern video format, and different resolutions.
Primary Author : *** Review Status: Reviewed
I wonder what was their process for version control and code review back in the day?
There are surprising few files but those that are here are massive.
https://www.youtube.com/watch?v=gqXTzlDZmhU
see comments on youtube
Like, what in the world is cd12, cd2, cd3, cd9? Somehow it gets worse when you click into them.
Having worked on code thats at least 20 years older than me, by the far the hardest parts to work out are the func1, func2, func3.
Unfortunate given Microsoft's track record of maintaining backwards compatibility
The important thing is it's a starting point. foone specifically indicated a desire to update and extend the software, which means at minimum, a fork that runs on modern platforms.