msgbox

Untitled

Aug 15th, 2011
165
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #NoEnv
  2.  
  3. SetBatchLines, -1
  4. SetMouseDelay, -1
  5.  
  6. Width := 320
  7. Height := 240
  8. FrameRate := 30
  9. FullScreen := 0
  10. AutoFly := 0
  11. BlockCountX := 20
  12. BlockCountY := 30
  13.  
  14. PosX := -40
  15. PosY := -20
  16. PosZ := 30
  17. Speed := 0.3
  18.  
  19. Ptr := A_PtrSize ? "Ptr" : "UInt" ;set compatibility constants
  20. Radian := 3.141592 / 180
  21. hGDI32 := DllCall("LoadLibrary","Str","gdi32"), hOpenGL32 := DllCall("LoadLibrary","Str","opengl32") ;load libraries
  22. OnExit, ExitSub
  23.  
  24. If FullScreen
  25.  Gui, -Caption +AlwaysOnTop
  26. Gui, +LastFound +Resize +MinSize150x150
  27. hWindow := WinExist()
  28.  
  29. DllCall("ShowCursor","Int",0) ;hide the cursor
  30.  
  31. hDC := DllCall("GetDC","UInt",hWindow)
  32. VarSetCapacity(Struct,40,0), NumPut(40,Struct,0,"UShort"), NumPut(1,Struct, 2,"UShort")
  33. NumPut(0x25,Struct,4,"UInt") ;PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER
  34. NumPut(0,Struct,8,"UChar") ;PFD_TYPE_RGBA
  35. NumPut(24,Struct,9,"UChar") ;Color bit depth
  36. NumPut(16,Struct,23,"UChar") ;Depth buffer bit depth
  37. DllCall("gdi32\SetPixelFormat","UInt",hDC,"Int",DllCall("gdi32\ChoosePixelFormat","UInt",hDC,Ptr,&Struct,"Int"),Ptr,&Struct)
  38. hRC := DllCall("opengl32\wglCreateContext","UInt",hDC), DllCall("opengl32\wglMakeCurrent","UInt",hDC,"UInt",hRC)
  39.  
  40. ;get the position of the control on screen
  41. VarSetCapacity(ClientPoint,8,0), DllCall("ClientToScreen","UInt",hWindow,Ptr,&ClientPoint), ControlPosX := NumGet(ClientPoint), ControlPosY := NumGet(ClientPoint,4)
  42.  
  43. BackgroundRed := 0.4, BackgroundGreen := 0.4, BackgroundBlue := 0.5
  44.  
  45. DllCall("opengl32\glShadeModel","UInt",0x1D01) ;GL_SMOOTH
  46. DllCall("opengl32\glClearColor","Float",BackgroundRed,"Float",BackgroundGreen,"Float",BackgroundBlue,"Float",0.0)
  47. DllCall("opengl32\glClearDepth","Double",1.0)
  48. DllCall("opengl32\glEnable","UInt",0xB71) ;GL_DEPTH_TEST
  49. DllCall("opengl32\glDepthFunc","UInt",0x201) ;GL_LESS
  50. DllCall("opengl32\glHint","UInt",0xC50,"UInt",0x1102) ;GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST
  51. DllCall("opengl32\glPolygonMode","UInt",0x408,"UInt",0x1B02) ;GL_FRONT_AND_BACK, GL_FILL
  52.  
  53. DllCall("opengl32\glEnable","UInt",0xB50) ;GL_LIGHTING
  54. VarSetCapacity(Struct,16)
  55.  
  56. DllCall("opengl32\glEnable","UInt",0x4000) ;GL_LIGHT0
  57. VarSetCapacity(Struct,16)
  58. NumPut(1.0,Struct,0,"Float"), NumPut(1.0,Struct,4,"Float"), NumPut(1.0,Struct,8,"Float"), NumPut(1,Struct,12,"Float") ;ambient color
  59. DllCall("opengl32\glLightfv","UInt",0x4000,"UInt",0x1200,Ptr,&Struct) ;GL_LIGHT0, GL_AMBIENT
  60. NumPut(BackgroundRed,Struct,0,"Float"), NumPut(BackgroundGreen,Struct,4,"Float"), NumPut(BackgroundBlue,Struct,8,"Float"), NumPut(1,Struct,12,"Float")
  61. DllCall("opengl32\glLightfv","UInt",0x4000,"UInt",0x1201,Ptr,&Struct) ;GL_LIGHT0, GL_DIFFUSE
  62.  
  63. DllCall("opengl32\glLightf","UInt",0x4000,"UInt",0x1208,"Float",0.003) ;GL_LIGHT0, GL_LINEAR_ATTENUATION
  64. NumPut(20,Struct,0,"Float"), NumPut(10,Struct,4,"Float"), NumPut(10,Struct,8,"Float"), NumPut(1,Struct,12,"Float") ;positional light at 20,10,10
  65.  
  66. DllCall("opengl32\glEnable","UInt",0xB60) ;GL_FOG
  67. DllCall("opengl32\glFogi","UInt",0xB65,"UInt",0x800) ;GL_FOG_MODE, GL_LINEAR
  68. NumPut(BackgroundRed,Struct,0,"Float"), NumPut(BackgroundGreen,Struct,4,"Float"), NumPut(BackgroundBlue,Struct,8,"Float"), NumPut(1,Struct,12,"Float") ;fog color
  69. DllCall("opengl32\glFogfv","UInt",0xB66,Ptr,&Struct) ;GL_FOG_COLOR
  70. DllCall("opengl32\glFogf","UInt",0xB62,"Float",0.03) ;GL_FOG_DENSITY
  71. DllCall("opengl32\glHint","UInt",0xC54,"UInt",0x1102) ;GL_FOG_HINT, GL_NICEST
  72. DllCall("opengl32\glFogf","UInt",0xB63,"Float",10.0) ;GL_FOG_START
  73. DllCall("opengl32\glFogf","UInt",0xB64,"Float",100.0) ;GL_FOG_END
  74.  
  75. DllCall("opengl32\glEnable","UInt",0xDE1) ;GL_TEXTURE_2D
  76.  
  77. IfNotExist, %A_ScriptDir%\Building.png
  78.  URLDownloadToFile, http://www.autohotkey.net/~Uberi/Scripts/Procedural`%20City/Building.png, %A_ScriptDir%\Building.png
  79. BuildingTexture := LoadTexture(A_ScriptDir . "\Building.png","Nearest")
  80.  
  81. City := CreateCity(0,0,0,4,2.5,3,BlockCountX,BlockCountY,7)
  82.  
  83. If FullScreen
  84.  Gui, Show, Maximize, Procedural City
  85. Else
  86.  Gui, Show, w%Width% h%Height%, Procedural City
  87.  
  88. ;move cursor to center of the window
  89. MouseGetPos, TempX, TempY
  90. TempX -= ControlPosX, TempY -= ControlPosY
  91. MouseMove, 0 - (TempX - (Width / 2)), 0 - (TempY - (Height / 2)), 0, R
  92.  
  93. FrameRate := 1000 / FrameRate
  94. If AutoFly
  95. {
  96.  NavigationIndex := 3.141592 / 2
  97.  Loop
  98.  {
  99.   TempTime := A_TickCount
  100.   PosX += (Sin(NavigationIndex) * Speed) / 2
  101.   PosZ += (Cos(NavigationIndex) * Speed) / 2
  102.   NavigationIndex += Speed / 20
  103.   RotX  += 0.2
  104.   ToolTip "%PosX%" "%PosY%" "%PosZ%" "%RotX%" "%RotY%"
  105.   Draw()
  106.   Sleep, % FrameRate - (A_TickCount - TempTime) ;conpensate for lag
  107.  }
  108.  Return
  109. }
  110. Loop
  111. {
  112.  TempTime := A_TickCount
  113.  GetMouseMovement(RotX,RotY), RotX *= 120, RotY *= 120
  114.  If GetKeyState("W")
  115.   PosX -= Sin(RotX * Radian) * Speed, PosZ += Cos(RotX * Radian) * Speed, PosY += Sin(RotY * Radian) * Speed
  116.  If GetKeyState("S")
  117.   PosX += Sin(RotX * Radian) * Speed, PosZ -= Cos(RotX * Radian) * Speed, PosY -= Sin(RotY * Radian) * Speed
  118.  If GetKeyState("A")
  119.   PosX += Cos(RotX * Radian) * Speed, PosZ += Sin(RotX * Radian) * Speed
  120.  If GetKeyState("D")
  121.   PosX -= Cos(RotX * Radian) * Speed, PosZ -= Sin(RotX * Radian) * Speed
  122.  If GetKeyState("Q")
  123.   PosY += Speed
  124.  If GetKeyState("E")
  125.   PosY -= Speed
  126.  ;ToolTip "%PosX%" "%PosY%" "%PosZ%" "%RotX%" "%RotY%"
  127.  Draw()
  128.  Sleep, % FrameRate - (A_TickCount - TempTime) ;conpensate for lag
  129. }
  130. Return
  131.  
  132. GuiEscape:
  133. GuiClose:
  134. ExitApp
  135.  
  136. GuiSize:
  137. Width := A_GuiWidth ? A_GuiWidth : 1, Height := A_GuiHeight ? A_GuiHeight : 1
  138. ResizeScene(0,0,Width,Height,55.0,0.5,Width / 4)
  139. Return
  140.  
  141. ExitSub:
  142. DllCall("opengl32\glDeleteLists","UInt",City,"Int",1) ;delete geometry
  143. DllCall("opengl32\glDeleteTextures","Int",1,"UInt",BuildingTexture) ;delete texture
  144. DllCall("opengl32\wglMakeCurrent","UInt",0,"UInt",0)
  145. DllCall("opengl32\wglDeleteContext","UInt",hRC)
  146. DllCall("ShowCursor","Int",1) ;show the cursor
  147. ExitApp
  148.  
  149. Draw()
  150. {
  151.  global hDC, City, RotX, RotY, PosX, PosY, PosZ, Struct, Ptr, BuildingTexture
  152.  DllCall("opengl32\glClear","UInt",0x4100) ;GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
  153.  DllCall("opengl32\glLoadIdentity")
  154.  
  155.  DllCall("opengl32\glRotatef","Float",RotY,"Float",1.0,"Float",0.0,"Float",0.0)
  156.  DllCall("opengl32\glRotatef","Float",RotX,"Float",0.0,"Float",1.0,"Float",0.0)
  157.  
  158.  DllCall("opengl32\glTranslatef","Float",PosX,"Float",PosY,"Float",PosZ)
  159.  
  160.  DllCall("opengl32\glLightfv","UInt",0x4000,"UInt",0x1203,Ptr,&Struct) ;GL_LIGHT0, GL_POSITION
  161.  
  162.  DllCall("opengl32\glBindTexture","UInt",0xDE1,"UInt",BuildingTexture) ;GL_TEXTURE_2D
  163.  DllCall("opengl32\glCallList","UInt",City) ;draw city
  164.  
  165.  DllCall("gdi32\SwapBuffers","UInt",hDC)
  166. }
  167.  
  168. GetMouseMovement(ByRef PosX = "",ByRef PosY = "")
  169. {
  170.  global ControlPosX, ControlPosY, Width, Height, hWindow
  171.  static AbsoluteX := 0, AbsoluteY := 0, PosX1, PosY1
  172.  IfWinNotActive, ahk_id %hWindow%
  173.  {
  174.   PosX := PosX1, PosY := PosY1
  175.   Return
  176.  }
  177.  MouseGetPos, PosX, PosY
  178.  PosX -= ControlPosX, PosY -= ControlPosY, PosX1 := PosX, PosY1 := PosY
  179.  MouseMove, 0 - (PosX - (Width / 2)), 0 - (PosY - (Height / 2)), 0, R
  180.  AbsoluteX += (PosX / Width) - 0.5, AbsoluteY += (PosY / Height) - 0.5
  181.  PosX := AbsoluteX, PosY := AbsoluteY
  182. }
  183.  
  184. ResizeScene(PosX,PosY,Width,Height,FieldOfView = 45.0,ClipNear = 0.5,ClipFar = 100.0)
  185. {
  186.  DllCall("opengl32\glViewport","Int",PosX,"Int",PosY,"Int",Width,"Int",Height)
  187.  DllCall("opengl32\glMatrixMode","UInt",0x1701) ;GL_PROJECTION
  188.  DllCall("opengl32\glLoadIdentity")
  189.  MaxY := ClipNear * Tan(FieldOfView * 0.00872664626), MaxX := MaxY * (Width / Height), DllCall("opengl32\glFrustum","Double",0 - MaxX,"Double",MaxX,"Double",0 - MaxY,"Double",MaxY,"Double",ClipNear,"Double",ClipFar)
  190.  DllCall("opengl32\glMatrixMode","UInt",0x1700) ;GL_MODELVIEW
  191. }
  192.  
  193. LoadTexture(Filename,Filter = "Linear")
  194. {
  195.  hGDIP := DllCall("LoadLibrary","Str","gdiplus")
  196.  VarSetCapacity(Temp1,16,0), NumPut(1,Temp1), DllCall("gdiplus\GdiplusStartup","UInt*",pToken,"UInt",&Temp1,"UInt",0)
  197.  If A_IsUnicode
  198.   DllCall("gdiplus\GdipCreateBitmapFromFile","UInt",&Filename,"UInt*",pBitmap)
  199.  Else
  200.   FilenameLength := DllCall("MultiByteToWideChar","UInt",0,"UInt",0,"UInt",&Filename,"Int",-1,"UInt",0,"Int",0) << 1, VarSetCapacity(wFilename,FilenameLength,0), DllCall("MultiByteToWideChar","UInt",0,"UInt",0,"UInt",&Filename,"Int",-1,"UInt",&wFilename,"UInt",FilenameLength), DllCall("gdiplus\GdipCreateBitmapFromFile","UInt",&wFilename,"UInt*",pBitmap)
  201.  DllCall("gdiplus\GdipCreateHBITMAPFromBitmap","UInt",pBitmap,"UInt*",hBitmap,"UInt",0xFF000000)
  202.  DllCall("gdiplus\GdipDisposeImage","UInt",pBitmap)
  203.  DllCall("gdiplus\GdiplusShutdown","UInt",pToken)
  204.  DllCall("FreeLibrary","UInt",hGDIP)
  205.  If Not hBitmap
  206.   Return, 0
  207.  VarSetCapacity(BitmapInfo,24,0), DllCall("GetObject","UInt",hBitmap,"UInt",24,"UInt",&BitmapInfo), Bits := NumGet(BitmapInfo,20), Width := NumGet(BitmapInfo,4), Height := NumGet(BitmapInfo,8)
  208.  DllCall("opengl32\glGenTextures","Int",1,"UInt*",Texture)
  209.  DllCall("opengl32\glBindTexture","UInt",0xDE1,"UInt",Texture) ;GL_TEXTURE_2D
  210.  Linear := 0x2601, Nearest := 0x2600 ;GL_LINEAR, GL_NEAREST
  211.  DllCall("opengl32\glTexParameteri","UInt",0xDE1,"UInt",0x2801,"Int",%Filter%) ;GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER. Set the minifying filter
  212.  DllCall("opengl32\glTexParameteri","UInt",0xDE1,"UInt",0x2800,"Int",%Filter%) ;GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER. Set the magnification filter
  213.  DllCall("opengl32\glTexImage2D","UInt",0xDE1,"Int",0,"Int",4,"Int",Width,"Int",Height,"Int",0,"UInt",0x80E1,"UInt",0x1401,"UInt",Bits) ;GL_TEXTURE_2D, GL_BGRA, GL_UNSIGNED_BYTE. Import image data
  214.  DllCall("DeleteObject","UInt",hBitmap)
  215.  Return, Texture
  216. }
  217.  
  218. CreateCity(PosX = 0,PosY = 0,PosZ = 0,BlockLength = 4,BlockHeight = 2.5,BlockWidth = 3,BlockCountX = 20,BlockCountY = 20,BlockCountZ = 7)
  219. {
  220.  Str := A_IsUnicode ? "AStr" : "Str"
  221.  hOpenGL32 := DllCall("GetModuleHandle","Str","opengl32")
  222.  pBegin := DllCall("GetProcAddress","UInt",hOpenGL32,Str,"glBegin")
  223.  pNormal := DllCall("GetProcAddress","UInt",hOpenGL32,Str,"glNormal3f")
  224.  pTexCoord := DllCall("GetProcAddress","UInt",hOpenGL32,Str,"glTexCoord2f")
  225.  pVertex := DllCall("GetProcAddress","UInt",hOpenGL32,Str,"glVertex3f")
  226.  pEnd := DllCall("GetProcAddress","UInt",hOpenGL32,Str,"glEnd")
  227.  
  228.  ;generate display lists
  229.  ListIndex := DllCall("opengl32\glGenLists","Int",1)
  230.  DllCall("opengl32.dll\glNewList","UInt",ListIndex,"UInt",0x1300) ;GL_COMPILE
  231.  
  232.  Loop, %BlockCountX%
  233.  {
  234.   TempPosZ := PosZ
  235.   PosX1 := PosX + BlockLength
  236.   Loop, %BlockCountY%
  237.   {
  238.    TempPosZ -= BlockWidth, PosZ1 := TempPosZ + BlockWidth, StartPosY := PosY
  239.  
  240.    ;determine the block height level
  241.    Random, Temp1, 0.0, 1.0
  242.    Temp1 := Round((Temp1 ** 3) * BlockCountZ)
  243.  
  244.    If Not Temp1
  245.     PosY1 := StartPosY
  246.    Loop, %Temp1%
  247.    {
  248.     PosY1 := PosY + BlockHeight
  249.  
  250.     ;front face
  251.     DllCall(pBegin,"UInt",0x7) ;GL_QUADS
  252.     DllCall(pNormal,"Float",0,"Float",0,"Float",1)
  253.     DllCall(pTexCoord,"Float",0.0,"Float",0.0)
  254.     DllCall(pVertex,"Float",PosX1,"Float",PosY1,"Float",PosZ1)
  255.     DllCall(pTexCoord,"Float",0.0,"Float",1.0)
  256.     DllCall(pVertex,"Float",PosX,"Float",PosY1,"Float",PosZ1)
  257.     DllCall(pTexCoord,"Float",1.0,"Float",1.0)
  258.     DllCall(pVertex,"Float",PosX,"Float",PosY,"Float",PosZ1)
  259.     DllCall(pTexCoord,"Float",1.0,"Float",0.0)
  260.     DllCall(pVertex,"Float",PosX1,"Float",PosY,"Float",PosZ1)
  261.     DllCall(pEnd)
  262.  
  263.     ;back face
  264.     DllCall(pBegin,"UInt",0x7) ;GL_QUADS
  265.     DllCall(pNormal,"Float",0,"Float",0,"Float",-1)
  266.     DllCall(pTexCoord,"Float",0.0,"Float",0.0)
  267.     DllCall(pVertex,"Float",PosX1,"Float",PosY1,"Float",TempPosZ)
  268.     DllCall(pTexCoord,"Float",0.0,"Float",1.0)
  269.     DllCall(pVertex,"Float",PosX,"Float",PosY1,"Float",TempPosZ)
  270.     DllCall(pTexCoord,"Float",1.0,"Float",1.0)
  271.     DllCall(pVertex,"Float",PosX,"Float",PosY,"Float",TempPosZ)
  272.     DllCall(pTexCoord,"Float",1.0,"Float",0.0)
  273.     DllCall(pVertex,"Float",PosX1,"Float",PosY,"Float",TempPosZ)
  274.     DllCall(pEnd)
  275.  
  276.     ;right face
  277.     DllCall(pBegin,"UInt",0x7) ;GL_QUADS
  278.     DllCall(pNormal,"Float",1,"Float",0,"Float",0)
  279.     DllCall(pTexCoord,"Float",0.0,"Float",0.0)
  280.     DllCall(pVertex,"Float",PosX1,"Float",PosY1,"Float",PosZ1)
  281.     DllCall(pTexCoord,"Float",0.0,"Float",1.0)
  282.     DllCall(pVertex,"Float",PosX1,"Float",PosY1,"Float",TempPosZ)
  283.     DllCall(pTexCoord,"Float",1.0,"Float",1.0)
  284.     DllCall(pVertex,"Float",PosX1,"Float",PosY,"Float",TempPosZ)
  285.     DllCall(pTexCoord,"Float",1.0,"Float",0.0)
  286.     DllCall(pVertex,"Float",PosX1,"Float",PosY,"Float",PosZ1)
  287.     DllCall(pEnd)
  288.  
  289.     ;left face
  290.     DllCall(pBegin,"UInt",0x7) ;GL_QUADS
  291.     DllCall(pNormal,"Float",-1,"Float",0,"Float",0)
  292.     DllCall(pTexCoord,"Float",0.0,"Float",0.0)
  293.     DllCall(pVertex,"Float",PosX,"Float",PosY1,"Float",PosZ1)
  294.     DllCall(pTexCoord,"Float",0.0,"Float",1.0)
  295.     DllCall(pVertex,"Float",PosX,"Float",PosY1,"Float",TempPosZ)
  296.     DllCall(pTexCoord,"Float",1.0,"Float",1.0)
  297.     DllCall(pVertex,"Float",PosX,"Float",PosY,"Float",TempPosZ)
  298.     DllCall(pTexCoord,"Float",1.0,"Float",0.0)
  299.     DllCall(pVertex,"Float",PosX,"Float",PosY,"Float",PosZ1)
  300.     DllCall(pEnd)
  301.  
  302.     PosY += BlockHeight
  303.    }
  304.  
  305.    ;top face
  306.    DllCall(pBegin,"UInt",0x7) ;GL_QUADS
  307.    DllCall(pNormal,"Float",0,"Float",1,"Float",0)
  308.    ;DllCall(pTexCoord,"Float",0.0,"Float",0.0)
  309.    DllCall(pVertex,"Float",PosX1,"Float",PosY1,"Float",PosZ1)
  310.    ;DllCall(pTexCoord,"Float",0.0,"Float",1.0)
  311.    DllCall(pVertex,"Float",PosX1,"Float",PosY1,"Float",TempPosZ)
  312.    ;DllCall(pTexCoord,"Float",1.0,"Float",1.0)
  313.    DllCall(pVertex,"Float",PosX,"Float",PosY1,"Float",TempPosZ)
  314.    ;DllCall(pTexCoord,"Float",1.0,"Float",0.0)
  315.    DllCall(pVertex,"Float",PosX,"Float",PosY1,"Float",PosZ1)
  316.    DllCall(pEnd)
  317.    
  318.    PosY := StartPosY
  319.   }
  320.   PosX += BlockLength
  321.  }
  322.  DllCall("opengl32.dll\glEndList")
  323.  Return, ListIndex
  324. }
Advertisement
Add Comment
Please, Sign In to add comment