Render.ru

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

mr_bin

Пользователь сайта
Рейтинг
2
#1
итак.
есть задача: написать плагин реализующий возможность создания примитивов проде 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 уже с свою очередь его рисует.

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

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

Ed3D

Активный участник
Рейтинг
7
#2
Я сейчас пишу плагин для 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();
}
 
Сверху