SUBROUTINE CHVIEW(JHAND1,ITYPIMAGE) ! USE WINTERACTER USE BLK3D SAVE INCLUDE 'd.inc' ! IMPLICIT NONE ! REAL , PARAMETER :: PI = 3.1415926 ! REAL , PARAMETER :: AngleStep = PI/30. REAL, PARAMETER :: DEFDIST = 5.0 ! REAL :: ViewAngle = 0.0 REAL :: SHIFT=0.0 REAL :: SHIFTV=0.0 REAL :: ROTH=0.0 REAL :: ROTV=0.0 REAL :: ROT=0.0 REAL :: VSCALE=1.0 INTEGER :: ITYPE,K,JRGB INTEGER :: JHAND1,ITYPIMAGE,ITIME TYPE(WIN_STYLE) :: WINDOW TYPE(WIN_MESSAGE) :: MESSAGE LOGICAL :: CHANGED,ONEC CHARACTER(LEN=65) :: STBAR1 CHARACTER(LEN=260) :: FILENAME = 'objects.w3d' ! Main Message loop, keep asking for and processing ! messages until the user selects the Exit option. ! ONEC=.TRUE. DO CALL WMessage(ITYPE,MESSAGE) SELECT CASE (ITYPE) CASE (KeyDown) IF (MESSAGE%VALUE1==KeyEscape) EXIT ! ! Window exposed - re-paint window from bitmap ! CASE (Expose) CALL WBitmapDestroy(JHAND1) CALL WBitmapCreate(JHAND1,WInfoWindow(WindowWidth), & WInfoWindow(WindowHeight)) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) CASE (Resize) ! Window resized CALL WBitmapDestroy(JHAND1) CALL WBitmapCreate(JHAND1,WInfoWindow(WindowWidth), & WInfoWindow(WindowHeight)) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) ! ! Close window request - exit program ! CASE (MenuSelect) ! Menu item selected SELECT CASE (MESSAGE%VALUE1) CASE (ID_SAV3D) ! ! Save data ! CALL WSelectFile(FILTERSTR='Winteracter 3D model files|*.w3d|', & IFLAGS =SaveDialog+PromptOn+AppendExt, & FILEDIR =FILENAME, & TITLE ='Save 3D model file') IF (WInfoDialog(ExitButtonCommon)==CommonOK) THEN CALL W3dSave(FILENAME) ENDIF ! CASE (ID_CLOSE) RETURN CASE (ID_OPENNEW) ITYPIMAGE=-1 RETURN CASE (ID_SAVEVIEW) ROTSV=ROT ROTHSV=ROTH ROTVSV=ROTV DISTSV=DIST VSCALESV=VSCALE IROTSV=1 CASE (ID_WIRE) ITYPIMAGE=0 CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_HIDDEN) ITYPIMAGE=1 CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_UNLIT) ITYPIMAGE=2 CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_FLAT) ITYPIMAGE=3 CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_GOURAUD) ITYPIMAGE=4 CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_MULTCOL) IF(ONEC) THEN CALL W3dMaterial(9,WRGB(254,254,255)) CALL W3dMaterial(8,WRGB(230,254,255)) CALL W3dMaterial(7,WRGB(180,254,255)) CALL W3dMaterial(6,WRGB(130,254,255)) CALL W3dMaterial(5,WRGB(080,254,255)) CALL W3dMaterial(4,WRGB(030,254,255)) CALL W3dMaterial(3,WRGB(001,220,220)) CALL W3dMaterial(2,WRGB(001,180,180)) CALL W3dMaterial(1,WRGB(001,120,120)) CALL V3Materials(JHAND1,ITYPIMAGE,VIEWANGLE) CALL WindowSelect(JHAND1) CALL ShowModel(JHAND1,ITYPIMAGE) ENDIF ONEC=.FALSE. CASE (ID_ONECOL) DO K=1,9 CALL W3dMaterial(K,WRGB(255,255,100)) ENDDO CALL WSelectColour(JRGB,'Colour ') IF (WInfoDialog(ExitButtonCommon)==CommonOK) THEN DO K=1,9 CALL W3dMaterial(K,JRGB) ENDDO CHANGED = .TRUE. ENDIF IF(CHANGED) CALL ShowModel(JHAND1,ITYPIMAGE) ONEC=.TRUE. CASE (ID_ZOOMIN) DIST=DIST-DISTSTEP WRITE(STBAR1,'(F13.3)') DIST CALL WindowOutStatusBar(4,STBAR1) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) ! CASE (ID_ZOOMOUT) DIST=DIST+DISTSTEP WRITE(STBAR1,'(F13.3)') DIST CALL WindowOutStatusBar(4,STBAR1) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_FZOOM) DIST=DIST-DISTSTEP*5. WRITE(STBAR1,'(F13.3)') DIST CALL WindowOutStatusBar(4,STBAR1) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) ! CASE (ID_PLEFT) SHIFT=SHIFT+0.5 EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_PRIGHT) SHIFT=SHIFT-0.5 EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_UPAR) SHIFTV=SHIFTV+0.5 EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_DWNAR) SHIFTV=SHIFTV-0.5 EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_ROTATAC) ROT=ROT-5. CALL W3dRotate(0.,1) CALL W3dRotate(0.,2) CALL W3dRotate(-5.,3) !ROT=ROT+0.087266 !EYE(1,4) = (XMIN + XLEN/2.0+SHIFT)*COS(ROT)+(YMIN + YLEN/2.0)*SIN(ROT) !EYE(3,4) = ZMIN + ZLEN/2.0 !EYE(2,4) =-(XMIN + XLEN/2.0+SHIFT)*SIN(ROT)+(YMIN + YLEN/2.0)*COS(ROT) !CALL ViewPos(ViewAngle) !CALL ShowModel(JHAND1,ITYPIMAGE) CALL W3dGetMatrix(EYE) WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_ROTATC) ROT=ROT+5. CALL W3dRotate(0.,1) CALL W3dRotate(0.,2) CALL W3dRotate(5.,3) !ROT=ROT+0.087266 !EYE(1,4) = (XMIN + XLEN/2.0+SHIFT)*COS(ROT)+(YMIN + YLEN/2.0)*SIN(ROT) !EYE(3,4) = ZMIN + ZLEN/2.0 !EYE(2,4) =-(XMIN + XLEN/2.0+SHIFT)*SIN(ROT)+(YMIN + YLEN/2.0)*COS(ROT) !CALL ViewPos(ViewAngle) !CALL ShowModel(JHAND1,ITYPIMAGE) CALL W3dGetMatrix(EYE) WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) !! CASE (ID_VSCALEV) ! CALL GETVSCAL(VSCALESV) !! CALL W3dScale(1.0,VSCALESV,1.0) ! CALL W3dGetMatrix(EYE) ! EYE(1,4) = XMIN + XLEN/2.0+SHIFT ! EYE(2,4) = YMIN + YLEN/2.0 ! EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV ! CALL ViewPos(ViewAngle) ! CALL ShowModel(JHAND1,ITYPIMAGE) CASE (ID_RSET) DIST = DEFDIST*MAX(XLEN,YLEN,ZLEN) WRITE(STBAR1,'(F13.3)') DIST CALL WindowOutStatusBar(4,STBAR1) SHIFT=0. SHIFTV=0. VIEWANGLE=0. CALL W3dRotate(-ROTV,1) CALL W3dRotate(-ROTH,2) CALL W3dRotate(-ROT,3) CALL W3dGetMatrix(EYE) EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) ROTH=0. ROTV=0. ROT=0. WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) CASE(ID_TOP) CALL W3dRotate(-ROTV-45.,1) CALL W3dGetMatrix(EYE) EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) ROTV=-45. WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) CASE(ID_SIDE) CALL W3dRotate(-ROTV+45.,1) CALL W3dGetMatrix(EYE) EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) ROTV= 45. WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) END SELECT CASE (CloseRequest) RETURN ! ! Mouse button pressed. Action depends on button: ! CASE (MouseButDown) SELECT CASE (MESSAGE%VALUE1) ! Left button. Start rotation. ! CASE (LeftButton) ROTH=ROTH+5. CALL W3dRotate(0.,1) CALL W3dRotate(5.,2) CALL W3dRotate(0.,3) CALL W3dGetMatrix(EYE) WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) ! right button. Start rotation. ! CASE (RightButton) ROTH=ROTH-5. CALL W3dRotate(0.,1) CALL W3dRotate(-5.,2) CALL W3dRotate(0.,3) CALL W3dGetMatrix(EYE) WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) CASE (UpWheel) ROTV=ROTV+5. CALL W3dRotate(5.,1) CALL W3dRotate(0.,2) CALL W3dRotate(0.,3) CALL W3dGetMatrix(EYE) WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) CASE (DownWheel) ROTV=ROTV-5. CALL W3dRotate(-5.,1) CALL W3dRotate(0.,2) CALL W3dRotate(0.,3) CALL W3dGetMatrix(EYE) WRITE(STBAR1,'(5F13.3)') ROTH,ROTV,ROT,SHIFT,SHIFTV CALL WindowOutStatusBar(2,STBAR1) EYE(1,4) = XMIN + XLEN/2.0+SHIFT EYE(2,4) = YMIN + YLEN/2.0 EYE(3,4) = ZMIN + ZLEN/2.0+SHIFTV CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) ENDSELECT END SELECT END DO RETURN END SUBROUTINE V3Materials(JHAND1,ITYPIMAGE,VIEWANGLE) ! ! Edit materials ! USE WINTERACTER USE BLKMAT INCLUDE 'd.inc' TYPE(WIN_STYLE) :: WINDOW TYPE(WIN_MESSAGE) :: MESSAGE CHARACTER(LEN=10) :: CMATNUM ! ! INTEGER, INTENT(IN) :: JHAND1,ITYPIMAGE ! Memory bitmap handle ! REAL, INTENT(IN) :: VIEWANGLE INTEGER JHAND1,ITYPIMAGE ! Memory bitmap handle REAL VIEWANGLE INTEGER NMAT,MAXMAT,JMAT,IMAT,JRGB,I1,I2,IG,IR,IB,J2,JC1,JR1,ISHINE,IGLOSS,IC2,IR2,IR1,IC1 LOGICAL CHANGED ! CALL WMessageEnable(FieldChanged,Enabled) CALL WDialogLoad(IDD_MATERIALS) ! ! Operate on a copy of the material list, ! so model remains intact if user cancels ! NMAT = WInfo3dInteger(M3dMaterials) ALLOCATE(IMATN(NMAT)) ALLOCATE(IRGB(NMAT)) ALLOCATE(SHINE(NMAT)) ALLOCATE(GLOSS(NMAT)) MAXMAT = WInfo3dInteger(M3dMaxMaterials) CALL WGridRows(IDF_GRID1,NMAT) ! ! Retrieve material list and set background colours of "Material" column to match ! JMAT = 0 DO IMAT = 1,MAXMAT CALL W3dMaterialN(IMAT) JRGB = WInfo3dInteger(M3dRGB) IF (JRGB/=-1) THEN JMAT = JMAT + 1 IMATN(JMAT) = IMAT IRGB(JMAT) = JRGB SHINE(JMAT) = WInfo3dReal(M3dShine) GLOSS(JMAT) = WInfo3dReal(M3dGloss) CALL WGridColourCell(IDF_GRID1,1,JMAT,RGBBACK=JRGB) END IF END DO ! ! IMAT = Current material ! IMAT = 1 ! ! Update "Current Material" group box ! CALL V3ShowMaterial(IMAT) ! CALL V3DialogShow() ! ! Move focus to "Modify" checkbox column ! (Note: Must do this AFTER displaying dialog. ! Linux version crashes if set before dialog is visible.) ! CALL WGridSetCell(IDF_GRID1,2,IMAT) ! DO CALL WMessage(ITYPE,MESSAGE) SELECT CASE (ITYPE) ! ! Button press ! CASE (PushButton) SELECT CASE (MESSAGE%VALUE1) CASE (IDOK) CALL WDialogHide() DO JMAT = 1,NMAT CALL W3dMaterial(IMATN(JMAT),IRGB(JMAT),SHINE(JMAT),GLOSS(JMAT)) END DO ! CALL V3Display(.TRUE.) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) EXIT CASE (IDCANCEL) EXIT CASE (IDF_APPLY) DO JMAT = 1,NMAT CALL W3dMaterial(IMATN(JMAT),IRGB(JMAT),SHINE(JMAT),GLOSS(JMAT)) END DO ! CALL V3Display(.TRUE.) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) CHANGED = .TRUE. CALL WDialogFieldState(IDF_APPLY,Disabled) CASE (IDF_COLOUR) JRGB = IRGB(IMAT) WRITE(CMATNUM,'(I10)') IMAT CALL ILocateString(CMATNUM,I1,I2) CALL WSelectColour(JRGB,'Material '//CMATNUM(I1:I2)) IF (WInfoDialog(ExitButtonCommon)==CommonOK) THEN IRGB(IMAT) = JRGB CALL V3ShowMaterial(IMAT) CHANGED = .TRUE. CALL WDialogFieldState(IDF_APPLY,Enabled) END IF ! CASE (IDHELP) ! CALL V3Help(5) END SELECT ! ! Change material ? ! CASE (FieldChanged) IF (MESSAGE%VALUE2==IDF_GRID1) THEN CALL WGridPos(MESSAGE%Y,IC2,IR2) IF (IC2==1) THEN CALL WGridSetCell(IDF_GRID1,2,IR2) IF (IMAT==IR2) THEN CALL WGridPutCellCheckbox(IDF_GRID1,2,IMAT,Enabled) ELSE CALL WGridPutCellCheckbox(IDF_GRID1,2,IMAT,Disabled) IMAT = IR2 CALL WGridPutCellCheckbox(IDF_GRID1,2,IMAT,Enabled) CALL V3ShowMaterial(IMAT) END IF ELSE IF (MESSAGE%VALUE1==IDF_GRID1) THEN CALL WGridPos(MESSAGE%X,IC1,IR1) IF (IC1==2.AND.IC2==2.AND.IR1==IR2) THEN IF (IMAT==IR2) THEN CALL WGridPutCellCheckbox(IDF_GRID1,2,IMAT,Enabled) ELSE CALL WGridPutCellCheckbox(IDF_GRID1,2,IMAT,Disabled) IMAT = IR2 CALL V3ShowMaterial(IMAT) END IF END IF END IF ELSE IF (MESSAGE%VALUE1==IDF_SHINE.AND. & MESSAGE%VALUE2==IDF_SHINE) THEN CALL WDialogGetTrackbar(IDF_SHINE,ISHINE) SHINE(IMAT) = ISHINE/100. CALL WDialogPutReal(IDF_SHINE2,SHINE(IMAT),'(F4.2)') CHANGED = .TRUE. CALL WDialogFieldState(IDF_APPLY,Enabled) ELSE IF (MESSAGE%VALUE1==IDF_GLOSS.AND. & MESSAGE%VALUE2==IDF_GLOSS) THEN CALL WDialogGetTrackbar(IDF_GLOSS,IGLOSS) GLOSS(IMAT) = IGLOSS/100. CALL WDialogPutReal(IDF_GLOSS2,GLOSS(IMAT),'(F4.2)') CHANGED = .TRUE. CALL WDialogFieldState(IDF_APPLY,Enabled) END IF ! ! Maintain display ! CASE (Expose) CALL ViewPos(ViewAngle) CALL ShowModel(JHAND1,ITYPIMAGE) ! CALL V3Display(.TRUE.) END SELECT END DO ! CALL WDialogUnload() DEALLOCATE(IMATN) DEALLOCATE(IRGB) DEALLOCATE(SHINE) DEALLOCATE(GLOSS) RETURN END SUBROUTINE V3Materials ! !****************************************************************************** ! SUBROUTINE V3ShowMaterial(IMAT) USE WINTERACTER ! USE RESID USE BLKMAT INCLUDE 'd.inc' ! INTEGER, INTENT(IN) :: IMAT INTEGER ISHINE,IGLOSS,IR,IG,IB ! CALL WGridPutCellCheckbox(IDF_GRID1,2,IMAT,Enabled) CALL WGridColourCell(IDF_GRID1,1,IMAT,RGBBACK=IRGB(IMAT)) CALL WRGBsplit(IRGB(IMAT),IR,IG,IB) CALL WDialogPutInteger(IDF_RED ,IR) CALL WDialogPutInteger(IDF_GREEN,IG) CALL WDialogPutInteger(IDF_BLUE ,IB) CALL WDialogPutReal(IDF_SHINE2,SHINE(IMAT),'(F4.2)') CALL WDialogPutReal(IDF_GLOSS2,GLOSS(IMAT),'(F4.2)') ISHINE = INT(SHINE(IMAT)*100.) CALL WDialogPutTrackbar(IDF_SHINE,ISHINE) IGLOSS = INT(GLOSS(IMAT)*100.) CALL WDialogPutTrackbar(IDF_GLOSS,IGLOSS) RETURN END SUBROUTINE V3ShowMaterial ! !****************************************************************************** ! SUBROUTINE V3DialogShow() ! ! Display current dialog at top left corner of model view window ! USE WINTERACTER INCLUDE 'd.inc' INTEGER IXWIN,IYWIN ! CALL WindowSelect(IHVIEWWIN) IXWIN = WInfoWindow(ClientXPos) IYWIN = WInfoWindow(ClientYPos) ! CALL WindowSelect(0) CALL WDialogShow(IXWIN,IYWIN,ITYPE=SemiModeless) RETURN END SUBROUTINE V3DialogShow SUBROUTINE GETVSCAL(VSCALESV) USE WINTERACTER INCLUDE 'd.inc' call wdialogload(IDD_VSCAL) ierr=infoerror(1) CALL WDialogSelect(IDD_VSCAL) ierr=infoerror(1) CALL WDialogPutReal(IDF_REAL1,VSCALESV) CALL WDialogShow(-1,-1,0,Modal) ierr=infoerror(1) do IF (WInfoDialog(ExitButton) .EQ. IDOK) THEN call wdialogGetReal(IDF_REAL1,VSCALESV) RETURN else return endif enddo RETURN END