Code archives/Graphics/Perspective correction to Texture 10.7.2005 !
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
this is a little tool to make a texture from a foto like windows,doors,posters,painting,tiles and so on ... Copy/Paste/Build and Run ! Handling: 1. select a image 2. select 4 points clock wise , fine tune 3. move help point for bezier interpolation 4. select texture size 5. blending x y 6. save image simple navigate backwards and forewards after save you can turn back and save the image in another size ;-) | |||||
'Perspektiven Korrektur zu Texture , (C) Markus Rauch 2005 'Der Quelltext ist frei , jedoch möchte ich nicht das daraus 'ein kommerzielles Produkt gemacht wird ! 'Also mit diesem Quelltext meine ich , was ihr mit den Texturen macht ist mir egal ;-) 'Foto(perspective correction) to Texture , (C) M.Rauch 2005 'the source is free but you are not permitted to make 'a commercially product from it ! 'but you can do anything with your own created textures ;-) 'History: ' 4.7.2005 adding Bezier Interpolation (Hardcore:) ' 8.7.2005 Adding Vector Functions ' 9.7.2005 faster and better GUI with direct Zone access '10.7.2005 little fix that read all pixel in bezier area :) 'MR 10.07.2005 Strict Const dirsep:String="\" AppTitle="Foto (perspective correction) to Texture , M.Rauch 2005 , BlitzMax V1.10" Local a$,b$ Local width:Int=800,height:Int=600,depth:Int=0,herz:Int=72,gl=0 'Programm Command Line width 1280 height 1024 gl 1 For a$=EachIn AppArgs If b$="width" Then width=Int(a$) If b$="height" Then height=Int(a$) If b$="depth" Then depth=Int(a$) If b$="herz" Then herz=Int(a$) If b$="gl" Then gl=True b$=a$ Next If gl Then SetGraphicsDriver GLMax2DDriver() If GraphicsModeExists(width,height,depth,herz)=True Then Graphics width,height,depth,herz Else Graphics 640,480 EndIf 'Local mfont:TImageFont=LoadImageFont("TAHOMA.TTF",14) ':-( 'Local mfont:TImageFont=LoadImageFont("C:\WINDOWS\Fonts\TAHOMA.TTF",14) '!? 'SetImageFont mfont SetMaskColor(255,0,255) Global fy=16 '---------------------------------------------------------------------- 'Zones Type TZone Field Mode:Int 'Wo die Zone angezeigt werden soll , 0=immer anzeigen Field Caption$ Field img:TImage Field Visible:Int Field x1:Int 'Pos Field y1:Int Field w:Int 'Breite Field h:Int 'Höhe Field Tag:String Field TagFloat:Float 'Zum merken von Werten Field Checkbox:Int '0 1 Field Checked:Int '0 1 Field SliderX:Int '0 1 Field SliderXValue:Float Field SliderXMin:Float Field SliderXMax:Float Field SliderY:Int '0 1 Field SliderYValue:Float Field SliderYMin:Float Field SliderYMax:Float Field wi:Int 'Winkel für blinkende Farbe Function Create:TZone() Local I:TZone=New TZone Return I End Function End Type Global Zonen:TList=CreateList() Const cZoneModeAll:Int=0 Const cZoneModeNormal:Int=1 Const cZoneModeTextureSize:Int=2 Const cZoneModeSelectPoints:Int=3 Const cZoneModeSelectPointsBez:Int=4 Const cZoneModeBlend:Int=5 Global ZoneMode:Int=cZoneModeAll Global cZoneWeiter:TZone Global cZoneZurueck:TZone Global cZoneTextureSizeX:TZone Global cZoneTextureSizeY:TZone Global cZoneSelectScale1:TZone Global cZoneSelectScale2:TZone Global cZoneSelectScale3:TZone Global cZoneSelectScale4:TZone Global cZoneBlendX:TZone Global cZoneBlendY:TZone Global cZoneBlendRange1:TZone Global cZoneBlendRange2:TZone Global cZoneBlendRange3:TZone Global cZoneBlendRange4:TZone Global cZoneBlendRange5:TZone Global cZoneBlendRange6:TZone Local ox,oy,oxx,oyy,osp,oxm,oym osp=4 oyy=32 ox=0 oy=0 oxx=32 'Incbin "Images\PfeilL.bmp" 'Incbin "Images\PfeilR.bmp" '--- All cZoneZurueck=ZoneNew(cZoneModeAll,"<<<","Incbin::Images\PfeilL.bmp",ox,oy,oxx,oyy) ox=ox+oxx+osp cZoneWeiter=ZoneNew(cZoneModeAll,">>>","Incbin::Images\PfeilR.bmp",ox,oy,oxx,oyy) ox=ox+oxx+osp oxm=ox '--- TextureSize ox=oxm cZoneTextureSizeX=ZoneNew(cZoneModeTextureSize,"X","",ox,oy,oxx,oyy) ox=ox+oxx+osp cZoneTextureSizeY=ZoneNew(cZoneModeTextureSize,"Y","",ox,oy,oxx,oyy) ox=ox+oxx+osp '--- SelectPoints ox=oxm cZoneSelectScale1=ZoneNew(cZoneModeSelectPoints,"1x","",ox,oy,oxx,oyy) ox=ox+oxx+osp cZoneSelectScale2=ZoneNew(cZoneModeSelectPoints,"2x","",ox,oy,oxx,oyy) ox=ox+oxx+osp cZoneSelectScale3=ZoneNew(cZoneModeSelectPoints,"3x","",ox,oy,oxx,oyy) ox=ox+oxx+osp cZoneSelectScale4=ZoneNew(cZoneModeSelectPoints,"4x","",ox,oy,oxx,oyy) ox=ox+oxx+osp '--- Blend ox=oxm cZoneBlendX=ZoneNew(cZoneModeBlend,"X","",ox,oy,oxx,oyy) ZoneAsCheckbox cZoneBlendX ox=ox+oxx+osp cZoneBlendY=ZoneNew(cZoneModeBlend,"Y","",ox,oy,oxx,oyy) ZoneAsCheckbox cZoneBlendY ox=ox+oxx+osp cZoneBlendRange1=ZoneNew(cZoneModeBlend,"R1","",ox,oy,oxx,oyy) ZoneAsCheckbox cZoneBlendRange1 ox=ox+oxx+osp cZoneBlendRange2=ZoneNew(cZoneModeBlend,"R2","",ox,oy,oxx,oyy) ZoneAsCheckbox cZoneBlendRange2,1 ox=ox+oxx+osp cZoneBlendRange3=ZoneNew(cZoneModeBlend,"R3","",ox,oy,oxx,oyy) ZoneAsCheckbox cZoneBlendRange3 ox=ox+oxx+osp cZoneBlendRange4=ZoneNew(cZoneModeBlend,"R4","",ox,oy,oxx,oyy) ZoneAsCheckbox cZoneBlendRange4 ox=ox+oxx+osp cZoneBlendRange5=ZoneNew(cZoneModeBlend,"R5","",ox,oy,oxx,oyy) ZoneAsCheckbox cZoneBlendRange5 ox=ox+oxx+osp cZoneBlendRange6=ZoneNew(cZoneModeBlend,"R6","",ox,oy,oxx,oyy) ZoneAsCheckbox cZoneBlendRange6 ox=ox+oxx+osp cZoneBlendRange1.TagFloat=0.01 cZoneBlendRange2.TagFloat=0.025 cZoneBlendRange3.TagFloat=0.05 cZoneBlendRange4.TagFloat=0.10 cZoneBlendRange5.TagFloat=0.25 cZoneBlendRange6.TagFloat=0.50 '---------------------------------------------------------------------- Type TV3D Field x:Float Field y:Float Field z:Float Function Create:TV3D() Local T:TV3D=New TV3D Return T End Function Method Set(x:Float,y:Float,z:Float=0) self.x=x self.y=y self.z=z End Method Method Clr() self.x=0 self.y=0 self.z=0 End Method End Type Global mx:Float[4,4] 'Matrix Global mx1:Float[4,4] 'Matrix1 Global mx2:Float[4,4] 'Matrix2 '---------------------------------------------------------------------- MainLoop EndGraphics() End '---------------------------------------------------------------------- Function MainLoop() '------------------------- '1.DateiDialog '2.Bild Laden '3.Bild Zeigen , mit der Maus 4 Punkte markieren und als Linien anzeigen mit Alpha '4.Texture Größe wählen '5.Bild umrechnen '6.Bild anzeigen als Tile '7.Bild anzeigen als Tile zum überblenden '8.Bild speichern '9.Bild nochmal zeigen '------------------------- Const mode_LoadImageDialog =1 Const mode_LoadImage =2 Const mode_SelectPoints =3 Const mode_SelectPointsBez =4 Const mode_TextureSize =5 Const mode_TransformImage =6 Const mode_ShowTiledImage =7 Const mode_ShowBlend =8 Const mode_SaveAsDialog =9 Const mode_ShowAfterSave =10 DebugLog "FUNC MainLoop" SetClsColor 0,0,0 SetBlend ALPHABLEND 'SetLineWidth 3 Local mode=mode_LoadImageDialog Local pix:TPixmap Local pix2:TImage Local pix3:TImage 'für Blend Local filename:String Local filenamesave:String Local p:TV3D=TV3D.Create() 'für Plot der Bezier Splines Local p1:TV3D=TV3D.Create() Local p2:TV3D=TV3D.Create() Local p3:TV3D=TV3D.Create() Local p4:TV3D=TV3D.Create() 'Zwichenpunkte für Bezier4 Local p1a:TV3D=TV3D.Create() Local p1b:TV3D=TV3D.Create() Local p2a:TV3D=TV3D.Create() Local p2b:TV3D=TV3D.Create() Local p3a:TV3D=TV3D.Create() Local p3b:TV3D=TV3D.Create() Local p4a:TV3D=TV3D.Create() Local p4b:TV3D=TV3D.Create() Local m:TV3D=TV3D.Create() 'Maus Local txx:Float=256 Local txy:Float=256 Local pointnr:Int=1 Local pointnrf:Int=0 Local pointnrb:Int=0 Local mu:Float=0 'für Bezier4 Splines Local mwheel:Int,md1:Int,mu1:Int,md2:Int,mu2:Int,md3:Int,mu3:Int 'Maus Abfrage Local ret:Int Local w:Double Local scale:Int=1 Local db:Int=0 Local BlendX:Int=0 Local BlendY:Int=0 Local BlendRange:Float=0 Local t1 'Timer für konstante Frame Rate Local Zone:TZone=Null ZoneMode=cZoneModeNormal While Not KeyHit(KEY_ESCAPE) SetViewport 0,0,GraphicsWidth(),GraphicsHeight() Cls t1=MilliSecs() '------------------------------------------------------------- Maus Abfrage ! m.Set MouseX(),MouseY() mwheel=MouseZ() 'Speed() mu1=0;If md1=1 Then md1=2 If MouseDown(1)=True And md1=0 Then md1=1;mu1=0 If MouseDown(1)=False And md1=2 And mu1=0 Then md1=0;mu1=1 mu2=0;If md2=1 Then md2=2 If MouseDown(2)=True And md2=0 Then md2=1;mu2=0 If MouseDown(2)=False And md2=2 And mu2=0 Then md2=0;mu2=1 mu3=0;If md3=1 Then md3=2 If MouseDown(3)=True And md3=0 Then md3=1;mu3=0 If MouseDown(3)=False And md3=2 And mu3=0 Then md3=0;mu3=1 '-------------- Zone=ZoneShow(m,md1,md2,md3) Select mode '-------------------------------------------------------------------------------- Case mode_LoadImageDialog ZoneMode=cZoneModeNormal DebugLog "Bild auswählen in "+AppDir filename=RequestFile("Please select a image","Image jpg,jpeg,pcx,tga,bmp,gif,png:jpg,jpeg,pcx,tga,bmp,gif,png;All Files *.*:*",False) ',AppDir+"\") scheiße If Len(filename)=0 Then DebugLog "Kein Bild ausgewählt , ENDE" End Else mode=mode_LoadImage EndIf FlushMouse FlushKeys scale=1 '-------------------------------------------------------------------------------- Case mode_LoadImage ZoneMode=cZoneModeNormal DebugLog "Bild laden" pix3=Null pix2=Null pix=Null pix=LoadPixmap(filename) ConvertPixmap pix,PF_RGB888 If scale>1 Then pix=ResizePixmap(pix,pix.width*scale,pix.height*scale) EndIf If pix.width>GraphicsWidth() Or pix.height>GraphicsHeight()-32 Then pix=ResizePixmap(pix,GraphicsWidth(),GraphicsHeight()-32) EndIf pointnr=1 pointnrf=0 pointnrb=0 p1.Set 0,0 p2.Set pix.width-1,0 p3.Set pix.width-1,pix.height-1 p4.Set 0,pix.height-1 mode=mode_SelectPoints DebugLog "ab jetzt Punkte wählen" '-------------------------------------------------------------------------------- Case mode_SelectPoints ZoneMode=cZoneModeSelectPoints 'Bei DrawPixMap , eine Pixmap muß ins Fenster passen sonnst kommt ein Fehler !!! SetAlpha 1.0 SetColor 255,255,255 If pix.width/scale*2<GraphicsWidth() And pix.height/scale*2<GraphicsHeight()-32 Then cZoneSelectScale2.Visible=1 Else cZoneSelectScale2.Visible=0 If pix.width/scale*3<GraphicsWidth() And pix.height/scale*3<GraphicsHeight()-32 Then cZoneSelectScale3.Visible=1 Else cZoneSelectScale3.Visible=0 If pix.width/scale*4<GraphicsWidth() And pix.height/scale*4<GraphicsHeight()-32 Then cZoneSelectScale4.Visible=1 Else cZoneSelectScale4.Visible=0 If cZoneSelectScale2.Visible=1 Then cZoneSelectScale1.Visible=1 DrawText "You can scale the image (before select the 4 points :)",32*6+4*6+10,16-TextHeight("Use,g")/2 Else cZoneSelectScale1.Visible=0 EndIf SetOrigin 0,32 m.y=m.y-32 DrawPixmap pix,0,32 'Original Bild SetAlpha 0.5 SetColor 0,191.0+Sin(w)*64.0,255 VLine p1,p2,False VLine p2,p3,False VLine p3,p4,False VLine p4,p1,False If Zone=Null Then SetAlpha 1 'Zwischenpunkte SetColor 128,128,128 Circle p1a,3 Circle p1b,3 Circle p2a,3 Circle p2b,3 Circle p3a,3 Circle p3b,3 Circle p4a,3 Circle p4b,3 If pointnrf=1 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p1,3 If pointnrf=2 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p2,3 If pointnrf=3 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p3,3 If pointnrf=4 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p4,3 SetColor 255,255,0 Circle m,3 'Maus EndIf If (md1=1 And Zone=cZoneSelectScale1) Then scale=1;mode=mode_LoadImage If (md1=1 And Zone=cZoneSelectScale2) Then scale=2;mode=mode_LoadImage If (md1=1 And Zone=cZoneSelectScale3) Then scale=3;mode=mode_LoadImage If (md1=1 And Zone=cZoneSelectScale4) Then scale=4;mode=mode_LoadImage If md2=1 Then mode=mode_LoadImage EndIf If Zone=Null Then Select pointnr Case 1 p1.x=m.x p1.y=m.y Case 2 p2.x=m.x p2.y=m.y Case 3 p3.x=m.x p3.y=m.y Case 4 p4.x=m.x p4.y=m.y End Select EndIf 'Nicht in Zone If md1=1 And Zone=Null Then Select pointnr Case 1 pointnr=2 Case 2 pointnr=3 Case 3 pointnr=4 Case 4 pointnr=5 Case 5 'ab jetzt fein Tuning an den Punkten End Select EndIf 'Punkt auswählen If md1=1 And pointnr=5 And Zone=Null Then pointnrf=0 If VEntXY(m,p1)<5 Then pointnrf=1 If VEntXY(m,p2)<5 Then pointnrf=2 If VEntXY(m,p3)<5 Then pointnrf=3 If VEntXY(m,p4)<5 Then pointnrf=4 EndIf 'bewegen mit gedrückter Maustaste If md1=2 And pointnr=5 And Zone=Null Then Select pointnrf 'fein tuning Case 1 p1.x=m.x p1.y=m.y Case 2 p2.x=m.x p2.y=m.y Case 3 p3.x=m.x p3.y=m.y Case 4 p4.x=m.x p4.y=m.y End Select EndIf If KeyHit(KEY_LEFT)>0 Then Select pointnrf 'fein tuning Case 1 p1.x=p1.x-1 Case 2 p2.x=p2.x-1 Case 3 p3.x=p3.x-1 Case 4 p4.x=p4.x-1 End Select EndIf If KeyHit(KEY_RIGHT)>0 Then Select pointnrf 'fein tuning Case 1 p1.x=p1.x+1 Case 2 p2.x=p2.x+1 Case 3 p3.x=p3.x+1 Case 4 p4.x=p4.x+1 End Select EndIf If KeyHit(KEY_UP)>0 Then Select pointnrf 'fein tuning Case 1 p1.y=p1.y-1 Case 2 p2.y=p2.y-1 Case 3 p3.y=p3.y-1 Case 4 p4.y=p4.y-1 End Select EndIf If KeyHit(KEY_DOWN)>0 Then Select pointnrf 'fein tuning Case 1 p1.y=p1.y+1 Case 2 p2.y=p2.y+1 Case 3 p3.y=p3.y+1 Case 4 p4.y=p4.y+1 End Select EndIf '-------------- Limit Points ! Limit p1.x,0,pix.width-1 Limit p2.x,0,pix.width-1 Limit p3.x,0,pix.width-1 Limit p4.x,0,pix.width-1 Limit p1.y,0,pix.height-1 Limit p2.y,0,pix.height-1 Limit p3.y,0,pix.height-1 Limit p4.y,0,pix.height-1 '-------------- Berechne zwischen Punkte Zwischenpunkt p1a,p1b,p1,p2 Zwischenpunkt p2a,p2b,p2,p3 Zwischenpunkt p3a,p3b,p3,p4 Zwischenpunkt p4a,p4b,p4,p1 pointnrb=0 '-------------- SetOrigin 0,0 m.y=m.y+32 '-------------------------------------------------------------------------------- Case mode_SelectPointsBez ZoneMode=cZoneModeSelectPointsBez 'Bei DrawPixMap , eine Pixmap muß ins Fenster passen sonnst kommt ein Fehler !!! SetAlpha 1.0 SetColor 255,255,255 DrawText "Move Bezier Points",32*6+4*6+10,16-TextHeight("Move")/2 'SetViewport 0,32,GraphicsWidth(),GraphicsHeight()-32 SetOrigin 0,32 m.y=m.y-32 DrawPixmap pix,0,32 'Original Bild SetAlpha 0.5 db=0 For mu=0 To 1 Step 0.025 SetColor 255*db,255*db,255*db db=1-db Bezier4(p,p1,p1a,p1b,p2,mu) Circle p,2 Bezier4(p,p2,p2a,p2b,p3,mu) Circle p,2 Bezier4(p,p3,p3a,p3b,p4,mu) Circle p,2 Bezier4(p,p4,p4a,p4b,p1,mu) Circle p,2 Next If Zone=Null Then SetAlpha 1 'Zwischenpunkte If pointnrb=1 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p1a,3 If pointnrb=2 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p1b,3 If pointnrb=3 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p2a,3 If pointnrb=4 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p2b,3 If pointnrb=5 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p3a,3 If pointnrb=6 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p3b,3 If pointnrb=7 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p4a,3 If pointnrb=8 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p4b,3 'Normale Punkte If pointnrb=9 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p1,3 If pointnrb=10 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p2,3 If pointnrb=11 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p3,3 If pointnrb=12 Then SetColor 0,255,0 Else SetColor 255,0,0 CircleB p4,3 SetColor 255,255,0 Circle m,3 EndIf 'Zone If md2=1 Then 'Zurück mode=mode_SelectPoints EndIf 'Punkt auswählen If md1=1 And Zone=Null Then pointnrb=0 If VEntXY(m,p1a)<5 Then pointnrb=1 If VEntXY(m,p1b)<5 Then pointnrb=2 If VEntXY(m,p2a)<5 Then pointnrb=3 If VEntXY(m,p2b)<5 Then pointnrb=4 If VEntXY(m,p3a)<5 Then pointnrb=5 If VEntXY(m,p3b)<5 Then pointnrb=6 If VEntXY(m,p4a)<5 Then pointnrb=7 If VEntXY(m,p4b)<5 Then pointnrb=8 '.... If VEntXY(m,p1)<5 Then pointnrb=9 If VEntXY(m,p2)<5 Then pointnrb=10 If VEntXY(m,p3)<5 Then pointnrb=11 If VEntXY(m,p4)<5 Then pointnrb=12 EndIf 'bewegen mit gedrückter Maustaste If md1=2 And Zone=Null Then Select pointnrb Case 1 p1a.x=m.x p1a.y=m.y Case 2 p1b.x=m.x p1b.y=m.y Case 3 p2a.x=m.x p2a.y=m.y Case 4 p2b.x=m.x p2b.y=m.y Case 5 p3a.x=m.x p3a.y=m.y Case 6 p3b.x=m.x p3b.y=m.y Case 7 p4a.x=m.x p4a.y=m.y Case 8 p4b.x=m.x p4b.y=m.y Case 9 '. p1.x=m.x p1.y=m.y Case 10 '.. p2.x=m.x p2.y=m.y Case 11 '... p3.x=m.x p3.y=m.y Case 12 '.... p4.x=m.x p4.y=m.y End Select EndIf '-------------- SetOrigin 0,0 m.y=m.y+32 '-------------------------------------------------------------------------------- Case mode_TextureSize ZoneMode=cZoneModeTextureSize SetViewport 0,32,GraphicsWidth(),GraphicsHeight()-32 SetOrigin 0,32 If KeyHit(KEY_X)>0 Or (md1=1 And Zone=cZoneTextureSizeX) Then txx=txx*2 ; txx=txx Mod 4096;If txx=0 Or txx/2=GraphicsWidth() Then txx=8 If KeyHit(KEY_Y)>0 Or (md1=1 And Zone=cZoneTextureSizeY) Then txy=txy*2 ; txy=txy Mod 4096;If txy=0 Or txy/2=GraphicsHeight() Then txy=8 'ToDo ... mit Shift rückwärts ... XY If txx>GraphicsWidth() Then txx=GraphicsWidth() If txy>GraphicsHeight() Then txy=GraphicsHeight() SetAlpha 0.5 SetColor 200,255,200 DrawRect 0,0,txx,txy SetAlpha 1.0 SetColor 255,255,255 DrawText "Output Texture Size , Press X or Y Key",10,fy DrawText "X="+Int(txx)+" x Y="+Int(txy),10,fy*2 SetOrigin 0,0 '-------------------------------------------------------------------------------- Case mode_TransformImage ZoneMode=cZoneModeNormal DebugLog "umrechnen" pix2=TransformImage(pix,txx,txy,p1,p2,p3,p4,p1a,p1b,p2a,p2b,p3a,p3b,p4a,p4b) 'pix2=LoadImage("Images\Karo.bmp") 'Zum testen pix3=CopyImage(pix2) mode=mode_ShowTiledImage '-------------------------------------------------------------------------------- Case mode_ShowTiledImage ZoneMode=cZoneModeNormal SetAlpha 1.0 SetColor 255,255,255 DrawText "Ready",32*6+4*6+10,16-TextHeight("R")/2 SetViewport 0,32,GraphicsWidth(),GraphicsHeight()-32 SetOrigin 0,32 SetAlpha 1.0 SetColor 255,255,255 TileImage pix2,0,0 'Ergebnis SetOrigin 0,0 '-------------------------------------------------------------------------------- Case mode_ShowBlend ZoneMode=cZoneModeBlend SetAlpha 1.0 SetColor 255,255,255 DrawText "Blending",32*10+4*10+10,16-TextHeight("B")/2 SetViewport 0,32,GraphicsWidth(),GraphicsHeight()-32 SetOrigin 0,32 'XY übergänge berechnen (2 Pass sonnst überkreuzt sich das) If md1=1 Then If Zone=cZoneBlendRange1 Or Zone=cZoneBlendRange2 Or Zone=cZoneBlendRange3 Or Zone=cZoneBlendRange4 Or Zone=cZoneBlendRange5 Or Zone=cZoneBlendRange6 Then BlendX=cZoneBlendX.Checked BlendY=cZoneBlendY.Checked BlendRange=Zone.TagFloat If Zone<>cZoneBlendRange1 Then cZoneBlendRange1.Checked=0 If Zone<>cZoneBlendRange2 Then cZoneBlendRange2.Checked=0 If Zone<>cZoneBlendRange3 Then cZoneBlendRange3.Checked=0 If Zone<>cZoneBlendRange4 Then cZoneBlendRange4.Checked=0 If Zone<>cZoneBlendRange5 Then cZoneBlendRange5.Checked=0 If Zone<>cZoneBlendRange6 Then cZoneBlendRange6.Checked=0 pix3=BlendImage(BlendImage(pix2,BlendX,0,BlendRange),0,BlendY,BlendRange) EndIf If Zone=cZoneBlendX Or Zone=cZoneBlendY Then BlendX=cZoneBlendX.Checked BlendY=cZoneBlendY.Checked BlendRange=0 If cZoneBlendRange1.Checked=1 Then BlendRange=cZoneBlendRange1.TagFloat If cZoneBlendRange2.Checked=1 Then BlendRange=cZoneBlendRange2.TagFloat If cZoneBlendRange3.Checked=1 Then BlendRange=cZoneBlendRange3.TagFloat If cZoneBlendRange4.Checked=1 Then BlendRange=cZoneBlendRange4.TagFloat If cZoneBlendRange5.Checked=1 Then BlendRange=cZoneBlendRange5.TagFloat If cZoneBlendRange6.Checked=1 Then BlendRange=cZoneBlendRange6.TagFloat pix3=BlendImage(BlendImage(pix2,BlendX,0,BlendRange),0,BlendY,BlendRange) EndIf EndIf 'click SetAlpha 1.0 SetColor 255,255,255 TileImage pix3,0,0 'Ergebnis SetOrigin 0,0 '-------------------------------------------------------------------------------- Case mode_SaveAsDialog ZoneMode=cZoneModeNormal DebugLog "Save As ..." filenamesave=RequestFile("Texture save as ...","Image png:png",True) If Len(filenamesave)=0 Then DebugLog "Kein Dateiname zum speichern ausgewählt" 'abbruch dann Bild wieder zeigen mode=mode_ShowBlend Else DebugLog "Bild speichern "+filenamesave Local map:TPixmap map=LockImage(pix3) ret=SavePixmapPNG(map,filenamesave) UnlockImage pix3 DebugLog ret mode=mode_ShowAfterSave EndIf 'FlushMouse FlushKeys '-------------------------------------------------------------------------------- Case mode_ShowAfterSave ZoneMode=cZoneModeNormal SetViewport 0,32,GraphicsWidth(),GraphicsHeight()-32 SetOrigin 0,32 SetAlpha 1.0 SetColor 255,255,255 TileImage pix3,0,0 'Ergebnis SetAlpha 0.5 SetColor 255,255,255 DrawText "Texture saved as",10,fy DrawText filenamesave,10,fy*2 SetOrigin 0,0 End Select 'Modus '-------------- SetViewport 0,0,GraphicsWidth(),GraphicsHeight() If KeyHit(KEY_SPACE) Or (md1=1 And Zone=cZoneWeiter) Then 'Weiter zum nächsten Schritt Select mode Case mode_SelectPoints ; mode=mode+1 Case mode_SelectPointsBez; mode=mode+1 Case mode_TextureSize ; mode=mode+1 Case mode_ShowTiledImage ; mode=mode+1 Case mode_ShowBlend ; mode=mode+1 Case mode_ShowAfterSave ; mode=mode_LoadImageDialog End Select EndIf '-------------- If KeyHit(KEY_BACKSPACE) Or (md1=1 And Zone=cZoneZurueck) Then 'Zurück zum letzten Schritt Select mode Case mode_SelectPoints ; mode=mode_LoadImageDialog 'Datei Dialog Case mode_SelectPointsBez; mode=mode_SelectPoints 'Punkte verschieben Case mode_TextureSize ; mode=mode_SelectPointsBez 'Bezier Punkte verschieben Case mode_ShowTiledImage ; mode=mode_TextureSize Case mode_ShowBlend ; mode=mode_ShowTiledImage Case mode_ShowAfterSave ; mode=mode_ShowBlend 'nochmal anzeigen End Select EndIf '-------------- Memory :) 'SetAlpha 1.0 'SetColor 255,255,255 'DrawText "MemAlloced="+MemAlloced(),GraphicsWidth()-200,16-TextHeight("Mem")/2 '-------------- w=w+0.5;If w>360 Then w=w-360 '-------------- FlushMem While Abs(t1-MilliSecs())<10 Wend Flip Wend End Function '---------------------------------------------------------------------- Function Intp:Float(y1:Float,y2:Float,mu:Float) Return y1+(y2-y1)*mu End Function '---------------------------------------------------------------------- Function Bezier4(p:TV3D Var,p1:TV3D,p2:TV3D,p3:TV3D,p4:TV3D,mu:Float) 'MR 01.07.2005 'Four control point Bezier interpolation 'mu ranges from 0 To 1, start To End of curve Local mum1:Float,mum13:Float,mu3:Float mum1 = 1.0 - mu mum13 = mum1 * mum1 * mum1 mu3 = mu * mu * mu p.x = mum13*p1.x + 3.0*mu*mum1*mum1*p2.x + 3.0*mu*mu*mum1*p3.x + mu3*p4.x p.y = mum13*p1.y + 3.0*mu*mum1*mum1*p2.y + 3.0*mu*mu*mum1*p3.y + mu3*p4.y p.z = mum13*p1.z + 3.0*mu*mum1*mum1*p2.z + 3.0*mu*mu*mum1*p3.z + mu3*p4.z End Function '---------------------------------------------------------------------- Function Circle(p:TV3D,r) DrawOval p.x-r,p.y-r,r*2,r*2 End Function Function CircleB(p:TV3D,r) Local red,green,blue GetColor red,green,blue SetColor 0,0,0 DrawOval p.x-r-2,p.y-r-2,r*2+4,r*2+4 SetColor red,green,blue DrawOval p.x-r,p.y-r,r*2,r*2 End Function '################################################################################################## Function TransformImage:TImage(pix:TPixmap,txx:Float,txy:Float,p1:TV3D,p2:TV3D,p3:TV3D,p4:TV3D,p1a:TV3D,p1b:TV3D,p2a:TV3D,p2b:TV3D,p3a:TV3D,p3b:TV3D,p4a:TV3D,p4b:TV3D) 'pix=original bild 'txx,txy Texture größe 'p1,p2,p3,p4 Punkte im Original Bild (ca. Trapez) 'p a&b sind die Hilfspunkte (Bezier Help Points) Local x:Float Local y:Float Local pix2:TImage Local map:TPixmap '------------------------- Local mu:Float=0,p:TV3D=TV3D.Create(),db:Int=0 'Für außen Curven x=0 y=0 Local Oben:TV3D=TV3D.Create() Local Unten:TV3D=TV3D.Create() Local Links:TV3D=TV3D.Create() Local Rechts:TV3D=TV3D.Create() Local xx:Float,yy:Float 'Pixel im Quellbild Local zz:Float 'höhe Local col:Int 'Farbe Local BlendX:Float Local BlendXInv:Float Local BlendY:Float Local BlendYInv:Float '>>> DrawPixmap pix,0,0 '<<< pix2=CreateImage(txx,txy,PF_RGB888) map=LockImage(pix2) txx=txx-1 'weil ja von 0 an in die Texture geschrieben wird , z.B. 0 bis (256-1) txy=txy-1 For x=0 To txx For y=0 To txy BlendX=x/txx '0-1 BlendY=y/txy '0-1 BlendXInv=1.0-BlendX '1-0 BlendYInv=1.0-BlendY '1-0 Bezier4 Oben ,p1,p1a,p1b,p2,BlendX Bezier4 Unten,p4,p3b,p3a,p3,BlendX Bezier4 Links ,p1,p4b,p4a,p4,BlendY Bezier4 Rechts,p2,p2a,p2b,p3,BlendY xx=(Links.x*BlendXInv + Rechts.x*BlendX) yy=( Oben.y*BlendYInv + Unten.y*BlendY) Limit xx,0,pix.width-1 Limit yy,0,pix.height-1 col=ReadPixel(pix,xx,yy) WritePixel map,x,y,col '>>> Color 255,255,0 VPlot Oben VPlot Unten VPlot Links VPlot Rechts If (x Mod 8)=0 Or (y Mod 8)=0 Then Color 255,zz,zz 'welcher Bereich ausgelesen wird Plot xx,yy EndIf '<<< Next Next UnlockImage pix2 '------------------------ db=0 For mu=0 To 1 Step 0.025 SetColor 255*db,255*db,255*db db=1-db Bezier4(p,p1,p1a,p1b,p2,mu) Circle p,2 Bezier4(p,p2,p2a,p2b,p3,mu) Circle p,2 Bezier4(p,p3,p3a,p3b,p4,mu) Circle p,2 Bezier4(p,p4,p4a,p4b,p1,mu) Circle p,2 Next '------------------------ '>>> SetAlpha 1.0 SetColor 255,255,255 DrawText "Press any Key",5,GraphicsHeight()-TextHeight("P")-5 Flip WaitKey '<<< '------------------------- Oben=Null Unten=Null Links=Null Rechts=Null Return pix2 End Function '################################################################################################## Function ZoneShow:TZone(Maus:TV3D,md1,md2,md3) Local Hit=0 Local x1,y1,x2,y2 Local Zone:TZone Local ZoneClick:TZone=Null For Zone=EachIn Zonen If Zone.Mode=ZoneMode Or Zone.Mode=0 Then If Zone.Visible=1 Then x1=Zone.X1 y1=Zone.Y1 x2=x1+Zone.w-1 y2=y1+Zone.h-1 'Testen ob Maus drüber ist If ((Maus.x>=x1 And Maus.x<=x2) And (Maus.y>=y1 And Maus.y<=y2)) Then ZoneClick=Zone Hit=True Zone.wi=Zone.wi+1;If Zone.wi>180 Then Zone.wi=Zone.wi-180 Else Hit=False Zone.wi=0 EndIf 'Wenn Maus drüber dann Hintergrund füllen If Hit=True Then SetAlpha 0.5+Sin(Zone.wi)/2.0 SetColor 0,128,0;DrawRect Zone.x1,Zone.y1,Zone.w,Zone.h EndIf 'Wenn Checkbox und gesetzt dann markieren If Zone.Checkbox=1 Then If Hit=True And md1=1 Then Zone.Checked=1-Zone.Checked If Zone.Checked=1 Then SetAlpha 0.75 SetColor 128,128,255;DrawRect Zone.x1,Zone.y1,Zone.w,Zone.h EndIf EndIf 'Bild zeigen wenn da SetAlpha 1 SetColor 255,255,255 If Zone.img<>Null Then DrawImage Zone.img,Zone.X1,Zone.Y1 'Wenn Maus drüber dann Rand zeigen in grün SetAlpha 1 If Hit=True Then SetColor 0,255,0 Else SetColor 128,128,128 mRect x1,y1,x2,y2 'wenn kein Bild hat dann Text zeigen If Zone.img=Null Then SetColor 255,255,255 Local t$ t$=Zone.Caption$ DrawText t$,x1 + Zone.w/2-TextWidth(t$)/2,y1 + Zone.h/2-TextHeight(t$)/2 ',True,True,255,255,255 EndIf 'kein Bild dann Caption EndIf 'Visible EndIf 'in Mode Or For All Next Return ZoneClick End Function '################################################################################################## Function ZoneNew:TZone(Mode,c$,image$,x,y,w,h) Local Zone:TZone=TZone.Create() Zone.Mode=Mode Zone.Caption=c$ Zone.Visible=1 Zone.x1=x Zone.y1=y Zone.w=w Zone.h=h Zone.Checkbox=0 Zone.Checked=0 Zone.SliderX=0 Zone.SliderXMin=0 Zone.SliderXMax=0 Zone.SliderXValue=0 Zone.SliderY=0 Zone.SliderYMin=0 Zone.SliderYMax=0 Zone.SliderYValue=0 If Len(image$)>0 Then Zone.img=LoadImage(image$,MASKEDIMAGE) Zonen.addlast Zone Return Zone End Function '################################################################################################## Function ZoneCaption(Zone:TZone,c$) Zone.Caption=c$ End Function '################################################################################################## Function ZoneAsCheckbox(Zone:TZone,Value:Int=0) Zone.Checkbox=1 If value Then Zone.Checked=1 Else Zone.Checked=0 EndIf End Function '################################################################################################## Function ZoneAsSliderX(Zone:TZone,Value:Float,ValueMin:Float=0,ValueMax:Float=100) Zone.SliderX=1 Zone.SliderXValue=Value Zone.SliderXMin=ValueMin Zone.SliderXMax=ValueMax End Function '################################################################################################## '-------------------------------- Function mRect(x1,y1,x2,y2) DrawLine x1,y1,x2,y1 'oben DrawLine x2,y1,x2,y2 'rechts DrawLine x1,y2,x2,y2 'unten DrawLine x1,y1,x1,y2 'links End Function '-------------------------------- Function Limit(a:Float Var,x:Int ,y:Int ) If a<x Then a=x If a>y Then a=y End Function '-------------------------------- Function CopyImage2:TImage(img:TImage) Local imgnew:TImage=CreateImage(ImageWidth(img),ImageHeight(img)) Local x:Int,y:Int Local map:TPixmap Local mapnew:TPixmap map=LockImage(img) 'Read mapnew=LockImage(imgnew) 'Write For x=0 To PixmapWidth(map)-1 For y=0 To PixmapHeight(map)-1 WritePixel mapnew,x,y,ReadPixel(map,x,y) Next Next UnlockImage img UnlockImage imgnew Return imgnew End Function '-------------------------------- Function CopyImage:TImage(Image:TImage) Local TempPixmap:TPixmap, NewImage:TImage TempPixmap = LockImage(Image) NewImage = LoadImage(TempPixmap,DYNAMICIMAGE) UnlockImage(Image) Return NewImage End Function '-------------------------------- Function BlendImage:TImage(img:TImage,BlendX,BlendY,BlendRange:Double) Local imgnew:TImage=CreateImage(ImageWidth(img),ImageHeight(img)) Local x:Double,y:Double'Pixel Local x2:Double,y2:Double'Pixel auf anderer Seite (Mirror) Local map:TPixmap 'original Bild Local mapnew:TPixmap 'ausgabe Bild Local ARGB:Int '32 Bit Alpha und Farbe Local Alpha1:Int 'Original Farbe Local Red1:Double Local Green1:Double Local Blue1:Double Local Alpha2:Int 'Farbe auf anderer Seite Local Red2:Double Local Green2:Double Local Blue2:Double Local Alpha3:Int 'Farbe gemischt Local Red3:Double Local Green3:Double Local Blue3:Double Local Blend:Double Blend=2.0 map=LockImage(img) 'Read mapnew=LockImage(imgnew) 'Write 'PixmapFormat Local RangeX:Int=0 'Rand Bereich außen in Pixel Local RangeY:Int=0 Local RangeXBlend:Double=0 Local RangeYBlend:Double=0 Local RangeBlend:Double=0 Local RangeXBlendInv:Double=0 Local RangeYBlendInv:Double=0 Local RangeBlendInv:Double=0 If BlendX Then RangeX=PixmapWidth(map)*BlendRange 'Rand errechnen If BlendY Then RangeY=PixmapHeight(map)*BlendRange For x=0 To PixmapWidth(map)-1 For y=0 To PixmapHeight(map)-1 ARGB=ReadPixel(map,x,y) If (x<RangeX Or x>(PixmapWidth(map)-1)-RangeX) Or (y<RangeY Or y>(PixmapHeight(map)-1)-RangeY) Then RangeXBlend=1.0 If RangeX>0 Then If x<RangeX Then RangeXBlend=X/RangeX If x>(PixmapWidth(map)-1)-RangeX Then RangeXBlend=((PixmapWidth(map)-1)-X)/RangeX EndIf RangeYBlend=1.0 If RangeY>0 Then If y<RangeY Then RangeYBlend=Y/RangeY If y>(PixmapHeight(map)-1)-RangeY Then RangeYBlend=((PixmapHeight(map)-1)-Y)/RangeY EndIf RangeBlend=(RangeXBlend+RangeYBlend)/2.0 RangeXBlendInv=1.0-RangeXBlend RangeYBlendInv=1.0-RangeYBlend RangeBlendInv=(RangeXBlendInv+RangeYBlendInv)/2.0 'andere Seite x2=x y2=y 'TEST If BlendX=1 Then x2=(PixmapWidth(map)-1)-x If BlendY=1 Then y2=(PixmapHeight(map)-1)-y';If BlendX=1 Then x2=y Alpha1=ARGB_Alpha(ARGB) Red1 =RangeBlend*Float(ARGB_Red(ARGB)) Green1=RangeBlend*Float(ARGB_Green(ARGB)) Blue1 =RangeBlend*Float(ARGB_Blue(ARGB)) ARGB=ReadPixel(map,x2,y2) Alpha2=ARGB_Alpha(ARGB) Red2 =RangeBlendInv*Float(ARGB_Red(ARGB)) Green2=RangeBlendInv*Float(ARGB_Green(ARGB)) Blue2 =RangeBlendInv*Float(ARGB_Blue(ARGB)) 'DebugStop Alpha3=Alpha1 Red3=(Red1+Red2) '/Blend Green3=(Green1+Green2) '/Blend Blue3=(Blue1+Blue2) '/Blend ARGB=ARGB_Color(Alpha3,Red3,Green3,Blue3) Else 'ARGB=0 'Test um den unberührten Bereich zu sehen EndIf WritePixel mapnew,x,y,ARGB Next Next UnlockImage img UnlockImage imgnew Return imgnew End Function '-------------------------------- Function ARGB_Alpha:Int(ARGB:Int) Return Int((ARGB & $FF000000:Int) / $1000000:Int) End Function Function ARGB_Red:Int(ARGB:Int) Return Int((ARGB & $00FF0000:Int) / $10000:Int) End Function Function ARGB_Green:Int(ARGB:Int) Return Int((ARGB & $0000FF00:Int) / $100:Int) End Function Function ARGB_Blue:Int(ARGB:Int) Return (ARGB & $000000FF:Int) End Function Function ARGB_Color:Int(Alpha:Int,Red:Int,Green:Int,Blue:Int) Return (Alpha*$1000000:Int+Red*$10000:Int+Green*$100:Int+Blue) End Function '-------------------------------- Function VNORMAL(p1:TV3D,p2:TV3D,p3:TV3D,n:TV3D Var) 'MR 09.07.2005 'Oberflächen Normale von einer Ebene mit 3 Punkten (Dreieck) Local a:TV3D=TV3D.Create() Local b:TV3D=TV3D.Create() VSUB p2,p1,a VSUB p3,p1,b VCROSS a,b,n a=Null b=Null VNORMALIZE n End Function '-------------------------------- Function VNORMALIZE(a:TV3D Var) 'MR 05.07.2005 'gibt Normvector zurück , aufpassen auf überlauf ! 'also gesamt Vector auf länge 1 bringen Local fa:Float fa = Sqr(VDOT(a, a)) If fa = 0 Then a.x = 0.0 a.y = 0.0 a.z = 0.0 Else fa = 1.0 / fa a.x = a.x * fa a.y = a.y * fa a.z = a.z * fa End If End Function '-------------------------------- Function VDOT:Float(a:TV3D, b:TV3D) 'MR 05.07.2005 'Dotprodukt - Skalarprodukt 'berechnet ein Skalarprodukt zweier Vectoren Return (a.x * b.x + a.y * b.y + a.z * b.z) End Function '-------------------------------- Function VCROSS(a:TV3D,b:TV3D,c:TV3D Var) 'MR 05.07.2005 'gibt Vectorprodukt zurück c.x = a.y * b.z - b.y * a.z c.y = a.z * b.x - b.z * a.x c.z = a.x * b.y - b.x * a.y End Function '-------------------------------- Function VADD(v1:TV3D, v2:TV3D,vout:TV3D Var) 'MR 05.07.2005 '+ vout.x = v1.x + v2.x vout.y = v1.y + v2.y vout.z = v1.z + v2.z End Function '-------------------------------- Function VSUB(v1:TV3D, v2:TV3D,vout:TV3D Var) 'MR 05.07.2005 '- vout.x = v1.x - v2.x vout.y = v1.y - v2.y vout.z = v1.z - v2.z End Function '-------------------------------- Function VMUL(v1:TV3D, v2:TV3D,vout:TV3D Var) 'MR 05.07.2005 '* vout.x = v1.x * v2.x vout.y = v1.y * v2.y vout.z = v1.z * v2.z End Function '-------------------------------- Function VDIR(a:TV3D, b:TV3D,vd:TV3D Var) 'MR 05.07.2005 Local hyp:Float VSUB b,a,vd hyp = Sqr(vd.x * vd.x + vd.y * vd.y + vd.z * vd.z) If hyp <> 0.0 Then vd.x = vd.x / hyp vd.y = vd.y / hyp vd.z = vd.z / hyp Else vd.x = 0.0 vd.y = 0.0 vd.z = 0.0 End If 'returns vector in vd End Function '-------------------------------- Function VENT:Float(a:TV3D, b:TV3D) 'MR 05.07.2005 'Entfernung Local ve:TV3D=TV3D.Create() Local e:Float VSUB b, a,ve e = Sqr(ve.x * ve.x + ve.y * ve.y + ve.z * ve.z) ve=Null Return e End Function '---------------------------------------------------------------------- Function VENTXY:Float(a:TV3D,b:TV3D) Local dx:Float,dy:Float dx=b.x-a.x dy=b.y-a.y Return Sqr(dx*dx + dy*dy) End Function '-------------------------------- Function VCOPY(v:TV3D, vout:TV3D Var) 'MR 05.07.2005 '= vout.x = v.x vout.y = v.y vout.z = v.z End Function '------------------------------------------------------------------------------------------------- Function VTRANS(a:TV3D Var) 'MR 09.07.2005 'überschribt den Vector ! AUFPASSEN ! Local b:TV3D=TV3D.Create() 'DebugLog "vorher A\xyz" 'DebugLog a.x 'DebugLog a.y 'DebugLog a.z b.x = a.x * mx[0, 0] + a.y * mx[1, 0] + a.z * mx[2, 0] b.y = a.x * mx[0, 1] + a.y * mx[1, 1] + a.z * mx[2, 1] b.z = a.x * mx[0, 2] + a.y * mx[1, 2] + a.z * mx[2, 2] 'ByRef a.x = b.x a.y = b.y a.z = b.z 'DebugLog "nacher A\xyz" 'DebugLog a.x 'DebugLog a.y 'DebugLog a.z 'DebugLog "Matrix" 'DebugLog mx[0,0] 'DebugLog mx[0,1] 'DebugLog mx[0,2] 'DebugLog mx[1,0] 'DebugLog mx[1,1] 'DebugLog mx[1,2] 'DebugLog mx[2,0] 'DebugLog mx[2,1] 'DebugLog mx[2,2] b=Null End Function '-------------------------------- Function VLine(p1:TV3D,p2:TV3D,draw_last_pixel=True) DrawLine p1.x,p1.y,p2.x,p2.y,draw_last_pixel End Function '-------------------------------- Function VPlot(p:TV3D) Plot p.x,p.y End Function '-------------------------------- Function Zwischenpunkt(pa:TV3D Var,pb:TV3D Var,p1:TV3D,p2:TV3D) '... 0.25 0.75 '... 0.33 0.67 pa.x=Intp(p1.x,p2.x,0.33) pa.y=Intp(p1.y,p2.y,0.33) pa.z=Intp(p1.z,p2.z,0.33) pb.x=Intp(p1.x,p2.x,0.67) pb.y=Intp(p1.y,p2.y,0.67) pb.z=Intp(p1.z,p2.z,0.67) End Function '------------------------------------------------------------------------------------------------- Function MatrixZero() 'MR 09.07.2005 Local i, j For i = 0 To 3 For j = 0 To 3 mx[i, j] = 0.0 Next Next End Function '------------------------------------------------------------------------------------------------- Function MatrixCreateIdentity() 'MR 09.07.2005 Local i For i = 0 To 3 mx[i, i] = 1.0 Next End Function '------------------------------------------------------------------------------------------------- Function MatrixCreateTranslate(a:TV3D) 'MR 09.07.2005 MatrixCreateIdentity() mx[3, 0] = a.x mx[3, 1] = a.y mx[3, 2] = a.z End Function '------------------------------------------------------------------------------------------------- Function MatrixCreateAxisRotate(axis:TV3D,Angle:Float) 'MR 09.07.2005 Local sqraxis:TV3D=TV3D.Create() sqraxis.x = sqare(axis.x) sqraxis.y = sqare(axis.y) sqraxis.z = sqare(axis.z) Local cosine:Float cosine = Cos(Angle) Local sine:Float sine = Sin(Angle) Local one_minus_cosine:Float one_minus_cosine = 1.0 - cosine MatrixZero() mx[0, 0] = sqraxis.x + (1.0 - sqraxis.x) * cosine mx[0, 1] = axis.x * axis.y * one_minus_cosine + axis.z * sine mx[0, 2] = axis.x * axis.z * one_minus_cosine - axis.y * sine mx[1, 0] = axis.x * axis.y * one_minus_cosine - axis.z * sine mx[1, 1] = sqraxis.y + (1.0 - sqraxis.y) * cosine mx[1, 2] = axis.y * axis.z * one_minus_cosine + axis.x * sine mx[2, 0] = axis.x * axis.z * one_minus_cosine + axis.y * sine mx[2, 1] = axis.y * axis.z * one_minus_cosine - axis.x * sine mx[2, 2] = sqraxis.z + (1.0 - sqraxis.z) * cosine mx[3, 3] = 1.0 sqraxis=Null End Function '------------------------------------------------------------------------------------------------- Function MatrixCreateScale(a:TV3D) 'MR 09.07.2005 MatrixZero mx[0, 0] = a.x mx[1, 1] = a.y mx[2, 2] = a.z End Function '------------------------------------------------------------------------------------------------- Function MatrixMultiply() 'MR 09.07.2005 'Multipliziert Matrix 1 & 2 Local i,j For i = 0 To 3 For j = 0 To 3 mx[i, j] = mx1[i, 0] * mx2[0, j] + mx1[i, 1] * mx2[1, j] + mx1[i, 2] * mx2[2, j] + mx1[i, 3] * mx2[3, j] Next Next End Function '------------------------------------------------------------------------------------------------- Function MatrixKamera(AchseX:TV3D,AchseY:TV3D,AchseZ:TV3D) 'MR 09.07.2005 Local o:TV3D=TV3D.Create() Local ax:TV3D=TV3D.Create() Local ay:TV3D=TV3D.Create() Local az:TV3D=TV3D.Create() VDIR AchseX, o,ax VDIR AchseY, o,ay VDIR AchseZ, o,az mx[0, 0] = ax.x mx[0, 1] = ay.x mx[0, 2] = az.x mx[0, 3] = 0 mx[1, 0] = ax.y mx[1, 1] = ay.y mx[1, 2] = az.y mx[1, 3] = 0 mx[2, 0] = ax.z mx[2, 1] = ay.z mx[2, 2] = az.z mx[2, 3] = 0 mx[3, 0] = 0 mx[3, 1] = 0 mx[3, 2] = 0 mx[3, 3] = 1 o=Null ax=Null ay=Null az=Null End Function '------------------------------------------------------------------------------------------------- Function Sqare:Float(x:Float) 'MR 09.07.2005 Return (x * x) End Function '------------------------------------------------------------------------------------------------- |
Comments
| ||
Whoa, nice work. Only slight problem is that there are two instances of "Color" in the code that have to be changed to SetColor before it'll compile! |
| ||
Thanks :-) Ups, i have used my Blitz3D compatible Modul ;-) I change this next time . |
| ||
This is sweet! Super work Markus! |
| ||
This code is not PublicDomain, Markus, please modify the restrictions or remove. |
Code Archives Forum