Maya Python API 3.0

Overview

a.k.a. "Maya Python API 3.0"


An alternative set of bindings for the C++ API of Maya 2018-2022.

Why?

  • What if Maya's Python bindings were open source?
  • What if whenever Maya crashed, you'd get more than an opaque stack trace?
  • What if you were able to see why a crash occurred, and what line it occurred on?
  • What if you could address bugs in the bindings yourself?
  • What if you could add missing members yourself?
  • What if there were bindings for Maya that made it impossible to crash Maya from Python?

That's what this repository is for.


Example

The bindings should aim to match Maya Python API 2.0 as closely as possible, with the exception of being open source and to never allow Maya to crash as a result of calling any function or method.

import cmdc

typ = cmdc.TypeId(16)

mat4 = cmdc.Matrix()
mat4 *= cmdc.Matrix().inverse()

vec3 = cmdc.Vector()
vec3.x = 6

quat = cmdc.Quaternion(angle=0.5, axis=cmdc.Vector(1, 0, 0))
mat4 *= quat

# No need for MString
string = str()

# Modify the Maya scene graph
from maya import standalone
standalone.initialize()
fn = cmdc.FnDependencyNode()
r = fn.create("reverse", name="myReverse")
print(fn.name())

# This next line really shouldn't work, should require MFnDagNode
t = fn.create("transform", name="myTransform")
print(fn.name())

print("Success")

Goal

cmdc should have the same advantages over 1.0 as 2.0, and more.

  • Array types are full Python sequences, including slice support.
  • Methods which take Maya array parameters will always also take native Python sequences, such as arrays and tuples.
  • The outputs of methods are always returned in their return values, not through their parameter lists.
  • Methods which return multiple values (e.g. MFnFluid.getResolution) return them as a tuple or list, eliminating the need for MScriptUtil.
  • Object attributes are preferred over rather than set/get methods. For example you can now write array.sizeIncrement=64.
  • There are more types of exceptions used when methods fail. Not everything is a RuntimeError, as was the case in the old API.
  • cmdc should be faster or as fast as API 2.0

Reference


Status

It'll work, but won't have half the things you'll need to do anything of use in Maya. The current source is enough to illustrate (1) how to expose types, (2) how to expose function sets and (3) how to deal with passing MObject references around.

How can I help?

It's easy but tedious.

  • Add more members
  • Add more tests

Repository

File Description
src/ C++ source for the pybind11 bindings
install/ Destination of the compiled binding, e.g. cmdc.pyd
build.ps1 Example build script for Maya 2020 on Windows
pyproject.toml setup.py uses this ahead of building
setup.py Let pip handle actually compiling the extension
test.py Tests for bound methods and types

Build

This should build on any platform, for any Maya with Python available. Including 2022. Included is an example build script for Maya 2020 on Windows.

  • C++11 compatible compiler, e.g. Visual Studio 2015
  • Maya 2020
  • pip 19+
# Prerequisities the script cannot figure out on its own
$env:DEVKIT_LOCATION="C:\github\maya-devkit\2020.2\windows"
$env:MAYA_LOCATION="C:\Program Files\Autodesk\Maya2020"

# Go!
.\build.ps1

How can I help?

More easy but tedious things.

  • Add more Maya versions
  • Add more platforms
Comments
  • Automatically generate typing stubs

    Automatically generate typing stubs

    This PR enables generating typing stubs for cmdc automatically.

    This is still WIP and I'm not really happy with the organization of everything yet, I'm open to any ideas there.

    To generate the stubs:

    • run mayapy scripts/generate_typing_stubs.py
    • cmdc needs to be available in the PYTHONPATH
    • pybind11-stubgen needs to be installed in mayapy

    Some notes:

    • I've had to declare all the classes before they're used anywhere to Avoiding having C++ types in the docstrings, this caused syntax errors and messed up the stubs generations. I've put that the forward declarations in ForwardDeclarations.inl. I don't know if there's a better way to do that.
    • I haven't automated the generation when building yet because I only have a Windows machine and don't know PowerShell at all.
    • The stubs are saved in the build directory, not sure if that's where they should be saved.
    • Some of the docstrings have typing information, I'm not sure if they're still relevant but I've left them for now in case they were. pybind11-stubgen does take those into account and some weren't valid ((string, string, ...) instead of List[str] ) so I've updated those.
    opened by Muream 31
  • Implement DGModifier

    Implement DGModifier

    Added

    • Add MDGModifier bindings

    Changed

    • Add support for OPENMAYA_PRIVATE namespace in parse_headers.py
      • This always appears at the end of the header, so it stops the iterator early.

    Please squash the branch when it is merged.

    opened by yantor3d 25
  • Using cmake as build system for Windows, Mac, and Linux

    Using cmake as build system for Windows, Mac, and Linux

    I have added a cmake build system that will make setting up the dependencies and work across Windows, Mac, and Linux (untested). Mac was a difficult problem as Maya's devkit does not ship with the Python headers. So to not require the developer to have all the correct Python versions installed or have Maya installed, I copied the correct headers from the Maya installation including the shared libraries.

    I have also added Pybind11 as a submodule so it will be easier to manage it rather than just a copy in the repository. It has to be version 2.9.0 as that is the last version to support Python 2.

    I have successfully build Maya 2020 and 2022 on both Windows and Mac. I haven't tested it in linux yet. Some tweaks can still be made, but it works fine for now.

    opened by scottenglert 19
  • implement MDagPath

    implement MDagPath

    This is not ready to be merged yet. I'm making the PR for visibility, and because I had a few questions.

    My questions:

    1. Are we aiming to be more consistent with the C++ API or OpenMaya2? DagPath.extendToShape() returns a reference to self in OM2 but not in the C++ API. I feel like not returning anything would make more sense since self is already modified by the method
    2. Do we have a standardized format for the error messages? I've just copied OM2's messages so far.
    3. I was expecting exclusiveMatrix and exclusiveMatrixInverse to fail when called from an invalid DagPath but they return an identity matrix instead. This seems consistent with OM2 but I'm not sure why they're not raising a RuntimeError where something like childCount does with a similar implementation
    opened by Muream 19
  • Implement MSelectionList

    Implement MSelectionList

    Added

    • Add full stub for MSelectionList
      • Implement __len__, .isEmpty()
      • Implement .getDependNode
      • Implement .getDagPath
      • Implement .getPlug
      • Implement .getSelectionStrings
    • Add full stub for MPlug

    Fixed

    • Fix bugs in parse_header script
      • Support multi-line statements
      • Ignore trailing comments
      • Skip "No Script Support" blocks

    wat

    • MSelectionList::getPlug returns an OK status for a node. You have to check if the attribute is null.

    Notes

    • We should implement a C++ style guide.
    • We should implement MString <-> std::string helper functions
    • We should implement M[T]Array <-> std::vector helper functions
    opened by yantor3d 14
  • Improve stubs quality

    Improve stubs quality

    Follow up PR with #16 with the goal of improving the quality of the stubs

    This mainly focuses on ensuring all the arguments are named properly instead of simply being named arg0, arg1, etc.

    for that I'm simply using py::arg("arg_name") in order to let pybind know about the argument names

    I'm also extracting the docstrings out of the function definition like you've started doing @mottosso to try and have some consistency. I've noticed two mild issues with this so far

    1. On windows I get warnings like this cmdc\src\MFnDagNode.inl(21): warning C4005: '_doc_child': macro redefinition. I'm thinking of naming the variables like this instead to avoid redefinitions _doc_FnDagNode_child.
    2. On multiline docstrings, the stubs end up with the \ I haven't found a way in C++ to not use those characters. Worst case scenario I can scrape them from the generated stubs before writing the file An example of the stubs with the \ left in
    class DagPath():
        def extendToShapeDirectlyBelow(self, index: int) -> None: 
            """
            This method is used if the end of the path is a transform and there are shapes directly below the transform.\
            The shape to extend to is set by passing in an appropriate index parameter.\
            Use the `numberOfShapesDirectlyBelow()` method to determine how many shapes are below
            """
    

    Other than that, the stubs are looking pretty good, I just need to do that on the remaining files before merging

    opened by Muream 12
  • Improve stubs part two

    Improve stubs part two

    So, when trying to record the gif for the readme, I realized the completion wasn't working on some classes like SelectionList. Turns out pybind11-stubgen gets a bit confused when a class has an inner class defined and tries to import the parent class as a module. This is tracked by this issue: https://github.com/sizmailov/pybind11-stubgen/issues/36

    I've opted to just remove the unwanted imports once the stubs are generated, might be a bit brute force but that felt like the only option that didn't cause other issues somewhere else in the stubs.

    I'll also update the readme and contributing.md as part of this PR. @mottosso is there a good place where I can store the gif?

    opened by Muream 7
  • Better stubs generation errors and debugging

    Better stubs generation errors and debugging

    I slightly improved the logging of generate_stubs.py to include the line of the invalid signatures as well as added a --no-raise argument to write the stubs file even if there are invalid signatures.

    opened by Muream 6
  • Support for type annotations?

    Support for type annotations?

    I started using type annotations quite a lot these past months and I've grown to love them.

    Since none of the Maya APIs are type annotated, every function takes and returns Any. This is really frustrating to work with as you need to explicitly specify the type of a lot of variables when that should be inferred.

    I think it would be really nice if cmdc was fully type annotated and made that one of its primary goals. I haven't looked into how to set that up much so I'm not sure if pybind supports this or if we'd need to also write .pyi stubs for that.

    enhancement 
    opened by Muream 6
  • Implement MPlug getter/setter methods

    Implement MPlug getter/setter methods

    Added

    • Implement MPlug::as* methods that take POD or MObject
    • Implement MPlug::set* methods that take POD or MObject

    wat

    • MPlug::asChar and MPlug::setChar are picky when used via Python - you must set using an integer, but get back a string.

    Thank gods for parametrized tests :|

    opened by yantor3d 4
  • MObject: implement missing functions and add tests

    MObject: implement missing functions and add tests

    I have very little experience with C++ or writing bindings so I figured I would start small. If the PR suits you, I'll start working on other classes.

    I did the following:

    • Implemented MObject.__eq__.
    • Changed MObject.__repr__ to include the apiTypeStr (wasn't 100% sure about the best way to format the string there).
    • Added tests for all the MObject methods.
    opened by Muream 4
  • Restructuring for faster build times

    Restructuring for faster build times

    I was getting increasing build times as I was adding more classes. I read the pybind11 faq about breaking up the bindings into multiple translation units. So we now still get the same result but now we can use more processors to compile and speeds up rebuilding while developing. Also we can make slightly more organized folders as the number of classes increases.

    Welcome to other ideas, but I get the same results as before but build times are much faster.

    opened by scottenglert 2
  • Add MFnBase

    Add MFnBase

    This PR implements the Bindings for MFnBase and makes MFnDependencyNode a subclass of it, as well as MFnDagNode a subclass of MFnDependencyNode

    I also noticed that the MDGModifier and MDagModifier classes were defined exactly like the other classes in ForwardDeclarations.inl so I've updated that.

    MFnBase has two methods that have been added in Maya 2020, I think I managed to get them to compile only for the right releases of cmdc but we'll see. I do feel like this means we should release a version of the stubs per maya version though? Otherwise when working with 2019 we'll get completion on methods that don't exist.

    I'm expecting this to fail at the moment because MFnBase::className() returns MFnBase and not FnBase like I think we would expect. I'm not actually sure how to dynamically get the name of the class in C++? I'm also not really sure that this even matters as we can just call MFnBase.__name__ in python.

    opened by Muream 5
  • Ctags parse header

    Ctags parse header

    So, I went down a rabbit hole...

    parse_header.py was failing on some header files required for #25. I tried upgrading it but didn't feel like handling a billion edge cases like manually parsing C++ seems to be like

    I ended up relying on Universal Ctags which outputs a list of all the classes, methods, etc. that are in a given file.

    It's not perfect but it works on all the files I've tested so far

    Some things that are not supported yet:

    1. Functions declared out of the scope of a class
    2. Properties
    3. Nested classes
    4. Enums

    I'll probably leave it at that for this PR though and we can improve on that as we need.

    I've made a separate parse_header_ctags.py script in case parse_header.py still produces better results on some files

    And of course, ctags needs to be installed and available in your path

    opened by Muream 4
  • Implement animCubeNode.py

    Implement animCubeNode.py

    Time to get real. This is one of the examples out of the Maya devkit, from API 1.0.

    There are quite a few things missing for this to work.

    • MFnPlugin
    • MPxNode
    • MDataBlock
    • MDataHandle
    • MFnAttribute (including Unit and Typed)
    • MFnMesh
    • MFnMeshData
    • MTime
    • MFloatPoint
    • Int and float arrays

    So it's gonna be a big one. xD

    opened by mottosso 2
  • Help!

    Help!

    Hello, welcome to cmdc where we attempt to reproduce Maya Python API 2.0 (i.e. maya.api.OpenMaya) in open source form, fix all bugs and add all of the things missing from it. Autodesk has shown little to no interest in continuing with API 2.0, and I was surprised to find nobody had yet taken matters into their own hands.

    So let's do that!

    I've put together a few source files demonstrating the fundamentals of how to bind the API, along with commonly used types like MVector and MMatrix and a function set, MFnDependencyNode for manipulating the scene graph.

    Here's the simplest example.

    • https://github.com/mottosso/cmdc/blob/master/src/Types.inl

    The syntax is a little cryptic, because it's doing a lot of automatic detection of argument types and return values. Things we'd otherwise have to do ourselves if manually binding via e.g. Python.h. But it's fairly consistent and only consists of a few key functions, most if not all of them are already present in this repository.


    Help Wanted

    But I need help. There is too much of an API to wrap for one person, and the task of actually binding a new C++ member is of intern-level complexity. That is, anyone can do it. The hard part is patience and diligence. We need to match function signatures, convert all MStatuses to exceptions and write tests for each newly added member.

    As soon as I spot some interest in the project, and interest in helping out, I'll expand upon the test suite and CI mechanism to automatically produce compiled versions for all platforms and versions of Maya, along with automatic upload to PyPI. From there, anyone can add or improve upon any member and we'll never have to struggle with maya.api.OpenMaya again.


    How can I help?

    Glad you asked!

    1. Get the project built on your machine
    2. Pick your favourite member from the C++ documentation
    3. Make a new MYourMember.inl file
    4. Add it to main.cpp

    Remember to keep the name of arguments as documented, so users of cmdc can refer to this documentation for help on how to use cmdc. And ditch the M prefix that all classes have, Python don't need that.

    MVector -> Vector
    

    Any questions or concerns, post here or in a new issue and let's fix this thing once and for all!

    help wanted 
    opened by mottosso 2
Releases(v0.1.8)
  • v0.1.8(Apr 16, 2022)

    Commits

    • 7147106: define docstrings at the top of the generated files (Loïc Pinsard) #26
    • b8c52b0: add py::args to relevant methods (Loïc Pinsard) #26
    • ed93cbe: adding cmake as builder, works on mac and windows, need to test linux (Scott Englert) #28
    • cfe5616: adding pre and post build script execution (Scott Englert) #28
    • 5851938: updating mac python libs (Scott Englert) #28
    • 896682b: Create cmake.yml (Scott Englert) #28
    • a758eaf: Update cmake.yml (Scott Englert) #28
    • a2809a1: Update cmake.yml (Scott Englert) #28
    • 875ffc2: Update cmake.yml (Scott Englert) #28
    • bf15822: setting pybind to 2.9.0 (Scott Englert) #28
    • 278ce5f: removing the search for python exe (Scott Englert) #28
    • d67225c: Update cmake.yml (Scott Englert) #28
    • 255a6dc: Update cmake.yml (Scott Englert) #28
    • 94e43bd: updating to use matrix builds (Scott Englert) #28
    • ae0f5dc: trying docker for linux build 2020 (Scott Englert) #28
    • fa1be6c: Update cmake.yml (Scott Englert) #28
    • f83bdf9: adding linux matrix using new docker containers (Scott Englert) #28
    • e886e1e: adding Python 3.9 for 2022 support (Scott Englert) #28
    • ac25227: fixing typo in maya config (Scott Englert) #28
    • 0498e47: printing all the build files as its not outputting where it should be (Scott Englert) #28
    • e50339d: trying the find again (Scott Englert) #28
    • 84c21a5: updating to use latest devkit versions (Scott Englert) #28
    • c019988: fixing windows build, still can't find linux lib (Scott Englert) #28
    • 2ba1632: can linux find the artifact now? (Scott Englert) #28
    • ffe369a: cant get the artifact to work (Scott Englert) #28
    • a05a05d: trying the older version of upload artifact if it works in containers (Scott Englert) #28
    • a382492: changing to build in local container (Scott Englert) #28
    • 24d67c3: adding stubs generation to build (Scott Englert) #28
    • 811a259: debugging stubs build (Scott Englert) #28
    • 37250f3: continued stub building (Scott Englert) #28
    • 7dd6f99: trying stubs again (Scott Englert) #28
    • 35ad734: got the stubs building (Scott Englert) #28
    • 8c55dd5: adding maya 2018 and 2019 builds (Scott Englert) #28
    • 5e32ebe: Adding specific support for 2018 and 2019 windows (Scott Englert) #28
    • 0b4ac31: Another devkit path update (Scott Englert) #28
    • a80f87d: Update cmake.yml (Scott Englert) #28
    • 5b240ea: updating cmake linux build for older cmake versions (Scott Englert) #28
    • 6b33a6b: Updating 2018 and 2019 devkit for linux (Scott Englert) #28
    • 20194a6: fixing directory typo in name (Scott Englert) #28
    • eed6335: adding tests (Scott Englert) #28
    • 69284d5: cleaning up and adding 2023 test to actions (Scott Englert) #28
    • 1981a9c: updating readme (Scott Englert) #28
    • a3d850c: Delete test_win32.ps1 (Scott Englert) #28
    • 1fb7ab1: updating python path for tests (Scott Englert) #28
    • 1ebf3b7: initializing standalone before import cmdc (Scott Englert) #28
    • b5e39a2: Excluding tests or legacy MFn Types (Scott Englert) #28
    • a89a847: Update main.yml (Marcus Ottosson)
    Source code(tar.gz)
    Source code(zip)
    cmdc-0.1.0.zip(4.55 MB)
  • v0.1.7(Jun 15, 2021)

    Commits

    • 95d8f76: remove unwanted imports from stubs (Loïc Pinsard) #24
    • 744a4e2: fail stubs generation in case of degraded signatures. (Loïc Pinsard) #24
    • 89b4289: fail stubs generation in case of unnamed arguments (Loïc Pinsard) #24
    • 669fc7f: update contributing.md (Loïc Pinsard) #24
    • 3b4ccd4: fix stubs for DagModifier and reformat docstings. (Loïc Pinsard) #24
    • add completion and type checking examples #24 (Loïc Pinsard)
    • display video like gifs #24 (Loïc Pinsard)
    • use gifs instead of mp4s #24 (Loïc Pinsard)
    • df87c0a: Update README.md (Marcus Ottosson) #24
    Source code(tar.gz)
    Source code(zip)
    cmdc-0.1.0.zip(4.36 MB)
  • v0.1.6(Jun 13, 2021)

    Commits

    • 782b3ef: Add gitignore section for IDE folders (Ryan Porter) #22
    • 0390753: Fix typo in Windows build script (Ryan Porter) #22
    • 504c432: Add MDagModifier binding stub (Ryan Porter) #22
    • 64f18b0: Implement MDagModifier::createNode bindings (Ryan Porter) #22
    • 90d1aac: Make DagModifier a subclass of DGModifier (Ryan Porter) #22
    • 4bf96b0: Add missing cases to MDagModifier test coverage (Ryan Porter) #22
    • 0604e77: Implement MDagModifier::reparentNode binding (Ryan Porter) #22
    • 085c79a: Include node names in MDagModifier::reparentNode binding error messages (Ryan Porter) #22
    • c1b8778: Fix typo in build_linux.sh (Ryan Porter) #22
    • 491a2fd: Merge branch 'master' into rporter/MDAGModifier (Ryan Porter) #22
    • 41d91d7: Fix missing endif (Ryan Porter) #22
    • ceb5bf6: Fix duplication declaration of DGModifier binding (Ryan Porter) #22
    • 80ee3d0: Update docker build linux script to use maya{version} environment (Ryan Porter) #22
    • 255cc01: Add docker test linux script (Ryan Porter) #22
    • d37b487: Rename test script for windows to match build script (Ryan Porter) #22
    Source code(tar.gz)
    Source code(zip)
    cmdc-0.1.0.zip(4.36 MB)
  • v0.1.5(Jun 10, 2021)

    Commits

    • 25f6412: add logging to generate_stubs.py and remove leftover comments (Loïc Pinsard) #23
    • beb3eec: improve stubs for BoundingBox (Loïc Pinsard) #23
    • 97b76d6: improve stubs for DagPath (Loïc Pinsard) #23
    • a3bfdf3: improve stubs for DGModifier (Loïc Pinsard) #23
    • 931f8c6: improve stubs for Math classes (Loïc Pinsard) #23
    • 3a3ea23: improve stubs for FnDagNode (Loïc Pinsard) #23
    • 7283103: improve stubs for FnDependencyNode (Loïc Pinsard) #23
    • 9629913: improve stubs for Object and ObjectHandle (Loïc Pinsard) #23
    • 406455c: rename #define macros to avoid redefinitions (Loïc Pinsard) #23
    • b4e271f: make docstrings string literals instead of raw strings. (Loïc Pinsard) #23
    • 3cf5258: improve stubs for Plug (Loïc Pinsard) #23
    • 688eb7c: improve stubs for Selection list (Loïc Pinsard) #23
    • 31771e4: improve stubs for Status, TypeId and String (Loïc Pinsard) #23
    • 230147b: indent all docstrings and respect line lengths (Loïc Pinsard) #23
    • b32a546: move stubs to dedicated folder for release (Loïc Pinsard) #23
    • 94b0014: Update contribution steps (Marcus Ottosson)
    • 7bc662b: Fix typo (Marcus Ottosson)
    • b2c3024: CI garbage (Marcus Ottosson)
    • 37aa771: CI garbage (Marcus Ottosson)
    • b97a148: CI nonsense (Marcus Ottosson)
    Source code(tar.gz)
    Source code(zip)
    cmdc-0.1.0.zip(4.27 MB)
  • v0.1.4(Jun 9, 2021)

    Commits

    • d57e221: first pass at generating pyi stubs. (Loïc Pinsard) #16
    • b7ee077: remove old comment. (Loïc Pinsard) #16
    • 0a60603: generate the stubs automatically when building (Loïc Pinsard) #16
    • 08bcdfb: remove function signatures from the generated docstrings (Loïc Pinsard) #16
    • aa969ff: add pybind11-stubgen as a depency (Loïc Pinsard) #16
    • 5613695: Don't generate stubs during the build script. (Loïc Pinsard) #16
    • 19c5a1f: Merge branch 'master' into generate_type_stubs (Loïc Pinsard) #16
    • b0507f1: updated forward declaration and docstrings (Loïc Pinsard) #16
    • dbdc67f: added generate_stubs script (Loïc Pinsard) #16
    • 04e561d: generate stubs during CI (Loïc Pinsard) #16
    • 6457fc4: fix default arguments causing degraded signatures (Loïc Pinsard) #16
    • 297d548: fix typo in main.yml (Loïc Pinsard) #16
    • a87f91d: chain commands properly during stubs generation (Loïc Pinsard) #16
    • 7dcc4ca: Add build folder to PYTHONPATH before generating stubs (Loïc Pinsard) #16
    • 1d2f123: upload stubs artifact for release (Loïc Pinsard) #16
    Source code(tar.gz)
    Source code(zip)
    cmdc-0.1.0.zip(4.18 MB)
  • v0.1.3(Jun 6, 2021)

    Commits

    • 59ecc1e: Cosmetics (Marcus Ottosson) #18
    • 40c1965: Add mayapy and run tests on CI (Marcus Ottosson) #18
    • 07e882e: Typo (Marcus Ottosson) #18
    • ef5af91: Use 2018.7 instead (Marcus Ottosson) #18
    • remove irrelevant isinstance check in tests. #19 (Loïc Pinsard)
    • 5b9c56a: Update main.yml (Marcus Ottosson)
    • 2ef5b00: Touchup parse_header.py (Marcus Ottosson) #20
    • 5e1cf1d: PEP8-ify (Marcus Ottosson) #20
    • 9cc4d8d: Initial work on MFnDagNode (Marcus Ottosson) #20
    • c55cea9: Handle OPENMAYA_PRIVATE namespace in headers (Ryan Porter) #21
    • 047977b: Add MDGModifier stub (Ryan Porter) #21
    • aac0ade: Cleanup docstrings (Ryan Porter) #21
    • 716e8ad: Include MDgModifier.inl in main (Ryan Porter) #21
    • 52b53f3: Implement DGModifier.createNode methods (Ryan Porter) #21
    • 67fce72: Fix Linux build error (Ryan Porter) #21
    • d13fac8: Implement MDGModifier::addAttribute binding (Ryan Porter) #21
    • eb79c64: Implement DGModifier.connect (Ryan Porter) #21
    • 2f70015: Implement MDGModifier::disconnect binding (Ryan Porter) #21
    • e99916a: Implement MDGModifier::deleteNode binding (Ryan Porter) #21
    • 986dd6c: Implement MDGModifier::removeAttribute binding (Ryan Porter) #21
    • 15915fa: Implement DGModifier::newPlugValue* bindings (Ryan Porter) #21
    • d11c9c6: Implement extension attribute method bindings (Ryan Porter) #21
    • 7da6f80: Implement MDGModifier::setNodeLockState binding (Ryan Porter) #21
    • c5c2f4f: Implement MDGModifier::addExtensionAttribute binding (Ryan Porter) #21
    • 18dca1a: Implement MDGModifier::renameNode binding (Ryan Porter) #21
    • 79f223a: Implement MDGModifier::renameAttribute binding (Ryan Porter) #21
    • fca84a0: Implement MDGModfifier::removeMultiInstance binding (Ryan Porter) #21
    • c840da7: Implement MDGModifier::commandToExecute bindings (Ryan Porter) #21
    • 3079817: Refactor repeated validations as inline functions (Ryan Porter) #21
    • 6aac9c5: Merge branch 'master' into rporter/MDGModifier (Ryan Porter) #21
    • 7cc464b: Add contributing.md (Marcus Ottosson) #20
    • 69455e0: More MFnDagNode (Marcus Ottosson) #20
    • 9e1af41: Update contributing (Marcus Ottosson) #20
    • 928ecb7: Update README (Marcus Ottosson) #20
    • 6ad56cd: Update contributing (Marcus Ottosson)
    • b2bdf3f: Update README (Marcus Ottosson)
    • 18ed4c9: Terminate those raw strings for poor GCC (Marcus Ottosson) #20
    • a5b2d45: Merge branch 'master' into rporter/MDGModifier (Ryan Porter) #21
    • 51726a1: Flatten validate functions namespace (Ryan Porter) #21
    • b4ded3e: Make validate function calls multi-line to keep line lengths short (Ryan Porter) #21
    • c4c58bd: Fix test failure on Linux (Ryan Porter) #21
    Source code(tar.gz)
    Source code(zip)
    cmdc-0.1.0.zip(3.89 MB)
  • v0.1.2(May 10, 2021)

  • v0.1.1(May 9, 2021)

Owner
Marcus Ottosson
Computer Artist
Marcus Ottosson
Powerful, mature open-source cross-platform game engine for Python and C++, developed by Disney and CMU

Panda3D Panda3D is a game engine, a framework for 3D rendering and game development for Python and C++ programs. Panda3D is open-source and free for a

Panda3D 3.6k Dec 31, 2022
an AI and gameplay editor for game development, written by c++ , suppport lua and python

an AI and gameplay editor for game development, written by c++ , suppport lua and python

null 26 Dec 14, 2022
SampPy is a plugin for SA:MP that allows you to create gamemodes from Python

SampPy is a plugin for SA:MP that allows you to create gamemodes from Python. A fork of PySAMP, which has been abandoned for quite some time.

Yahir Vlatko Kozel 16 Jul 31, 2021
python scripting engine for the gd editor

Python interpreter embedded into the game Geometry Dash, designed for helping people automate tasks for creating

camila 8 Feb 24, 2022
Cross-platform, sophisticated frontend for the libretro API. Licensed GPLv3.

RetroArch RetroArch is the reference frontend for the libretro API. Popular examples of implementations for this API includes video game system emulat

null 7.4k Dec 31, 2022
Own mod. Should be usable with VS v4 API (built with v3).

Own mod. Should be usable with VS v4 API (built with v3).

null 85 Nov 26, 2022
Steam API for the Godot game engine

Steam API for the Godot game engine

GP Garcia 1.4k Jan 8, 2023
The Atomic Game Engine is a multi-platform 2D and 3D engine with a consistent API in C++, C#, JavaScript, and TypeScript

The Atomic Game Engine is a multi-platform 2D and 3D engine with a consistent API in C++, C#, JavaScript, and TypeScript

null 2.8k Dec 29, 2022
Maya Soft IK Solver

Maya Soft IK Solver Our maya IK solver is an advanced solution for 2 bones setup. It fixes the annoying “pop” problem at full extension in the normal

Toolchefs 75 Oct 11, 2022
Python Inference Script is a Python package that enables developers to author machine learning workflows in Python and deploy without Python.

Python Inference Script(PyIS) Python Inference Script is a Python package that enables developers to author machine learning workflows in Python and d

Microsoft 13 Nov 4, 2022
BLLIP reranking parser (also known as Charniak-Johnson parser, Charniak parser, Brown reranking parser) See http://pypi.python.org/pypi/bllipparser/ for Python module.

BLLIP Reranking Parser Copyright Mark Johnson, Eugene Charniak, 24th November 2005 --- August 2006 We request acknowledgement in any publications that

Brown Laboratory for Linguistic Information Processing 218 Dec 17, 2022
A Binary Clock. Written 3 different ways. C and SDL, Python and PyGame, Python and PyGame Zero.

Super Clock A Binary Clock. Written 3 different ways. Python with PyGame Zero, Python with PyGame and C with SDL2. Time is displayed in 3 groups of 8

null 3 Dec 8, 2021
A simple header-only C++ argument parser library. Supposed to be flexible and powerful, and attempts to be compatible with the functionality of the Python standard argparse library (though not necessarily the API).

args Note that this library is essentially in maintenance mode. I haven't had the time to work on it or give it the love that it deserves. I'm not add

Taylor C. Richberger 1.1k Jan 4, 2023
Implement yolov5 with Tensorrt C++ api, and integrate batchedNMSPlugin. A Python wrapper is also provided.

yolov5 Original codes from tensorrtx. I modified the yololayer and integrated batchedNMSPlugin. A yolov5s.wts is provided for fast demo. How to genera

weiwei zhou 46 Dec 6, 2022
Online chess platform (client-server) in Python with StockFish API

PyChess Gra w szachy tylko w Pythonie :) Wymagania Python 3.8 Instalacja Wchodzimy i pobieramy najnowsze wydanie aplikacji. https://github.com/Rafixe

Rafał Hrabia 6 Oct 7, 2021
A simple header-only C++ argument parser library. Supposed to be flexible and powerful, and attempts to be compatible with the functionality of the Python standard argparse library (though not necessarily the API).

args Note that this library is essentially in maintenance mode. I haven't had the time to work on it or give it the love that it deserves. I'm not add

Taylor C. Richberger 896 Aug 31, 2021
An unified library for fitting primitives from 3D point cloud data with both C++&Python API.

PrimitivesFittingLib An unified library for fitting multiple primitives from 3D point cloud data with both C++&Python API. The supported primitives ty

Yueci Deng 10 Jun 30, 2022
Fastest-lap is an optimal laptime simulator, written in C++, and with a python API.

Fastest-lap ?? ?? Fastest-lap is an optimal laptime simulator, written in C++, and with a python API. What can be done Numerical G-G diagram: given a

Juan Manzanero 390 Jan 2, 2023
log4cplus is a simple to use C++ logging API providing thread-safe, flexible, and arbitrarily granular control over log management and configuration. It is modelled after the Java log4j API.

% log4cplus README Short Description log4cplus is a simple to use C++17 logging API providing thread--safe, flexible, and arbitrarily granular control

null 1.4k Jan 4, 2023
The Telegram Bot API provides an HTTP API for creating Telegram Bots.

The Telegram Bot API provides an HTTP API for creating Telegram Bots.

Telegram Library 1.9k Jan 1, 2023