Git Product home page Git Product logo

woof's Introduction

This is Woof!

Woof! Icon

Top Language Code Size License Release Release Date Downloads Commits Last Commit Build Status

Woof! is a continuation of Lee Killough's Doom source port MBF targeted at modern systems.

Synopsis

MBF stands for "Marine's Best Friend" and is widely regarded as the successor of the Boom source port by TeamTNT. It serves as the code base for popular Doom source ports such as PrBoom+/DSDA-Doom or The Eternity Engine. As the original engine was limited to run only under MS-DOS, it has been ported to Windows by Team Eternity under the name WinMBF in 2004. Woof! is developed based on the WinMBF code with the aim to make MBF more widely available and convenient to use on modern systems.

To achieve this goal, this source port is less strict regarding its faithfulness to the original MBF. It is focused on quality-of-life enhancements, bug fixes and compatibility improvements. However, all changes have been introduced in good faith that they are in line with the original author's intentions and even for the trained eye, this source port should still look very familiar to the original MBF.

In summary, this project's goal is to fast-forward MBF.EXE from DOS to 21st century and remove all the stumbling blocks on the way. Furthermore, just as MBF was ahead of its time, this project dedicates itself to early adoption of new modding features such as DEHEXTRA+DSDHacked, UMAPINFO and MBF21.

What's with the name?

If you turn the Doom logo upside down it reads "Wood" - which would be a pretty stupid name for a source port. "Woof" is just as stupid a name for a source port, but at least it contains a reference to dogs - and dogs are the Marine's Best Friend. 😉

Key features

  • Arbitrary resolutions up to native display resolution with dynamic resolution scaling (DRS) to automatically change the internal resolution to maintain a target framerate.
  • Widescreen rendering with proper support for widescreen assets.
  • Rendering with uncapped frame rate and frame interpolation.
  • Adjustable field of view (FOV).
  • Support for voxels in KVX format.
  • 3D audio, supporting stereo and up to 7.1 surround sound with an optional HRTF mode, as well as PC speaker emulation.
  • Several music backends: native MIDI, FluidSynth with a bundled soundfont, built-in OPL3 emulator. Digital music and sound formats supported by libsndfile, module music supported by libxmp.
  • Modern gamepad support.
  • Mouselook.
  • Autoload directories.
  • Savegame backward compatibility up to MBF.EXE.
  • Integration of the Chocolate Doom network code.
  • Compatibility levels: "Vanilla", "Boom", "MBF" and "MBF21" (default).

Capabilities

  • Support for extended nodes in uncompressed XNOD or XGLN and compressed ZNOD or ZGLN formats, and DeePBSP format.
  • Integration of the NanoBSP node builder (enforce with -bsp) for maps without nodes or with unsupported nodes (not demo compatible).
  • Tall textures and sprites in DeePsea format.
  • Unlimited extra states, sprites, mobjtypes and sounds for use in Dehacked patches (supporting the "DEHEXTRA" and "DSDHacked" specs).
  • In-game music changing using MUSINFO.
  • UMAPINFO support, compliant to Rev 2.2 of the spec.
  • MBF21 compatibility level, compliant to Rev 1.4 of the spec.
  • SMMU-style swirling animated flats.
  • Customization of the extended Boom HUD using the WOOFHUD lump.

Usage

Releases

Source code, Windows binaries (MSVC builds for Windows 7 and newer) and Linux AppImages for the latest release can be found on the Release page.

The most recent list of changes can be found in the current Changelog.

Compiling

The Woof! source code is available at GitHub: https://github.com/fabiangreffrath/woof.

It can be cloned via

 git clone https://github.com/fabiangreffrath/woof.git

Linux, and Windows with MSYS2

The following build system and libraries need to be installed:

Usually your distribution should have the corresponding packages in its repositories, and if your distribution has "dev" versions of those libraries, those are the ones you'll need.

Once installed, compilation should be as simple as:

 cd woof
 mkdir build; cd build
 cmake ..
 make

After successful compilation the resulting binary can be found in the src/ directory.

Windows with Visual Studio

Visual Studio 2019 and VSCode comes with built-in support for CMake by opening the source tree as a folder.

Install vcpkg https://github.com/Microsoft/vcpkg#quick-start-windows. Integrate it into CMake or use toolchain file:

 cd woof
 cmake -B build -DCMAKE_TOOLCHAIN_FILE="[path to vcpkg]/scripts/buildsystems/vcpkg.cmake"
 cmake --build build

CMake will automatically download and build all dependencies for you.

Contact

The canonical homepage for Woof! is https://github.com/fabiangreffrath/woof.

Woof! is maintained by Fabian Greffrath.

Please report any bugs, glitches or crashes that you encounter to the GitHub Issue Tracker.

Acknowledgement

MBF has always been a special Doom source port for me, as it taught me how to implement 640x400 resolution rendering which was the base for my own source port project Crispy Doom. As the original MBF was limited to run only under MS-DOS, I used its pure port WinMBF by Team Eternity to study and debug the code. Over time, I got increasingly frustrated that the code would only compile and run on 32-bit systems and still use the meanwhile outdated SDL-1 libraries. This is how this project was born.

Many additions and improvements to this source port were taken from fraggle's Chocolate Doom, taking advantage of its exceptional portability, accuracy and compatibility. Further sources of inspiration are PrBoom+, DSDA-Doom and The Eternity Engine.

Special thanks to @rfomin and @ceski-1 for implementing the more advanced features of this port, and @JNechaevsky and @MrAlaux for helping to port back some useful features from their own source port projects!

Legalese

Files: *
Copyright:
© 1993-1996 Id Software, Inc.;
© 1993-2008 Raven Software;
© 1999 by id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman;
© 1999-2004 by Jess Haas, Nicolas Kalkhof, Colin Phipps, Florian Schulze;
© 2004 James Haley;
© 2005-2006 by Florian Schulze, Colin Phipps, Neil Stevens, Andrey Budko;
© 2005-2018 Simon Howard;
© 2006 Ben Ryves;
© 2007-2011 Moritz "Ripper" Kroll;
© 2008-2019 Simon Judd;
© 2017 Christoph Oelckers;
© 2019 Fernando Carmona Varo;
© 2020 Alex Mayfield;
© 2020-2024 Fabian Greffrath;
© 2020-2024 Roman Fomin;
© 2021-2022 Ryan Krafnick;
© 2022-2024 Alaux;
© 2022-2024 ceski;
© 2023 Andrew Apted;
© 2023 liPillON.
License: GPL-2.0+

Files: src/beta.h
Copyright: © 2001-2019 Contributors to the Freedoom project.
License: BSD-3-Clause

Files: src/dogs.h
Copyright:
© 2017 Nash Muhandes;
© apolloaiello;
© TobiasKosmos.
License: CC-BY-3.0 and CC0-1.0

Files: src/nano_bsp.*
Copyright: © 2023 Andrew Apted.
License: MIT

Files: src/u_scanner.*
Copyright:
© 2010 Braden "Blzut3" Obrzut;
© 2019 Fernando Carmona Varo.
License: BSD-3-Clause

Files: src/v_flextran.*
Copyright:
© 2013 James Haley et al.;
© 1998-2012 Marisa Heit.
License: GPL-3.0+

Files: src/v_video.*
Copyright:
© 1999 by id Software, Chi Hoang, Lee Killough, Jim Flynn, Rand Phares, Ty Halderman;
© 2013 James Haley et al.
License: GPL-3.0+

Files: cmake/FindSDL2.cmake, cmake/FindSDL2_net.cmake
Copyright: © 2018 Alex Mayfield.
License: BSD-3-Clause

Files: data/woof.ico, data/woof.png, src/icon.c, data/setup.ico, data/woof-setup.png, setup/setup_icon.c
Copyright: © 2020-2022 Julia Nechaevskaya.
License: CC-BY-3.0

Files: miniz/*
Copyright:
© 2010-2014 Rich Geldreich and Tenacious Software LLC;
© 2013-2014 RAD Game Tools and Valve Software.
License: MIT

Files: spng/*
Copyright: © 2018-2023 Randy.
License: BSD-2-Clause

Files: opl/*
Copyright:
© 2005-2014 Simon Howard;
© 2013-2018 Alexey Khokholov (Nuke.YKT).
License: GPL-2.0+

Files: soundfonts/TimGM6mb.sf2
Copyright:
© 2004 Tim Brechbill;
© 2010 David Bolton.
License: GPL-2.0

Files: textscreen/*
Copyright:
© 1993-1996 Id Software, Inc.;
© 2002-2004 The DOSBox Team;
© 2005-2017 Simon Howard.
License: GPL-2.0+

Files: win32/win_opendir.*
License: public-domain

woof's People

Contributors

alexmax avatar beworld2018 avatar ceski-1 avatar chungy avatar fabiangreffrath avatar facespkz avatar fragglet avatar gendlin avatar haleyjd avatar jadingtsunami avatar jnechaevsky avatar joanbm avatar kraflab avatar lamby avatar lippeth avatar loopfz avatar melak47 avatar mikeday0 avatar mralaux avatar pedro-beirao avatar pmjdebruijn avatar qurious-pixel avatar rfomin avatar rrpkrr avatar tomas7770 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

woof's Issues

fix occasional random crashes (probably related to the sound system)

the currently sound implementation in Source/i_sound.c is cryptic to me and I suspect it to be the cause for some of the apparently random occasional crashes. It may be best to port over the relevant parts (i.e. not libsamplerate, for example) of src/i_sdlsound.c from Chocolate Doom.

consider applying the Wiggle-Fix

It seems that the changes that the Wiggle-Fix applies to the MBF code base are smaller compared to the Vanilla code base. Thus, it might be desirable to interate this fix into MBF. However, I remember that the initial implementation was not fail-safe and some variable types had to be changed again in order to prevent crashes. Still not sure if it's worth the effort and risk.

add a -statdump option

We need something like Choco's -statdump option to check that general demo compatibility is maintained after each commit.

hard dependency on SDL2_Image for PNG screenshots

I guess the dlopen() trick doesn't really meet its audience and people just don't want (or understand) to copy DLL files around. As both PCX and BMP formats are really archaic nowadays we need PNG screenshots unconditionally. Therefore I will change the code to make them the default.

@AlexMax I guess we need a new cmake/findSDL2_Image.cmake snippet for this. Would you take care of that?

Replace non-free embedded lumps

MBF included a bunch of embedded lumps which are definitely not free.

As a brief summary:

  • Lumps using the Doom font: M_AUTO, M_CHAT, M_COMPAT, M_ENEM, M_GENERL, M_HORSEN, M_KEYBND, M_MESS, M_NMARE, M_SETUP, M_STAT, M_VERSEN, M_WEAP. The Freedoom versions would probably work as reasonable stand-ins.
  • The dog sprites are from Wolfenstein 3D: DOGS*. ZDoom has a free dog sprite set now that is CC licensed.
  • Dog sound effects - unsure the provenance of these. Probably there are some public domain sounds out there that can be used.
  • DSGETPOW, STBAR, STCFN096, STTMINUS, WIMINUS. I think these were not present in the Doom 1.1 IWAD and MBF included them as a pedantic compatibility measure so that you could play with any IWAD. Maybe it's not worth bothering to keep that compatibility?
  • PLS1* and PLS2* - beta sprites. Move to betagrph.wad and embed some from Freedoom?

Problem with setting reset

There are two problems after setting reset in General section:

  • Aspect ratio resets to wider than 4:3
  • SFX are not playing.

(excuse me for being too short, I'll check it more deeper in the evening if necessary)

add support for loading FreeDoom IWADs?

FreeDoom's IWADs are called freedoom.wad, freedoom2.wad and freedm.wad. I would have to add these to the standard_iwads[] table in d_main.c and tweak the check for plutonia and tnt in CheckIWAD(), because freedoom2.wad contains characteristic lumps of both IWADs.

possibility to clear key bindings

Currently, it is impossible to clear key bindings in the corresponding menu. I have once provided a patch for PrBoom+ that could get ported over to MBF as well. Although this is strictly no faithful, it falls into the "quality of life" category.

improvements to the build system

@AlexMax Maybe you could have a look at this?

  • In the Woof-0.9.0-win32.zip file created by the make package rule there are some spurious libraries:

    CheckerDependencyHandlingAnalyzerPlugin.dll
    CheckerOptionHandlingAnalyzerPlugin.dll
    SampleAnalyzerPlugin.dll

    What are they, where are they from and why are they installed into the package?

  • The package is currently missing the three SDL2 libraries that the executable depends on. Is it somehow possible to add them (and their respective dependencies) to the package?

  • How do I create a source tarball? And how do I add source files (e.g. beta.c, dogs.c, icon.c) that are not listed among WOOF_SOURCES?

Missing strcasecmp in d_iwad.c

I get this message compiling with Visual C++

'strcasecmp' undefined; assuming extern returning int

The culprit is DirIsFile inside d_iwad.c. Looks like it's defined in d_io.h but apparently nothing in d_iwad.c currently includes it.

mingw-w64 compilation failing, rpl_malloc undefined

seems like some defines not expected in the Windows toolchain are being used

make[2]: Entering directory '/home/chungy/Games/doom/woof/Source'
i686-w64-mingw32-gcc -DHAVE_CONFIG_H -I. -I..    -I/usr/i686-w64-mingw32/include/SDL2 -Dmain=SDL_main  -I/usr/i686-w64-mingw32/include/SDL2 -Dmain=SDL_main  -I/usr/i686-w64-mingw32/include/SDL2 -Dmain=SDL_main  -g -O2 -g -O2 -Wall -Wdeclaration-after-statement -Wredundant-decls -MT woof-z_zone.o -MD -MP -MF .deps/woof-z_zone.Tpo -c -o woof-z_zone.o `test -f 'z_zone.c' || echo './'`z_zone.c
In file included from doomdef.h:34,
                 from d_items.h:32,
                 from d_player.h:36,
                 from d_net.h:32,
                 from doomstat.h:40,
                 from z_zone.c:38:
../config.h:178: warning: "malloc" redefined
  178 | #define malloc rpl_malloc
      | 
In file included from z_zone.c:37:
z_zone.h:91: note: this is the location of the previous definition
   91 | #define malloc(n)          Z_Malloc(n,PU_STATIC,0)
      | 
In file included from doomdef.h:34,
                 from d_items.h:32,
                 from d_player.h:36,
                 from d_net.h:32,
                 from doomstat.h:40,
                 from z_zone.c:38:
../config.h:181: warning: "realloc" redefined
  181 | #define realloc rpl_realloc
      | 
In file included from z_zone.c:37:
z_zone.h:93: note: this is the location of the previous definition
   93 | #define realloc(p,n)       Z_Realloc(p,n,PU_STATIC,0)
      | 
In file included from info.h:35,
                 from p_pspr.h:46,
                 from d_player.h:37,
                 from d_net.h:32,
                 from doomstat.h:40,
                 from z_zone.c:38:
z_zone.c: In function ‘Z_Init’:
../config.h:178:16: error: ‘rpl_malloc’ undeclared (first use in this function); did you mean ‘_mm_malloc’?
  178 | #define malloc rpl_malloc
      |                ^~~~~~~~~~
z_zone.c:236:22: note: in expansion of macro ‘malloc’
  236 |   while (!(zonebase=(malloc)(zonebase_size=size + HEADER_SIZE + CACHE_ALIGN)))
      |                      ^~~~~~
../config.h:178:16: note: each undeclared identifier is reported only once for each function it appears in
  178 | #define malloc rpl_malloc
      |                ^~~~~~~~~~
z_zone.c:236:22: note: in expansion of macro ‘malloc’
  236 |   while (!(zonebase=(malloc)(zonebase_size=size + HEADER_SIZE + CACHE_ALIGN)))
      |                      ^~~~~~
z_zone.c: In function ‘Z_Malloc’:
../config.h:178:16: error: ‘rpl_malloc’ undeclared (first use in this function); did you mean ‘_mm_malloc’?
  178 | #define malloc rpl_malloc
      |                ^~~~~~~~~~
z_zone.c:387:21: note: in expansion of macro ‘malloc’
  387 |    while(!(block = (malloc)(size + HEADER_SIZE)))
      |                     ^~~~~~
make[2]: *** [Makefile:1584: woof-z_zone.o] Error 1
make[2]: Leaving directory '/home/chungy/Games/doom/woof/Source'

Cyber110.wad with cy_itytd.lmp desyncs in MAP12

woof -file Cyber110.wad -deh Cyber110.deh -playdemo cy_itytd.lmp desyncs in MAP12 around gametic 16245.

Interestingly, I have come pretty far with regard to Boom 2.02 demo compatibility. You won't even get this demo past MAP01 with the original WinMBF. As a fun fact, the 30cyx1904.lmp Vanilla demo runs through with the same PWAD, so the issue must be somewhere in Boom 2.02 emulation.

add support for DeepBSP and ZDBSP nodes

The code is already there and could be taken from Crispy. This would make this port more "universal", because many huge maps are saved in these map formats nowadays. On the other hand, it will open a can of worms regarding rendering bugs that may occur in such large maps. anyway, I think the advantages may outweigh the risks in these cases.

fullscreen toggle from the menu

It should be possible to toggle windowed and fullscreen mode from the menu, altough there is the Alt+Enter key combination already. This is still a deviation from full fatihfullness to DOS MBF in the name of quality of life improvements.

code clean-up and comments

I have changed a lot more code than I initially assumed. Go through all these changes and add comments where appropriate.

make code -Wall clean

Currently this spits a gazillion of warnings when compiling with -Wall, mostly redundant declarations and cosmetic stiff like this.

Also, this is a major blocker on the way to CI.

I can't build it on Fedora | SDL2_MAIN_LIBRARY-NOTFOUND

Hello,

I've got every SDL2 package that I could find installed on my Fedora 31 but in the end of the make command it complains like this:

make[2]: *** No rule to make target 'SDL2_MAIN_LIBRARY-NOTFOUND', needed by 'Source/woof'.  Stop.
make[1]: *** [CMakeFiles/Makefile2:207: Source/CMakeFiles/woof.dir/all] Error 2
make: *** [Makefile:152: all] Error 2

Any idea what package I'm missing?

Thank you.

EDIT: this is the list of packages the I've got installed:

dnf list installed *sdl*
Installed Packages
SDL.x86_64                                                     1.2.15-42.fc31                                        @updates-testing
SDL-devel.x86_64                                               1.2.15-42.fc31                                        @fedora         
SDL2.i686                                                      2.0.12-1.fc31                                         @updates        
SDL2.x86_64                                                    2.0.12-1.fc31                                         @updates        
SDL2-devel.x86_64                                              2.0.12-1.fc31                                         @updates        
SDL2_image.x86_64                                              2.0.5-2.fc31                                          @fedora         
SDL2_image-devel.x86_64                                        2.0.5-2.fc31                                          @fedora         
SDL2_mixer.x86_64                                              2.0.4-4.fc31                                          @fedora         
SDL2_mixer-devel.x86_64                                        2.0.4-4.fc31                                          @fedora         
SDL2_net.x86_64                                                2.0.1-9.fc31                                          @fedora         
SDL2_net-devel.x86_64                                          2.0.1-9.fc31                                          @fedora         
SDL2_ttf.x86_64                                                2.0.15-2.fc30                                         @fedora         
SDL_image.x86_64                                               1.2.12-22.fc31                                        @fedora         
SDL_image-devel.x86_64                                         1.2.12-22.fc31                                        @fedora         
SDL_mixer.x86_64                                               1.2.12-18.fc31                                        @fedora         
SDL_mixer-devel.x86_64                                         1.2.12-18.fc31                                        @fedora         
mingw64-SDL2.noarch                                            2.0.12-1.fc31                                         @updates 

20ydoom demos desync

Reportedly, they play back in sync in PrBoom+.

Find out if they are PrBoom demos actually. Find out if they would play back with WinMBF.

add support for loading "Doom 3: BFG Edition" IWADs?

The Doom and Doom 2 IWAD distributed with the Doom 3: BFG Edition do contain PWAD headers instead of IWAD headers, and MBF is pretty strict about that and will refuse to load these IWADs.

However, what if these are your only available copies of the IWAD and you just want to try out? Should I sacrifice a part of historical faithfulness for the sake of maximum compatibility with all officially released doom IWADs?

fix visual glitches in planisf2.wad

As shown in the release thread, Woof! is able to load extremely huge maps such as planisf2, but there are a couple of rendering glitches. I guess I will merely have to port the fixes over from Crispy.

always pre-cache sounds

Converting sound samples to the target sample rate over and over again is expensive. Thus, sound samples should be cached in their target format. This should be optional but enabled by default. Not sure, though, if samples should be saved in system memory (i.e. malloc()) or zone memory (i.e. Z_Malloc()).

R_FlatNumForName: - not found When running DBP11.wad

When trying to run Lilywhite Lilith this error occurs. Has never happened before so I have no idea what changed.

Mouse issues are still present as well, there is what feels like mouse acceleration being applied.

The Chaingun has been a bit wonky as well, firing erratically and inconsistently.

Hopefully we can nail these down.

compat: Vanilla and Boom demo recording (and multiplayer) compatibility

While this is based off an MBF fork, it would be nice if you added a "-complevel 9" setting (or equivalent) so Boom compatible demos could be recorded (with all of the MBF features implemented into PrBoom-Plus's "-complevel 9" turned on).

A second feature request I have is working multiplayer support. Since PrBoom-Plus's netplay is busted, PrBoom 2.5 is slowly becoming even more obsolete, MBF 2.04 isn't supported in PrBoom-Plus, and Boom 2.02 and MBF 2.03 (with or without fixes) requires DOS for multiplayer, it would be nice to have a modern port of Boom/MBF which allows the recording of multiplayer demos for "-complevel 9" and "-complevel 11" (both with and without the 3 key bug fixed)

bring back the docs

With a 'c' this time. The WinMBF repository is missing all the documentation that was present in the binary and source releases.

support Hacx as a PWAD

There won't be support for Hacx as an IWAD, as this would mean too many quirks with the level progression. The same is true for Chex, btw.

But the port should work properly with Hacx if loaded as a pwad. I remember there were some mostly trivial fixes required for this.

improve mouse input

Most probably I will have to take the mouse handling code from Chocolate Doom once again.

Couple of launching errors.

Congrats on 1.0.0! Had a few snags. Had to download zlib1.dll file to get it to launch. and W_GetNumForName: STTMINUS not found!,

improve joystick code

Now that mouse and keyboard handling have been adapted, it's time to bring the joystick handling code on par with the implementation from Chocolate Doom 3.0.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.