1. Пользоваться форумом на планшетах и телефонах стало удобнее благодаря Tapatalk

программирование плагинов, нужна помощь. идейная)

Тема в разделе "Плагины", создана пользователем mr_bin, 27 окт 2006.

  1. mr_bin

    mr_bin Пользователь сайта

    С нами с:
    25.10.2006
    Сообщения:
    1
    Симпатии:
    0
    Баллы:
    2
    итак.
    есть задача: написать плагин реализующий возможность создания примитивов проде boxа или плоскости. примитив по строению будет значительно сложнее, и состоять собственно из примитивов уже имеющихся в maxe.

    http://www.codenet.ru/progr/video/3D-Studio-Max-Export-Plugin.php
    http://www.gamedev.ru/users/wat/articles/MAXPlugins

    вот что я нашёл.

    вопросы:
    какой выход должен давать плагин?
    можно ли добавить кнопку вызывающую плагин в панель standart primitives чтобы объект заданный в плагине можно было создать подобно другим объектам, задав параметры и щёлкнув в окне проекций.

    моё представление проблемы: задаются параметры, подаются в плагин, он формирует объект, даёт на выходе этот объект в max, а max уже с свою очередь его рисует.

    задачу представляю очень смутно, поделитесь опытом если кто то делал что то подобное.

    заранее спасибо)
    буду рад любой реальной помощи
     
  2. Ed3D

    Ed3D Активный участник

    С нами с:
    06.02.2006
    Сообщения:
    12
    Симпатии:
    0
    Баллы:
    7
    Я сейчас пишу плагин для MAXa.
    Могу сказать, что Вам нужно создавать плагин типа GeomObject, но это уже гораздо более сложнее чем представлено в (http://www.gamedev.ru/users/wat/articles/MAXPlugins)
    Вам нужно создать класс, и реализовать все его функции:
    Код:
    class My_Object : public GeomObject
    {
    	public:
    		//Class vars
    		static IObjParam *ip;			//Access to the interface
    		// From BaseObject
    		CreateMouseCallBack* GetCreateMouseCallBack();
    		int Display(TimeValue t, INode* inode, ViewExp *vpt, int flags);
    		int HitTest(TimeValue t, INode* inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt);
    		void Snap(TimeValue t, INode* inode, SnapInfo *snap, IPoint2 *p, ViewExp *vpt);
    
    // Это чтобы подобъекты были
    		static GenSubObjType SOT_x;
    		int NumSubObjTypes();
    		ISubObjType *GetSubObjType(int i);
    
    		DWORD GetSubselState();
    		static SelectModBoxCMode *selectMode;
    		void ActivateSubobjSel(int level, XFormModes& modes);
    		void SelectSubComponent(HitRecord *hitRec, BOOL selected, BOOL all, BOOL invert=FALSE);
    		void ClearSelection(int selLevel);
    		void SelectAll(int selLevel);
    		void InvertSelection(int selLevel);
    		int HitTest(TimeValue t, INode* inode, int type, int crossing,
    			int flags, IPoint2 *p, ViewExp *vpt, ModContext* mc);
    
    		void GetSubObjectCenters(SubObjAxisCallback *cb, TimeValue t, INode *node, ModContext *mc);
    		void GetSubObjectTMs(SubObjAxisCallback *cb, TimeValue t, INode *node, ModContext *mc);
    // --
    
    		//TODO: Return the name that will appear in the history browser (modifier stack)
    		TCHAR *GetObjectName() { return GetString(IDS_CLASS_NAME); }
    
    		void GetWorldBoundBox(TimeValue t, INode *mat, ViewExp *vpt, Box3& box);
    		void GetLocalBoundBox(TimeValue t, INode *mat, ViewExp *vpt, Box3& box);
    		void GetDeformBBox(TimeValue t, Box3& box, Matrix3 *tm, BOOL useSel);
    
    		//TODO: Return the default name of the node when it is created.
    		void InitNodeName(TSTR& s) { s = GetString(IDS_CLASS_NAME); }
    
    		// From Object
    		BOOL HasUVW();
    		void SetGenUVW(BOOL sw);
    		int CanConvertToType(Class_ID obtype);
    		Object* ConvertToType(TimeValue t, Class_ID obtype);
    		void GetCollapseTypes(Tab<Class_ID> &clist, Tab<TSTR*> &nlist);
    		int IntersectRay(TimeValue t, Ray& ray, float& at, Point3& norm);
    
    		//TODO: Evaluate the object and return the ObjectState
    		ObjectState Eval(TimeValue t);
    		//TODO: Return the validity interval of the object as a whole
    		Interval ObjectValidity(TimeValue t);
    
    		// From Animatable
    		void BeginEditParams(IObjParam  *ip, ULONG flags, Animatable *prev);
    		void EndEditParams(IObjParam *ip, ULONG flags, Animatable *next);
    
    		// From GeomObject
    		Mesh* GetRenderMesh(TimeValue t, INode *inode, View& view, BOOL& needDelete);
    
    		// Loading/Saving
    		IOResult Load(ILoad *iload);
    		IOResult Save(ISave *isave);
    
    		//From Animatable
    		Class_ID ClassID() { return My_Object_CLASS_ID; }
    		SClass_ID SuperClassID() { return GEOMOBJECT_CLASS_ID; }
    		void GetClassName(TSTR& s) { s = GetString(IDS_CLASS_NAME); }
    
    		RefTargetHandle Clone(RemapDir &remap);
    		RefResult NotifyRefChanged(Interval changeInt, RefTargetHandle hTarget, 
    			PartID& partID,  RefMessage message);
    
    
    		int NumSubs();
    		TSTR SubAnimName(int i);
    		Animatable* SubAnim(int i) { return GetReference(i); }
    
    		// TODO: Maintain the number or references here
    		int NumRefs();
    		RefTargetHandle GetReference(int i);
    		void SetReference(int i, RefTargetHandle rtarg);
    
    		void DeleteThis() { delete this; }
    
    		//Constructor/Destructor
    		My_Object();
    		~My_Object();
    }
     

Поделиться этой страницей