Formation au SDK de 3D Studio Max
Un article de Games Creators Network.
ATTENTION: L'AUTEUR David Lanier EST LE PROPRIETAIRE EXCLUSIF DE CE DOCUMENT. LE G.C.N. A OBTENU L'ACCORD DE L'AUTEUR POUR METTRE CET ARTICLE EN LIGNE.
IL EST FORMELLEMENT INTERDIT DE DISTRIBUER OU MODIFIER CE DOCUMENT.
© Copyright 2002 par (http://dl3d.com) Toute reproduction même partielle de ce document est formellement interdite sans l'autorisation de son auteur.
[modifier] 1. Introduction
3DSMax est un logiciel créé à base de plugins, et extensible par des plugins. Son SDK se trouve dans le sous répertoire MaxSDK du répertoire d'installation de Max. Ce répertoire contient les libraires (dans le sous-répertoire lib) et les headers (dans le sous-répertoire include) pour les dévelopeurs. Dans le sous répertoire Help de Maxsdk se trouve des fichiers très importants :
- GenCID.exe sert à générer les classID des différents plugins.
- Le wizard pour visual C++ 6 (sdkapwz.awx) pour créer les squelettes des différents plugins pour Max à mettre dans le répertoire de Visual où se trouvent les autres fichiers awx.
- le fichier usertype.dat utilisable dans visual pour souligner les mots clés de Max doit se concaténer à la fin de votre usertype.dat.
- L'aide pour le SDK de Max qui est installable dans visual C++ en suivant les instructions dans le document readme.doc. Cela permet en se plaçant sur un mot clé de Max (classe ou fonction) d'accéder directement à sa documentation en cliquant sur une touche.
- Le ficher archive des questions posées sur le site web des développeurs sous Max.
Il existe un site web dédié aux développeurs Max où l'on peut s'inscrire gatuitement pour lire et poser des questions. Seuls les développeurs enregistrés sont pratiquement assurés d'avoir une réponse et ont accès à des forums privés. Ce site est http://sparks.discreet.com. Le forum des développeurs se trouve sur : http://sparks.discreet.com/webboard/wbpx.dll/~maxsdkil y a possibilité de s'inscrire à une mailing liste qui permet de recevoir les messages postés sur ces forums suivant les sujets qui nous intéressent. Enormément de projets samples sont fournis avec Max et je vous invite à les regarder, ils couvrent l'essentiel de ce que l'on peut faire avec Max.
[modifier] 2. Mécanismes des Dlls sous Max
Sont utilisées des fonctions de description de la DLL :
- BOOL WINAPI DllMain(HINSTANCE hinstDLL,ULONG fdwReason,LPVOID lpvReserved). Elle permet à Max de charger et décharger cette DLL ou de l'attacher à un thread particulier, on récupère le handle d'instance de Max (HINSTANCE) sous Windows dont on se sert dans un variable globale.
- const TCHAR* LibDescription() : une chaîne de caractères contenant la description du plugin.
- int LibNumberClasses() : Le nombre de classes déclarées dans le plugin.
- ClassDesc* LibClassDesc(int i) : La description des classes déclarées par le plugin.
- ULONG LibVersion() le numéro de version de la lib pour détecter les versions obsolètes dans plugins (obsolète = compilés avec une version antérieure de Max)
[modifier] 3. Debuger sous Max
Max se sert de class ID qui sont des longs qui forment un couple unique et qui sont utilisés pour instancier les plugins en temps utile. Ils servent aussi à savoir de quel type est un objet : Exemple de ClassIDs :Class_ID (TRIOBJ_CLASS_ID, 0) ; // Pour les meshes (triangles) Class_ID (SIMPLE_CAM_CLASS_ID,0) // Free cameras.
Les ClassIDs sont formés d'une paire de 2 entiers 32 bits qui servent à construire l'objet classID. La plupart du temps le 2e entier n'est pas utilisé.
[modifier] 3.1. Configuration Hybrid
Comme les utilisateurs ont une version release de Max, nous utilisons 2 build configurations pour compiler les plugins : release et hybrid. Release est la configuration release classique. Hybrid est un mélange entre debug et release pour éviter que de la mémoire soit alloué par le plugin en debug et désallouée par Max en release. Ce la pourrait provoquer des crashs. Il existe une version debug de Max dont certaines DLLs sont compilées en debug et nous pouvons tracer dans une partie des sources.
[modifier] 3.2. CallStack
Dans la version standard de Max (compilée en release) il ne sera pas possible d'avoir la callstack en cas de crash y compris quand vous compilez en hybrid. Il faut utiliser la version debug de Max. Sinon, il vous faudra tracer suivant les actions que vous avez faites. Mais des fois, souvent dans les modifiers, cela crash lors du redraw de la scène et il vous est impossible de savoir qu'est-ce qui provoque ce crash, c'est souvent une opération passée qui n'a pas été correcte : exemple recopier un mesh sans les vertex color alors que Max en a besoin ailleurs... Bonne chance ! :)
[modifier] 4. Les différents types de plugins
Max est customisable par des plugins, les différents types sont (en Anglais) :
[modifier] Procedural Objects
Procedural Objects are the general class of developer-defined objects that can be used in 3ds max.
[modifier] Geometric Objects
These are the only procedural objects that actually get rendered.
[modifier] Primitives
Primitive objects such as boxes, spheres, cones, cylinders, and tubes are implemented as procedural geometric objects. These are derived from class GeomObject or SimpleObject. Example code may be found in \MAXSDK\SAMPLES\OBJECTS\BOX.CPP, SPHERE.CPP, CONE.CPP, etc.
[modifier] Particles
Developers may create procedural object particle system plug-ins. Some examples are particles that depend upon procedural motion like fireworks, explosions, and water, or particles that track the surface of objects like electrical fields or flame. Applications can be derived from ParticleObject or SimpleParticle. Example code is available in \MAXSDK\SAMPLES\OBJECTS\RAIN.CPP and \MAXSDK\SAMPLES\MODIFIERS\GRAVITY.CPP.
[modifier] Loft Objects
The 3ds max Lofter is implemented as a procedural object plug-in. Developers may define other modeling modules that fit this form.
[modifier] Compound Objects
Compound objects take several objects and combine them together to produce a new object. Examples are Booleans (which produce a new object using operations Union, Intersection and Difference) and Morph objects. Sample code for the boolean object can be found in \MAXSDK\SAMPLES\OBJECTS\BOOLOBJ.CPP.
[modifier] Patches
Developers can create patch modeling systems that work inside MAX. The TriPatch and Patch Grid are examples of patch objects. These plug-ins are derived from PatchObject. See \MAXSDK\SAMPLES\OBJECTS\PATCHGRD.CPP, and TRIPATCH.CPP for sample code.
[modifier] NURBS
The NURBS API provides an interface into the NURBS objects used by MAX. Using the API developer can create new NURBS objects or modify existing ones. See the Advanced Topics section Working with NURBS for more information.
[modifier] Helper Objects
Helper objects are items such as dummy objects, grids, tape measurers and point objects. These objects may be derived from classes HelperObject or ConstObject. Sample code may be found in \MAXSDK\SAMPLES\OBJECTS\HELPERS\GRIDHELP.CPP, and PTHELP.CPP. See Class HelperObject and Class ConstObject.
[modifier] Shape Objects
These are shapes such as Circles, Arcs, Rectangles, Donuts, etc. New splines may be subclassed off SimpleSpline. Sample code may be found in \MAXSDK\SAMPLES\OBJECTS\CIRCLE.CPP, ELLIPSE.CPP, ARC.CPP, etc.
[modifier] Procedural Shapes
These are shapes that are defined procedurally. An example procedural shape, Helix, may be found in \MAXSDK\SAMPLES\OBJECTS\HELIX.CPP. When an edit spline modifier is applied to a procedural shape it is converted to splines with segments that provide vertices in a linear approximation of the shape. This allows the procedural shape to be edited. Procedural shapes may be derived from class SimpleShape. Other examples include Procedural lines, and Text.
Any of these objects can be edited with an edit spline modifier or extruded or surfrev'd.
[modifier] Lights
Developers may create custom plug-in lights. There are several classes from which light plug-ins may be derived. These are LightObject, and GenLight. Example code may be found in \MAXSDK\SAMPLES\OBJECTS\LIGHT.CPP.
[modifier] Cameras
Developers may create custom cameras. The two classes from which cameras may be derived are CameraObject and GenCamera. An example of a plug-in camera may be found in \MAXSDK\SAMPLES\OBJECTS\CAMERA.CPP.
[modifier] Object Modifiers
Object modifiers are applied to objects in their own local transform space to modify them in some way. Deformations like Bend, Taper, and Twist are examples of Object Modifier plug-ins. Example code may be found in \MAXSDK\SAMPLES\MODIFIERS\BEND.CPP, TAPER.CPP, etc. Extrude and Surfrev are also object modifier plug-ins. Sample code for Extrude can be found in \MAXSDK\SAMPLES\MODIFIERS\EXTRUDE.CPP. Developers may also create surface modifier plug-ins to alter smoothing groups, texture coordinates, and material assignments. See Class Modifier or Class SimpleMod.
[modifier] Edit Modifiers
These plug-ins allow specific object types to be edited. For example, an Edit Mesh modifier allows objects that can convert themselves into triangle meshes to be edited, while an Edit Patch modifier allows objects that can convert themselves into patches to be edited. Edit modifiers typically allow the user to select sub-object elements of the object (vertices faces and edges in the case of the Edit Mesh modifier) and perform at least the standard move/rotate/scale transformations to them. They may also support additional operations (such as the extrude option of the Edit Mesh modifier). Example code may be found in \MAXSDK\SAMPLES\MODIFIERS\EDITMESH.CPP.
[modifier] Space Warps
Space Warps are basically object modifiers that affect objects in world space instead of in the object's local space (they were originally called 'world space modifiers'). Space Warps are non-rendering objects that affect other objects in the scene based on the position and orientation of the other objects that are bound to the Space Warp object. For example, the Ripple Space Warp applies a sine wave deformation to objects bound to it. Other examples of Space Warps include things like explosions, wind fields, and gravity. Sample code may be found in \MAXSDK\SAMPLES\MODIFIERS\SINWAVE.CPP.
Space warps are created in the Creation branch of the command panel, which makes them slightly different from regular modifiers (because they are combinations of space warp objects and space warp modifiers). Space warps may also affect particle systems. For example, a force field can be applied to a particle system by a space warp. The force field provides a function of position in space, velocity and time that gives a force. The force is then used to compute an acceleration on a particle which modifies its velocity. For details see \MAXSDK\INCLUDE\OBJECT.H, \MAXSDK\SAMPLES\MODIFIERS\GRAVITY.CPP, and \MAXSDK\SAMPLES\OBJECTS\RAIN.CPP.
A collision object can also be applied to a particle system by a space warp. The collision object checks a particle's position and velocity and determines if the particle will collide with it in the next period of time. If so, it modifies the position and velocity.
[modifier] Controllers
Controller plug-ins are the objects in 3ds max that control animation. Controllers come in different types based on the data they control. The most common controllers are interpolating or keyframe controllers. Other controller types are position/rotate/scale, mathematical expressions and fractal noise. Example controller code may be found in \MAXSDK\SAMPLES\HOWTO\PCONTROL\PCONTROL.CPP, and NOIZCTRL.CPP etc. Controllers may be derived from Class Control or Class StdControl.
[modifier] Systems
Systems are basically combinations of more than one type of procedural object, along with optional controllers, or modifiers, or space warps all working together. These plug-ins can provide high-order parametric control over very complex systems. An example system is Biped which uses procedural objects and master/slave controllers.
[modifier] File Import
These plug-ins allows 3D geometry and other scene data to be imported and exported to file formats other than the 3ds max format. An example file import plug-in may be found in \MAXSDK\SAMPLES\IMPEXP\3DSIMP.CPP. These plug-ins are derived from Class SceneImport.
[modifier] File Export
These plug-ins allows 3D geometry and other scene data to be exported to file formats other than the 3ds max format. Sample code may be found in \MAXSDK\SAMPLES\IMPEXP\3DSEXP.CPP. These plug-ins are derived from Class SceneExport.
[modifier] Atmospheric Plug-Ins
These plug-ins are used for atmospheric effects. MAX's Fog, and Volume Fog are two atmospheric plug-ins. Certain particle system-ish effects can be accomplished via atmospherics more efficiently. For example, a fire effect that is not done with particles but rather as a function in 3D space (the Combustion plug-in is a good example of this). Instead of rendering particles you traverse a ray and evaluate a function. These plug-ins typically use very little memory relative to a particle system equivalent. Atmospheric plug-ins also have the ability to reference items in the scene. (For example, MAX's Volume Lights reference lights in the scene.) These plug-ins are derived from Class Atmospheric.
[modifier] Plug-In Materials
These are additional developer-defined material types. Examples are Standard, Mix, and Multi/Sub-Object materials. New materials are subclassed from Class Mtl. Also see the section Working with Materials and Textures. The sample code for these plug-ins is in \MAXSDK\SAMPLES\MATERIALS.
[modifier] Plug-In Textures
Procedural Texture plug-ins define 2- or 3-dimensional functions which can be assigned as maps within the shader tree architecture of the Materials Editor. Maps may be assigned as ambient, diffuse, specular, shininess, shininess strength, self-illumination, opacity, filter (transmission) color, bump, reflection and refraction maps. These functions may vary over time to produce animated effects. There are both 2D and 3D procedural textures, compositors and color modifiers. These plug-ins are derived from Class Texmap. Also see the section Working with Materials and Textures. The sample code for these plug-ins is in \MAXSDK\SAMPLES\MATERIALS.
[modifier] 2D Procedural
Examples of 2D texture are BITMAP.CPP and CHECKER.CPP.
[modifier] 3D Procedural
Examples of 3D textures are MARBLE.CPP and NOISE.CPP.
[modifier] Compositor
Some examples of compositors are MASK.CPP and MIX.CPP.
[modifier] Color Modifier
An example color modifier is RGB TINT.CPP. Developers that have created a 3D Studio/DOS SXP and a corresponding 3ds max texture plug-in may want to have a look at Class Tex3D. It provides a way to have an instance of your 3ds max texture plug-in created automatically when the corresponding SXP is found in a 3DS file being imported.
[modifier] Image Processing Plug-Ins
[modifier] Filters
Filters may be used to alter images in the video post data stream. Filters may operate on a single image or may combine two images together to create a new composite image. These plug-ins are derived from Class ImageFilter. Also see the section Working with Bitmaps.
[modifier] One Pass Filter
This plug-in type allows a single image in the video post data stream to be adjusted in some manner. An example plug-in of this type is \MAXSDK\SAMPLES\POSTFILTERS\NEGATIVE\NEGATIVE.CPP.
[modifier] Layer Filter
This plug-in allows two images to be composited to create a single new image. An example of this type of plug-in is \MAXSDK\SAMPLES\POSTFILTERS\ADD\ADD.CPP or \MAXSDK\SAMPLES\POSTFILTERS\ALPHA\ALPHA.CPP.
[modifier] G Buffer
A G-buffer is used to store, at every pixel, information about the geometry at that pixel. All plug-ins in video post can request various components of the G-buffer. When video post calls the renderer it takes the sum of all the requests and asks the renderer to produce the G-buffer. Developers can use this information to create visual effects that are impossible to achieve without access to a G-buffer. See Class GBuffer.
[modifier] Rendering Effects
This plug-in type is available in release 3.0 and later only. There is a new item under the Rendering menu which displays the Rendering Effects dialog. From this modeless dialog, the user can select and assign a new class of plug-in, called a "Rendering Effect," which is a post-rendering image-processing effect. This lets the user apply image processing without using Video Post, and has the added advantage of allowing animated parameters and references to scene objects. The base class for these plug-ins is Class Effect. Sample code is available in the directory \MAXSDK\SAMPLES\RENDER\RENDEREFFECT.
[modifier] Snap Plug-Ins
This plug-in type is available in release 2.0 and later only. This plug-in type allows custom points to be provided to the 3ds max snapping system. For example a door plug-in could provide a custom snap for the hinge center. See Class Osnap for details. For sample code see \MAXSDK\SAMPLES\SNAPS\SPHERE\SPHERE.CPP.
[modifier] Image Loading and Saving Plug-Ins
Image loading and saving plug-ins allow the image file formats loaded and saved by 3ds max to be extended. An example is the JPEG loader / saver. Sample code may be found in the sub-directories of \MAXSDK\SAMPLES\IO. These plug-in types are derived from Class BitmapIO. Device drivers are also derived from this class. See the sample code in \MAXSDK\SAMPLES\IO\WSD\WSD.CPP.
[modifier] Utility Plug-Ins
These plug-ins are useful for implementing modal procedures such as 3D paint, dynamics, etc. These plug-ins are accessed from the Utility page of the command panel. Example code may be found in the subdirectory \MAXSDK\SAMPLES\UTILITIES. These plug-ins are sub-classes off Class UtilityObj.
[modifier] Global Utility Plug-Ins
This plug-in type is available in release 3.0 and later only. These simple utility plug-ins are loaded at boot time, after initialization, but before the message loop starts, and remain loaded. This is how the new 3ds max COM/DCOM interface is implemented. For details see Class GUP.
[modifier] Track View Utility Plug-Ins
These plug-ins are launched via the 'Track View Utility' icon just to the left of the track view name field in the toolbar. Clicking on this button brings up a dialog of all the track view utilities currently installed in the system. Most utilities will probably be modeless floating dialogs, however modal utilities may be created as well. These can provide general utility functions that operate on keys, time or function curves in Track View. Sample code is available in \MAXSDK\SAMPLES\UTILITIES\RANDKEYS.CPP, ORTKEYS.CPP and SELKEYS.CPP. These plug-ins are sub-classes off Class TrackViewUtility.
[modifier] Plug-In Renderers
Plug-In renderers are derived from the class Renderer. The standard 3ds max scanline renderer is itself derived from this class. In a trivial sense, there are only a few methods to implement to create a renderer: Open(), Render(), Close(), ResetParams() and CreateParamDlg(). See Class Renderer for more details on this plug-in type.
[modifier] Shader Plug-Ins
This plug-in type is available in release 3.0 and later only. This plug-in type works with the new Standard material. It allows plug-in developers to add additional shading algorithms to the drop down list of available options (previously Constant, Phong, Blinn, Metal). This was only possible previously by writing an entire Material plug-in (which could be a major undertaking). See the base class for this plug-in type Class Shader for details.
[modifier] Sampler Plug-Ins
This plug-in type is available in release 3.0 and later only. This plug-in type works with the Standard material of release 3. A Sampler is a plug-in that determines where inside a single pixel the shading and texture samples are computed. The user interface of Samplers appears in the Super Sampling rollout in the Sampler dropdown. See Class Sampler for details.
[modifier] Anti-Aliasing Filter Plug-Ins
This plug-in type is available in release 3.0 and later only. This plug-in type is used for filtering and anti-aliasing the image. Documentation for the base class for these filters is in Class FilterKernel. Sample Code is available in the subdirectory \MAXSDK\SAMPLES\RENDER\AAFILTERS.
[modifier] Shadow Generator Plug-Ins
This plug-in type is available in release 3.0 and later only. The generation of shadows is accessible via this plug-in type. The standard 3ds max mapped and raytraced shadows have are plug-ins of this form. See Class ShadowType and ShadowGenerator for details. There is also a handy class for creating shadow map buffers. See Class ShadBufRenderer.
[modifier] Sound Plug-In
A sound plug-in can take control of sound/music production in MAX. These plug-ins control not only the sounds they generate but also the system clock. They can thus coordinate the timing of external sound input / output devices with the animation. Sound plug-ins can provide their user interface as part of the 3ds max Track View. Sound plug-ins are derived from Class SoundObj.
[modifier] Color Selector Plug-In
This plug-in type is available in release 3.0 and later only. This plug-in type provides the user with a custom color picker that appears whenever a standard 3ds max color swatch control is clicked. These plug-ins are selected in the General tab of the Preferences dialog. The color picker chosen is saved in the 3DSMAX.INI file in the "ColorPicker" section so that the choice is maintained between sessions. If the DLL for the selected color picker is not available, it will always default back to the "Default"color picker. See Class ColPick for details.
[modifier] Front End Controllers
These plug-ins allow a developer to completely take over the 3ds max user interface. This includes the toolbar, pulldown menus, and command panel. See Class FrontEndController for details.
[modifier] Motion Capture Input Devices
Motion Capture Input Device plug-ins can now be written that plug-in to the 3ds max motion capture system. See Class IMCInputDevice for details. Sample code is available in the subdirectory \MAXSDK\SAMPLES\MOCAP.
[modifier] Image Viewer Plug-In
An image viewer is available from the 3ds max File menu under View File. A developer may replace the viewer DLL launched by this command to provide enhanced functionality for image browsing. The source code for this viewer is in \MAXSDK\SAMPLES\VIEWFILE\VIEWFILE.CPP. This plug-in is derived from Class ViewFile.
[modifier] Notification Program
There is a program whose source code is in \MAXSDK\SAMPLES\UTILITIES\NOTIFY\NOTIFY.CPP. This program gets invoked by the network manager to handle network progress notifications. A developer may write another "Notify" program in order to do any proprietary type of notifications. Note that "Notify" can be either a "*.exe", a "*.bat", or a "*.cmd" executable. This allows a user to create a simple script file to do something without having to resort to writing a binary program.
The current Notify.exe is very simple as it is used simply as a demonstration. It plays a different wave file for each of the event types. If invoked with no command line, it will bring up a dialog box asking the user to define each of the three wave files. The dialog has "Browse" buttons next to each wave file field which puts the user right into the Windows' "Media"directory where wave files are saved. There are also "play" buttons next to each sound so they can be tested.
[modifier] 5. Les types qui nous intéressent
Dans la liste précédente de types de plugins, un certain nombre nous intéresse plus particulièrement : les utilitaires (et GUP global utilty plugin), les importers / exporters et les modifiers.
[modifier] 5.1. Les utilitaires
Ils servent normalement à récupérer des infos d'une scène complète, ils ne s'appliquent pas à un objet particulier. Ils ne permettent de modifier les objets que si ces derniers ont leurs pile de modiers collapsée (voir paragraphe suivant). Ils sont les plus rapides et les plus faciles à mettre en œuvre et ne nécessitent pas trop de connaissance du pipeline de Max.
[modifier] 5.2. Les modifiers
Ils servent à modifier les objets comme leur nom l'indique. Ils sont très complexes à mettre en œuvre. Par exemple pour faire un modifier qui sélectionne des faces ou des vertices d'un mesh il faut plusieurs centaines de lignes de codes qui sont très dures à faire marcher car on les copie/colle toujours d'un plugin existant et des tas de paramètres sont à prendre en compte.
[modifier] 5.3. Les Imports/Exports
Ils servent importer resp. exporter des données dans resp. provenant de Max. Ils sont assez complexes à mettre en œuvre lorsque l'on veut tout récupérer de Max, les meshes, le skinning, les animations, le morphing etc...
[modifier] 6. Le pipeline des modifiers
Dans Max, les objets sont modifiés par un type de plugin : les modifiers. Ils font partie des plugins les plus compliqués à développer. Dans Max, le pipeline de modification est le suivant : On a un objet de base (qui peut venir d'une primitive), puis on prend le premier modifier appliqué sur cet objet, on applique les modifications puis on donne l'objet modifié en entrée du 2e modifier puis il nous redonne un objet modifié puis on le donne en entrée du n-ième modifier. Le pipeline est évalué comme ça. On peut collapser la pile des modifiers d'un objet, cela revient à appliquer toutes les modifications sur un objet et dire que mainteant cet objet est l'objet modifié, il n'est plus possible de revenir en arrière. Les modifiers une fois attachés à un objet sont désactivables (on peut voir leurs effets ou non), on peut faire du copier/coller de modifier sur d'un objet usr un autre. Les modifiers ont beaucoup de fonctions dites très puissantes. Mais en pratique, ils deviennent vite un frein à la productivité car il faut sans cesses collapser les objets pour nettoyer les modifiers, car plus on en laisse plus Max rame car il met du temps à évaluer chaque objet... On ne se sert des avantages des modifiers que très rarement, par contre on subit toujours leurs inconvénients. Exemple : Je veux modifier le mapping de plusieurs faces, mais je ne peux pas faire tout d'un coup. Je sélectionne mon premier groupe de faces d'un objet : pour cela je rajoute un modifier editmesh, puis je me met en mode sélection de faces. Puis je sélectionne mes faces. Ensuite je rajoute un modifier UVWMap ou Unwrap pour modifier les UVs des faces sélectionnées. Maintenant je veux sélectionner un autre groupe de faces, je suis obligé de rajouter un autre edit mesh pui de répéter l'opération précédente, ou de collapser la pile. On retrouve souvent sur les objets Max une succession de couples de modifiers comme editmesh, unwrap, editmesh, unwrap etc.
[modifier] 7. La classe Interface
Quelque soit le type de plugin que vous faites, vous aurez forcément à passer par la classe interface de Max, c'est une classe qui sert pour tout. On peut en attraper une instance globale par la fonction suivante :
Interface* ip = GetCOREInterface () ;
Elle permet par exemple de récupérer le nombre d'objets sélectionnés :
const int NumSelNodes = ip-> GetSelNodeCount() ;
Puis les objets sélectionnés :
for (int i=0 ;i < NumSelNodes ;i++)
{
Inode* node = ip-> GetSelNode(i) ;
}
On peut récupérer le temps courant dans Max par :
TimeValue CurTime = ip-> GetTime () ;
Je ne détaille pas le contenu de cette classe car il me faudrait plusieurs pages, voir la documentation pour plus de détails. Une instance de cette classe est normalement définie dans chaque plugin dans la fonction BeginEditParams commune à tout les plugins.
[modifier] 8. Quelques classes mathématiques dans Max
Les doubles ne sont pas utilisés en standard, seuls les float sont utilisés dans les classes.
- Class IPoint2 = 2 coordonées entières.
- Class Point2 = 2 coordonnées flottantes.
- Class IPoint3 = 3 coord. entières.
- Class Point3 = 3 coord. flotantes.
- Class Box2 = BBox 2D équivalent à la classe RECT de Microsoft Windows ?.
- Class Box3 = BBox 3D non orientée.
- Class Matrix2 = matrice 3x2
- Class Matrix3 = matrice 4x3
- Structure AffineParts sert à décomposer les matrices 3x3 en TRS.
- Class AngAxis = un axe et un angle représentant une rotation,
- Class Quat = quaternion
- Class ScaleValue est utilisé pour les scales (valeur du scale Point3 et axe du scale Point3)
[modifier] 9. Les matériaux
Il existe plusieurs types de matériaux, voyons ceux qui nous intéressent :
- Les matériaux standards.
- Les multimatériaux.
[modifier] 9.1. Philosophie des matériaux
Voici le fonctionnement : Un matériau standard référence une ou plusieurs textures. Pour cela il dispose de slots :
- Ambient
- Diffuse
- Specular
- Shininess
- Shininess strength
- Self-illumination
- Opacity
- Filter color
- Bump
- Reflection
- Refraction Displacement
Les textures dans le jeu vidéo sont plaçées dans le slot diffuse, si elles contiennent de l'alpha, la même texture est aussi plaçée dans le slot opacity.
Un matériau ne peut contenir qu'une seule texture et par objet, on ne peut assigner qu'un seul matériau.
Avec ces 2 assertions, on se dit qu'il n'est pas possible d'avoir un mesh avec des textures diffférentes sur certaines faces. En fait heureusement c'est possible, pour cela il faut utiliser un multimatériau. Un multimatériau est un matériau qui contient d'autres matériaux standards. Remarque : Il peut aussi contenir des multimatériaux bien que cela ne serve à rien. Donc pour avoir plusieurs textures sur un même objet, on utilise un multimériau contenant n sous matériaux chacun de ces sous-matériaux conteant un bitmap dans le slot diffuse. C'est bon ? vous suivez toujours ? :) Alors on continue,
[modifier] 9.2. Comment dans le mesh sont référencés les matériaux ?
Dans le mesh il y a un tableau de la taille du nombre de faces. Ce tableau appelé FaceMtlID contient des Ids. Ces IDs ne servent que si un multimatériau est appliqué sur le mesh. Dans ce cas, l'ID d'une face, soit ID1 correspond au sous-matériau numéro ID1 du multimatériau. Si ID1 > nombre de sous-matériau, un modulo du nombre de sous-matériaux est appliqué à ID1 de manière à le ramener dans le bon range.
[modifier] 9.3. L'éditeur de matériaux
Pour créer ses matériaux, charger ses textures, il y a l'éditeur de matériaux. Il est accessible dans le menu Tools->Material editor. Il est très complexe, c'est pourquoi un utilitaire nommé kalisto mapping tool(a été développé pour simplifier l'utilisation des matériaux sous Max.
[modifier] 9.4. Où trouve-t'on les matériaux ?
Il existe 3 containers différents où l'on trouve des matériaux :
- Le material editor
- La " scene materials "
- La librairie courante de matériaux.
[modifier] 9.4.1. Le material editor
Il sert à créer et modifier les matériaux. Il ne peut contenir que 24 matériaux au maximum on est donc obligé d'en enlever régulèrement. Une scène comme un circuit contient entre 200 et 500 matériaux. Voire plus.
[modifier] 9.4.2. La " scene materials "
Elle contient tous les matériaux qui ont été appliqués au moins à un objet de la scène. D'abord les matériaux sont dans le material editor, puis ils sont assignés aux objets et se retrouvent dans la " scene materials ".
[modifier] 9.4.3. La librairie courante de matériaux
C'est une librairie de matériaux qui est toujours chargée avec Max. On peut la modifier, la sauver, la charger etc. A ma connaissance elle est peut utilisée par les jeux.
[modifier] 10. La classe Mesh
Tous les meshes sans exceptions ne sont composés que de triangles. Même s'il est possible de sélectionner les faces par quad, ce n'est qu'une astuce utilisant les edges invisibles entre 2 triangles et l'angle entre ces 2 triangles pour représenter un quad. Mais il n'existe pas de faces qui sont des quad dans Max.
La classe Mesh est composée de données assez indépendantes : Il y a :
- un tableau de vertices 3D (classe Point3 = KVec3f sous Kera)
- un tableau d'UVs (classe Point3) Le mesh peut contenir plusieurs couches d'UVs. Ce sont les mappings channels ou mapsupport dans le mesh.
- des tableaux de bits contenant les vertices, faces et edges sélectionnés.
- un tableau de faces (classe Face) qui contient* 3 indices dans le tableau de vertices qui composent cette face.
- L'index de smoothgroup d'une face.
- Divers flags non extensibles.
- un tableau de TVFace (class TVFace) qui contient pour chaque face les 3 indices d'UVs qui composent cette face.
- Un tableau de vertices color (class Point3 --dans Max 4 uniquement, dans les versions précedentes, les vertex colors sont dans le channel 0 des UVs)
- D'autres données diverses Etc.
[modifier] 11. Gestionnaire de racourcis claviers (spécifique Max 3)
Les raccourcis claviers standards de Max sont customisables. Il existe un " shortcut manager " qui permet à un plugin d'enregistrer ses raccourcis claviers, ils seront ensuite customisables par l'utilisateur. Il existe un bouton pour activer/désactiver les raccourcis claviers des plugins. Quand ils sont désactivés, les raccourcis claviers standars de Max sont les seuls actifs. Quand les raccourcis des plugins sont activés, ils prennent la priorité sur ceux en standard de Max. Si 2 mêmes raccourcis sont définis, un dans Max et un dans un plugin, lorsque cette touche est activée, seul le raccouci plugin est actif (si le plugin est utilisé). Si il existe dans ce cas un raccourci standard de Max et qu'aucun plugin actif ne l'utilise, il reste activé. Au niveau du code, pour déclarer ses raccourcis claviers pour un plugin, on utilise :
- Une classe ShortcutDescription qui fait la description des raccourcis claviers, elle contient :* Une ligne d'une table accelerator (sous l'éditeur de ressources de Visual). Elle contient un ID pour le raccourci et la combinaison de touches du raccourci.* Une chaîne de caractères pour la description du raccourci.
Puis pour la callback qui récupèrera les évènements des raccourcis on dérive de la classe : ShortcutCallback qui ne contient qu'une méthode qui est la callback.
Remarque : Plus généralement, Max utilise pour ses callbacks non pas des fonctions static ou globales mais une classe qui ne contient qu'une méthode qui est la callback. Ensuite pour enregistrer la callback, on créé une instance de cette classe et on la donne en paramètre du mécanisme qui appelera l'unique méthode de cette classe. Cette manière de déclarer les callbacks s'apelle : " un functor" (dixit Jurie Horneman :) ). L'avantage est que l'on n'utilise pas de pointeurs de fonctions dans lesquels il est facile de faire une erreur et de ne s'en apercevoir qu'au run-time. Alors qu'ici l'erreur s'il y en a, est détectée au moment de la compilation.
Ensuite on utilise une fonction globale pour déclarer sa table de shortcuts :
ShortcutTable* GetMappingShortcuts()
{
TSTR name = " Kalisto MappingTool" ;
HACCEL hAccel = LoadAccelerators(hInstance,MAKEINTRESOURCE(IDR_ACCELERATOR1));
int numOps = NumElements(spShortcuts);
ShortcutTable* pTab = new ShortcutTable(kMappingShortcuts, name, hAccel,
numOps, spShortcuts, hInstance);
return pTab;
}
On y charge la table de raccourcis claviers et leurs IDs, on se servira de ceci dans la classDesc pour la fonction ShortcutTable* GetShortcutTable pour que Max soit au courant qu'il existe une table de raccourcis claviers. Ensuite dans le plugin, on déclare en général dans la fonction begineditparam :ip->ActivateShortcutTable(static_cast<ShortcutCallback*>(mappingShortcutCB), kMappingShortcuts);Où mappingShortcutCB est l'instance de classe héritant de shortcutCallBack et kmappingShortcuts est un ID du style qui permet de le retrouver :const ShortcutTableId kMappingShortcuts = 0x34f274f4;De même pour les désactiver, on fait :ip->DeactivateShortcutTable(static_cast<ShortcutCallback*>(mappingShortcutCB), kMappingShortcuts);
[modifier] 12. Quelques Références
- Articles sur Gamasutra* " Choosing Between Utility and Modifier Plug-Ins for 3D Studio Max " par David Lanier. http://www.gamasutra.com/features/20000614/lanier_01.htm
- "From Direct3D to 3D Studio Max" par Loïc Baumann http://www.gamasutra.com/features/19980320/baumann_01.htm
- Sites Web :* Petit Tutorial en Anglais sur le SDK de Max : http://www.fancy.org/software/max/
- Discreet progamme Sparks pour les développeurs : http://sparks.discreet.com
Ce document a été publié sur la version 3 du G.C.N. par David Lanier.
- Auteur Original : David Lanier
- Date de publication : 21 novembre 2002



