00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00039
00040 #ifndef _SO_WIN_MATERIAL_EDITOR_
00041 #define _SO_WIN_MATERIAL_EDITOR_
00042
00043 #include <Inventor/Win/SoWinBeginStrict.h>
00044 #include <Inventor/sys/port.h>
00045 #include <Inventor/SbBasic.h>
00046 #include <Inventor/misc/SoCallbackList.h>
00047 #include <Inventor/Win/SoWinComponent.h>
00048
00049 class SoBaseColor;
00050 class SoWinClipboard;
00051 class SoWinColorEditor;
00052 class SoNodeSensor;
00053 class SoSensor;
00054 class SoDirectionalLight;
00055 class SoMaterial;
00056 #ifdef NOTYET
00057 class SoWinMaterialList;
00058 #endif
00059 class SoPathList;
00060 class SoWinRenderArea;
00061 class SoSelection;
00062 class SoWinColorSlider;
00063 class SoMFColor;
00064 class SbColor;
00065 class SoBase;
00066 class SoSeparator;
00067 class SoWinMaterialPalette;
00068
00069 class SoVRMLMaterial;
00070 class SoNode;
00071 class SoSFColor;
00072
00073
00077 typedef void SoWinMaterialEditorCB(void *userData, const SoMaterial *mtl);
00078
00080
00081
00082
00083
00084
00086
00115 class SoWinMaterialEditor : public SoWinComponent {
00116 public:
00121 enum UpdateFrequency {
00125 CONTINUOUS,
00129 AFTER_ACCEPT,
00130 };
00131
00135 SoWinMaterialEditor(
00136 SoWidget parent = NULL,
00137 const char *name = NULL,
00138 SbBool buildInsideParent = TRUE);
00142 virtual ~SoWinMaterialEditor();
00143
00148 void attach( SoMaterial *material, int index = 0 );
00152 void attach( SoVRMLMaterial *material );
00156 void detach();
00160 SbBool isAttached() { return (material != NULL); }
00161
00168 inline void addMaterialChangedCallback(
00169 SoWinMaterialEditorCB *f,
00170 void *userData = NULL);
00175 inline void removeMaterialChangedCallback(
00176 SoWinMaterialEditorCB *f,
00177 void *userData = NULL);
00178
00182 void setUpdateFrequency(SoWinMaterialEditor::UpdateFrequency freq);
00186 SoWinMaterialEditor::UpdateFrequency getUpdateFrequency()
00187 { return updateFreq; }
00188
00189
00190
00191 virtual void show();
00192 virtual void hide();
00193
00197 void setMaterial(const SoMaterial &mtl);
00201 void setMaterial(const SoVRMLMaterial &mtl);
00205 const SoMaterial & getMaterial() const { return *localMaterial; }
00206 #ifdef NOTYET
00207 const SoVRMLMaterial & getVRMLMaterial() const
00208 { copyMaterial( localVRMLMaterial,0,localMaterial,0);
00209 return *localVRMLMaterial; }
00210 #endif
00211
00215 SbBool isAttachedVRML() { return (isVRMLMaterial); }
00216
00217 SbBool alwaysOnTop;
00218 SoWinMaterialPalette * m_pMaterialPalette;
00219 private:
00220
00221
00222
00223
00224
00225 SoEXTENDER
00226 SoWinMaterialEditor(
00227 SoWidget parent,
00228 const char *name,
00229 SbBool buildInsideParent,
00230 SbBool buildNow);
00231
00232
00233 virtual SbString getDefaultWidgetName() const;
00234 virtual SbString getDefaultTitle() const;
00235 virtual SbString getDefaultIconTitle() const;
00236
00237 private:
00238 unsigned long nCurrEditId ;
00239 unsigned long diamondButtonId[4] ;
00240 unsigned long radioButtonId[4] ;
00241 HMENU menubar ;
00242
00243 void layoutAccept() ;
00244
00245 static WBOOL CALLBACK mgrDlgProc( Hwnd hdlg, UINT message,
00246 WPARAM wParam, LPARAM lParam );
00247 static void onCommand(
00248 Hwnd hdlg,
00249 int id,
00250 Hwnd hCtrl,
00251 UINT codeNotify ) ;
00252
00253 void handleEdit(
00254 int nSlider,
00255 Hwnd hEdit,
00256 UINT codeNotify) ;
00257
00258 void handleButtons(SoWinMaterialEditor *p,
00259 SoWidget hCtrl,
00260 int id,
00261 UINT codeNotify) ;
00262
00263 void handleMenu(SoWinMaterialEditor *p,
00264 int id ) ;
00265
00266 void initPlacement() ;
00267
00268
00269
00270
00271 SoNode *material;
00272 SoMaterial *imat;
00273 SoVRMLMaterial *vmat;
00274 int index;
00275 SoNodeSensor *sensor;
00276 SoCallbackList *callbackList;
00277 SoWidget acceptButton, diamondButtons[4], radioButtons[4];
00278 SoWinMaterialEditor::UpdateFrequency updateFreq;
00279
00280 SbBool isVRMLMaterial;
00281
00282
00283 SoWidget mgrWidget;
00284 SoWinColorEditor *colorEditor;
00285 SoWinColorSlider *sliders[6];
00286 SbBool changedIt[6];
00287 #ifdef NOTYET
00288 SoWinMaterialList *materialList;
00289 #endif
00290 SbBool ignoreCallback;
00291 SbBool openMaterialList;
00292 static void colorEditorCloseCB(void *, SoWinComponent *);
00293 static void materialListCloseCB(void *, SoWinComponent *);
00294
00295
00296 SoWinClipboard *clipboard;
00297
00298
00299 SoWinRenderArea *renderArea;
00300 SoMaterial *localMaterial;
00301 SoVRMLMaterial *localVRMLMaterial;
00302 SoDirectionalLight *light0;
00303 SoDirectionalLight *light1;
00304 SoBaseColor *tileColor;
00305 SoSeparator *root;
00306
00307 long activeColor;
00308
00309
00310 void updateLocalComponents();
00311
00312
00313 void updateColorEditor(SbBool updateTitle = FALSE);
00314
00315
00316
00317 void updateColorSlider(SoWinColorSlider *, const float rgb[3]);
00318
00319
00320 void updateMaterialColor(
00321 SoMFColor *editMtlColor,
00322 SoMFColor *localMtlColor,
00323 const float *rgb,
00324 float intensity);
00325 void updateMaterialColor(
00326 SoSFColor *editMtlColor,
00327 SoMFColor *localMtlColor,
00328 const float *rgb,
00329 float intensity);
00330
00331
00332
00333
00334 void copyMaterial(SoNode *mat1, int index1,
00335 const SoNode *mat2, int index2);
00336
00337
00338
00339 void undoIgnoresIfChanged();
00340
00341
00342 static void pasteDone(void *userData, SoPathList *pathList);
00343
00344
00345 static void materialListCB(void *, const SoMaterial *);
00346 static void colorEditorCB(void *, const SbColor *);
00347 static void ambientSliderCB(void *, float);
00348 static void diffuseSliderCB(void *, float);
00349 static void specularSliderCB(void *, float);
00350 static void emissiveSliderCB(void *, float);
00351 static void shininessSliderCB(void *, float);
00352 static void transparencySliderCB(void *, float);
00353
00354
00355 void menuPick(SoWidget, int, XmAnyCallbackStruct *);
00356 void menuDisplay(SoWidget, SoWinMaterialEditor *, XtPointer);
00357 void radioButtonPick(SoWidget, int, XtPointer);
00358 void diamondButtonPick(SoWidget, int, XtPointer);
00359
00360 static void acceptButtonCB(SoWidget, SoWinMaterialEditor *, XtPointer);
00361
00362
00363 static void sensorCB(void *, SoSensor *);
00364
00365
00366 SoWidget buildWidget(SoWidget parent);
00367 SoWidget buildPulldownMenu(SoWidget parent);
00368 SoWidget buildControls(SoWidget parent);
00369 SoWidget buildSlidersForm(SoWidget parent);
00370
00371 static void visibilityChangeCB(void *pt, SbBool visible);
00372 void activate();
00373 void deactivate();
00374
00375
00376 void constructorCommon(SbBool buildNow);
00377
00378 };
00379
00380
00381
00382 void
00383 SoWinMaterialEditor::addMaterialChangedCallback(
00384 SoWinMaterialEditorCB *f,
00385 void *userData)
00386 { callbackList->addCallback((SoCallbackListCB *) f, userData); }
00387
00388 void
00389 SoWinMaterialEditor::removeMaterialChangedCallback(
00390 SoWinMaterialEditorCB *f,
00391 void *userData)
00392 { callbackList->removeCallback((SoCallbackListCB *) f, userData); }
00393
00394 #include <Inventor/Win/SoWinEndStrict.h>
00395
00396 #endif // _SO_WIN_MATERIAL_EDITOR_
00397
00398