Script for å fjerne usynlige objekter i scenen

Max scripts

Moderatorer: Super Moderatorer, Admins


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Script for å fjerne usynlige objekter i scenen

Legg innav hardrock_ram » man 06 aug, 2012

Skrev et lite script mens jeg venter på en større renderjobb ...
Scriptet fjerner objekter som a: enten er fullstendig omsluttet av andre objekter, eller b: Ikke synes fra en gitt synsvinkel.
Det kan kjøres på flere kameraer og over en animasjon. Merk at det IKKE tas hensyn til gjennomsiktige materialer, så slike objekter må ekskluderes manuelt. (Er knapp for det i scriptet). Akkurat denne funksjonen kan det godt hende jeg legger til siden ...
Det er ikke lagt veldig mye arbeid i dette, og for å være ærlig, så ser jeg ikke det helt store bruksområdet :P

Det er bare å kopiere koden og kjøre den i editor. Jeg hater script som lager knapper til seg selv og sånt, så det er ikkeno slikt her.

EDIT: Exclude objects betyr at scriptet ikke tar med valgte objekter i sjekk for synlighet. Det sies altså ingenting om objektet som er excluded faktisk er synlig eller ikke.

[spoiler]

Kode: Velg alt

(--START Script
   
   --Array som inneholder alle points som evt. lages ved preview
   local array_previewPoints = #()
   
   --Array som inneholder previewPoints posisjoner før de flyttes med spinnere
   local array_previewPointsZeroPos = #()
   
   --Array som inneholder previewPoints posisjoner før de flyttes med spinnere
   local array_previewPointsTruePos = #()
   
   -- Variabel som inneholder geometrisk sphere som evt lages ved preview
   local previewGeometry
   
   --Array som holder alle objekter som er aktuelle for sjekk
   local objArray = #()
   
   --Array som holder alle objekter som er synlige etter sjekk. Tilhører funksjonen rayFire
   local visibleObjects = #()
   
   --Array som inneholder alle objekter som ikke er synlige. MERK: Objekter vil akkumuleres i dette arrayet helt til man tømmer det med "btn_freeAll"
   local inVisibleObjects = #()
   
   --her legges items inn i dropDownList for choose view:
   local array_chooseView = #("Surround scene", "Active viewport")
   for o = objects where superClassOf o == camera do append array_chooseView (o.name as string)--Kameraer legges til
   append array_chooseView "All cameras"
   
   --Her legges items inn i dropDownList for choose resolution:
   local array_chooseResolution = #("1\1", "1\4", "1\16", "1\64", "1\256", "1\1024", "1\4096")


rollout removeInvisibleObjects "Remove invisible objects"
(   
   --START interface:
   dropDownList DDL_chooseView "Choose view" items: array_chooseView
   dropDownList DDL_chooseResolution "Choose resolution" items: array_chooseResolution selection:5
   group "Objects selection refinement"
   (
      Button btn_excludeSelObjects "Exclude selected objects"
      Button btn_includeSelObjects "Include selected objects"
      Button btn_includeAllObjects "Include all objects"
      checkBox chk_includeFrozen "Include frozen objects"
      checkBox chk_includeHidden "Include hidden objects"
   )
   group "Surround sphere options"
   (
      pickbutton pBtn_getCenterFromObject "Get center coordinates from object"
      spinner spn_surroundXPos "Choose surround center X position" range:[-999999,999999,0]
      spinner spn_surroundYPos "Choose surround center Y position" range:[-999999,999999,0]
      spinner spn_surroundZPos "Choose surround center Z position" range:[-999999,999999,0]
      spinner spn_surroundRadius "Surround scene radius" range:[1,999999,100]
   )
   group "Preview"
   (
      checkBox chk_previewAsGeometry "Preview as geometry (Number of vertices indicate density)" checked:true
      checkbutton chkBtn_previewSurround "Preview surround"
   )
   group "Animation"
   (
      spinner spn_rangeStart "Animation range start" type:#integer
      spinner spn_rangeEnd "Animation range end" type:#integer
      spinner spn_jumpNumFrames "Check every number of frames" type:#integer range:[1,999999,1]
   )
   Button btn_run "Run"
   label lbl_ProgBar_frame "Frame progress"
   progressbar ProgBar_frame
   group "Operation"
   (
      button btn_selectInVisibleObjects "Select invisible objects"
      button btn_deleteInVisibleObjects "Delete invisible objects"
   )
   group "Invisible objects accumulation"
   (
      button btn_freeAll "Free storage of invisible objects"
      label lbl_freeAll "Objects stored as <not visible> will accumulate until this button is pressed"
   )
   --SLUTT interface
   
   
   --START senterkoordinater etter objekt
   on pBtn_getCenterFromObject picked obj do
   (
      spn_surroundXPos.value = obj.pos.x
      spn_surroundYPos.value = obj.pos.y
      spn_surroundZPos.value = obj.pos.z
   )
   --SLUTT senterkoordianter etter objekt   
   
   --START eksludering av objekter etter brukervalg
   local array_excludeSelObjects =#()
   
   on btn_excludeSelObjects pressed do
   (
      for o = selection where superClassOf o == geometryClass and classOf o != targetObject \
      do appendifUnique array_excludeSelObjects o
   )
   
   
   on btn_includeSelObjects pressed do
   (
      for o = selection do
      (
         item = (findItem array_excludeSelObjects o)
         if item != 0 do deleteItem array_excludeSelObjects item
      )
   )
   
   
   on btn_includeAllObjects pressed do
   (
      free array_excludeSelObjects
   )
   --Resultatet finnes i arrayet "array_excludeSelObjects"
   --SLUTT på eksludering av objekter etter brukervalg.
   
   
   --Enable\disable preview-knapp etter valg av type objektsjekk
   on DDL_chooseView selected sel do
   (
      if sel != 1 then chkBtn_previewSurround.enabled = false else chkBtn_previewSurround.enabled = true
   )--SLUTT enable\disable preview-knapp
   
   --START preview på
   on chkBtn_previewSurround changed onOff do --Hele denne delen aktiveres hver gang man forandrer status på previewknappen
   (
      if onOff == true do--Knappen er trykket ned
      (
         local posCenter = [spn_surroundXPos.value, spn_surroundYPos.value, spn_surroundZPos.value]
         local rad = spn_surroundRadius.value
         local resolution = DDL_chooseResolution.selection as integer--Brukes i alle "by" i for-loops
         local pointJump = 360  -- variabel pointJump som bestemmer tettheten mellom sjekkpunktene for surround. Default 360
         
         local array_verts = #()--Array for vertices   
         local array_faces = #()--Array for faces
         
         for Z = -90 to 90 by pointJump do --Det lages en sirkel med punkter rundt hvert punkt på Z-aksen
         (
            --Sørger for at det kun er et punkt i senter i bånn av kula
            if Z == -90 or Z == 90 then pointJump = 360 else pointJump = resolution
            if pointJump <0 do pointJump = -pointJump --Sørger for at pointJump (setter mellomrom mellom punkter) alltid er positiv.
               
            for XY = 1 to 360 by pointJump do--Sirkelen med punkter som lages rundt hvert Z-punkt
            (
               local pointPos = [cos XY*rad*cos Z, sin XY*rad*cos Z, sin Z*rad] --Punktenes posisjon
               append array_previewPointsZeroPos pointPos -- Posisjonen puttes i array for å kunne flyttes ved forandring av spinnere under preview
               local pointDir = normalize posCenter - pointPos --Punktenes retning
               local pointPos = pointPos + posCenter --PosCenter henter posisjonsverdier fra XYZ-spinnere og legger dem til i variabel pointPos
               append array_previewPointsTruePos pointPos --Posisjonskoordinater etter flytting legges inn her
               
               append array_verts pointPos --Hver posisjon (point3) legges inn i array_verts for å brukes til den geometriske preview-spheren
               
               if (chk_previewAsGeometry.checked == false) do--Punkter lages hvis det ikke er huket av for å lage geometri isteden
               (
                  append array_previewPoints (point pos:pointPos dir:pointDir wirecolor:[0,255,0] name:"previewPoint" size:1)
               )
            )
            if pointJump == 360 do pointJump =  resolution--Forsikrer at pointJump ikke er 360 ved start på neste for-syklus
         )
         
         if chk_previewAsGeometry.checked == true do--Hvis det er bestemt at det skal lages en geometrisk sphere isteden for punkter
         (
            for i = 1 to array_verts.count - (360/resolution) - 1 do --Det lages faces som puttes i array_faces
            (
               v1 = i
               v2 = i + 1
               v3 = i + (360/resolution)
               v4 = i + (360/resolution) + 1
               
               triangle1 = [v1,v2,v3]
               triangle2 = [v2,v4,v3]
               
               append array_faces triangle1
               append array_faces triangle2
            )
            
            previewGeometry = (mesh vertices:array_verts faces:array_faces \
            wirecolor:[0,255,0] name:"previewSphere")--Geometrisk sphere lages
            previewGeometry.pivot = previewGeometry.center
         )
      )--SLUTT preview på
      
      
      --START preview av
      if onOff == false do
      (
         try (delete previewGeometry) catch ()
         delete array_previewPoints
         free array_previewPoints
         free array_previewPointsZeroPos
      )--SLUTT preview av
   )--SLUTT på alt som har med aktivering\deaktivering av preview-knapp å gjøre
   
   
   on btn_run pressed do --RUN
   (
      --START fjern previewobjekter
      try (delete previewGeometry) catch ()
      for i = array_previewPoints do delete i
      free array_previewPoint
      if chk_previewAsGeometry.checked == false do chk_previewAsGeometry.checked = true
      --SLUTT fjern previewobjekter
      
      --START objektsortering
      --Sorterer ut objekter som skal være med i vurderingen, inkludert brukervalg. Puttes til slutt i arrayet "objArray" på toppen av scriptet
      for o = geometry where classOf o != targetObject \
      and (if chk_includeFrozen.checked == true then (o.isFrozen == true or o.isFrozen == false) else o.isFrozen == false ) \
      and (if chk_includeHidden.checked == true then (o.isHidden == true or o.isHidden == false) else o.isHidden == false ) \
      and (if (findItem array_excludeSelObjects o != 0) then false else true) \
      do appendIfUnique objArray o
      --objArray som inneholder alle objekter som skal sjekkes, ligger på toppen av scriptet
      --SLUTT objektsortering
      
      
      --START rayfire-funksjon
      --Selve funksjonen som kjøres for hver pixel. arrayet "visibleObjects" finnes helt på toppen i scriptet
      fn rayFire pointRay =
      (
         local dist = 999999.0 --gammel distanse
         local newDist = 999999.0 --ny distanse for å sjekke om den er kortere enn den gamle
         local obj --Variabel som holder objektet som er nærmest
         
         for o = objArray do
         (
            intRay = intersectRay o pointRay
            
            if intRay != undefined do
            (
               if (newDist = (length (pointRay.pos - intRay.pos))) <dist do
               (
                  obj = o --objektet som er nærmere enn forige sjekkede opbjekt puttes i variabel obj
                  dist = newDist --Dette objektets distanse settes i variabel dist, slik at neste objekt kan bruke dette som "gammel distanse"
               )
            )
         )
         --Objektet med den korteste distansen fra kameraet blir puttet i arrayet for objekter som skal taes vare på
         if obj != undefined do (appendifUnique visibleObjects obj)
      )--SLUTT rayFire-funksjon
      
      
      local numFrames = spn_rangeEnd.value - spn_rangeStart.value --Teller antall frames som er satt av spinnere
      
      for i = 0 to numFrames by (spn_jumpNumFrames.value) do --Hele pakka kjøres en gang for hver frame
      (
         sliderTime = spn_rangeStart.value + i
         
         --START surround
         if DDL_chooseView.selection == 1 do --SURROUND SCENE
         (
            local posCenter = [spn_surroundXPos.value, spn_surroundYPos.value, spn_surroundZPos.value]
            local rad = spn_surroundRadius.value
            local resolution = DDL_chooseResolution.selection as integer
            
            local pointJump = 360--Variabel som bestemmer "by" i for loops slik at man kan redusere "oppløsning"
            
            for Z = -90 to 90 by pointJump do --Det skal lages en sirkel med rayPunkter (XY) rundt hvert punkt på Z-aksen (Z)
            (
               if Z ==  -90 or Z == 90 then pointJump = 360 else pointJump = resolution--Sikrer kun et raypunkt i topp og bånn
               if pointJump <0 do pointJump = -pointJump -- Sørger for at pointJump alltid er et positivt tall
                  
               for XY = 1 to 360 by pointJump do --Det skal lages en sirkel med punkter (XY) rundt hvert punkt på Z-aksen (Z)
               (
                  local pointPos = [cos XY*rad*cos Z, sin XY*rad*cos Z, sin Z*rad] --Posisjonskoordianter for rays
                  local pointDir = normalize posCenter - pointPos --Retningskoordianter for rays
                  local pointPos = pointPos + posCenter --Manuelle posisjonskoordianter legges til
                  
                  rayFire (ray pointPos pointDir) --Funksjonen kjøres
               )
               if pointJump == 360 do pointJump =  resolution --Sørger for at pointJump alltid starter med "resolution" som utgangspunkt
            )--SLUTT på å klatre på Z-aksen
         )--SLUTT surround
         
         
         --START screen
         if DDL_chooseView.selection >= 2 do --CURRENT VIEW, KAMERAER, ALLE KAMERAER
         (
            local resolution = DDL_chooseResolution.selection as integer--oppløsning for rays som sendes ut
            
            if DDL_chooseView.selection >=3 and DDL_chooseView.selection <array_chooseView.count  do
            -- Hvis et av kameraene velges, settes viewport automatisk til det når scriptet starter
            (
               viewPort.setCamera (getNodeByName array_chooseView[DDL_chooseView.selection as integer])
            )
            
            if DDL_chooseView.selection == array_chooseView.count and array_chooseView.count >=4  then
            --Hvis man velger "all cameras" (siste valg i menyen), og det faktisk er kameraer i scenen gjøres dette:
            (
               for i = 3 to (array_chooseView.count-1) do--En omgang for hvert kamera
               (
                  viewPort.setCamera (getNodeByName array_chooseView[i])--Viewport settes hele tiden til riktig kamera
                  
                  --Sjekker objekter for hver pixel, evt. hver pixel med mellomrom satt av pointJump
                  for X = 0 to (getViewSize()).x - 1 by resolution do
                  (
                     --Progress bar
                     if X <((getViewSize()).x - 1) then ProgBar_frame.value = (X/((getViewSize()).x - 1))*100 else ProgBar_frame.value = 0
                     if ProgBar_frame.value == 100 do ProgBar_frame.value = 0
                     
                     --Sjekker objekter for hver pixel, evt. hver pixel med mellomrom satt av pointJump
                     for Y = 0 to (getViewSize()).y - 1 by resolution do
                     (
                        rayFire (mapScreenToWorldRay [x,y])
                     )
                  )--SLUTT på objektsjekk på hver pixel
               )--SLUTT på en gjennomgang på alle kameraer
            )--SLUTT på brukervalget "all cameras"
            
            else --Hvis man velger kun ETT kamera
            (
               --Sjekker objekter for hver pixel, evt. hver pixel med mellomrom satt av pointJump
               for X = 0 to (getViewSize()).x - 1 by resolution do
               (
                  --Progress bar
                  if X <((getViewSize()).x - 1) then ProgBar_frame.value = (X/((getViewSize()).x - 1))*100 else ProgBar_frame.value = 0
                  
                     --Sjekker objekter for hver pixel, evt. hver pixel med mellomrom satt av pointJump
                  for Y = 0 to (getViewSize()).y - 1 by resolution do
                  (
                     rayFire (mapScreenToWorldRay [x,y])
                  )
               )--SLUTT på objektsjekk på hver pixel
            )--SLUTT på å sende ut rays for det valgte kameraet
         )--SLUTT screen- funksjon
      )--SLUTT numFrames for loop
      
      --Objekter som finnes i "objArray", men ikke i "visibleObjects" puttes i "inVisibleObjects"
      for i = objArray where ((findItem visibleObjects i) == 0) do appendifUnique inVisibleObjects i
      free objArray --Tømmes for å klargjøres til en evt. ny runde
      free visibleObjects --Tømmes for å klargjøres til en evt. ny runde
   )--SLUTT på btn_run pressed
   
   on btn_selectInVisibleObjects pressed do
   (
      select (for i = objects where ((findItem inVisibleObjects i) != 0) collect i)
   )
   
   on btn_deleteInVisibleObjects pressed do
   (
      delete (for i = objects where ((findItem inVisibleObjects i) != 0) collect i)
   )
   
   on btn_freeAll pressed do free inVisibleObjects
   
)-- SLUTT rollout removeInvisibleObjects
createDialog removeInvisibleObjects 400 750
)--SLUTT script

[/spoiler]
if your not living on a killing ground, you better make your own

Brukeravatar

tassel
Innlegg: 3986
Registrert: man 26 sep, 2005
Sted: Oslo
Kontakt:

Legg innav tassel » man 03 des, 2012

Kjekkt script, du er blitt en racer :)
Jeg endret litt på plassering på UI'et ditt. Håper det ikke gjør noe :)

Trykk under for å se scriptet:
[spoiler]

Kode: Velg alt


--START Script
 (   
   --Array som inneholder alle points som evt. lages ved preview
   local array_previewPoints = #()

   --Array som inneholder previewPoints posisjoner før de flyttes med spinnere
   local array_previewPointsZeroPos = #()
   
   --Array som inneholder previewPoints posisjoner før de flyttes med spinnere
   local array_previewPointsTruePos = #()
   
   -- Variabel som inneholder geometrisk sphere som evt lages ved preview
   local previewGeometry
   
   --Array som holder alle objekter som er aktuelle for sjekk
   local objArray = #()
   
   --Array som holder alle objekter som er synlige etter sjekk. Tilhører funksjonen rayFire
   local visibleObjects = #()
   
   --Array som inneholder alle objekter som ikke er synlige. MERK: Objekter vil akkumuleres i dette arrayet helt til man tømmer det med "btn_freeAll"
   local inVisibleObjects = #()
   
   --her legges items inn i dropDownList for choose view:
   local array_chooseView = #("Surround Scene", "Active Viewport")
   for o = objects where superClassOf o == camera do append array_chooseView (o.name as string)--Kameraer legges til
   append array_chooseView "All Cameras"
   
   --Her legges items inn i dropDownList for choose resolution:
   local array_chooseResolution = #("1\1", "1\4", "1\16", "1\64", "1\256", "1\1024", "1\4096")


rollout removeInvisibleObjects "Remove Invisible Objects V1.0"
(   
   --START interface:
   dropDownList DDL_chooseView "Choose View:" items: array_chooseView width:260 height:22 align:#center
   dropDownList DDL_chooseResolution "Choose Resolution:" items: array_chooseResolution selection:5
   group "Objects Selection Refinement:"
   (
      Button btn_excludeSelObjects "Exclude Selected Objects" width:260 height:22 align:#center
      Button btn_includeSelObjects "Include Selected Objects" width:260 height:22 align:#center
      Button btn_includeAllObjects "Include All Objects" width:260 height:22 align:#center
      checkBox chk_includeFrozen "Include Frozen Objects"  align:#left
      checkBox chk_includeHidden "Include Hidden Objects"  align:#left
   )
   group "Surround sphere options:"
   (
      pickbutton pBtn_getCenterFromObject "Get Center Coordinates From Object"  width:260 height:22 align:#center
      spinner spn_surroundXPos "Choose Surround Center X Position:" range:[-999999,999999,0]  width:180 align:#right
      spinner spn_surroundYPos "Choose Surround Center Y Position:" range:[-999999,999999,0] width:180 align:#right
      spinner spn_surroundZPos "Choose Surround Center Z Position:" range:[-999999,999999,0] width:180 align:#right
      spinner spn_surroundRadius "Surround Scene Radius:" range:[1,999999,100] width:145 align:#right
   )
   group "Preview:"
   (
      checkBox chk_previewAsGeometry "Preview As Geometry" checked:true
     label lbltxt1 "(Number Of Vertices Indicate Density)" width:260 align:#left
      checkbutton chkBtn_previewSurround "Preview Surround"  width:260 height:22 align:#center
   )
   group "Animation:"
   (
      spinner spn_rangeStart "Animation Range Start:" type:#integer width:152 align:#right
      spinner spn_rangeEnd "Animation Range End:" type:#integer width:148 align:#right
      spinner spn_jumpNumFrames "Check Every Number Of Frames:" type:#integer range:[1,999999,1] width:180 align:#right
   )
   
   Button btn_run "..:: RUN ::.." width:260 height:22 align:#center
   label lbl_ProgBar_frame "Frame Progress:" width:260 height:18 align:#center
   progressbar ProgBar_frame
   
   group "Operation:"
   (
      button btn_selectInVisibleObjects "Select Invisible Objects" across:2
      button btn_deleteInVisibleObjects "Delete Invisible Objects"
   )
   group "Invisible Objects Accumulation:"
   (
      button btn_freeAll "Free Storage Of Invisible Objects" width:260 height:22 align:#center
      label lbl_freeAll1 "Objects Stored As <not visible>"
      label lbl_freeAll2 " Will Accumulate Until This Button Is Pressed!"
   )
   --SLUTT interface
   
   
   --START senterkoordinater etter objekt
   on pBtn_getCenterFromObject picked obj do
   (
      spn_surroundXPos.value = obj.pos.x
      spn_surroundYPos.value = obj.pos.y
      spn_surroundZPos.value = obj.pos.z
   )
   --SLUTT senterkoordianter etter objekt   
   
   --START eksludering av objekter etter brukervalg
   local array_excludeSelObjects =#()
   
   on btn_excludeSelObjects pressed do
   (
      for o = selection where superClassOf o == geometryClass and classOf o != targetObject \
      do appendifUnique array_excludeSelObjects o
   )
   
   
   on btn_includeSelObjects pressed do
   (
      for o = selection do
      (
         item = (findItem array_excludeSelObjects o)
         if item != 0 do deleteItem array_excludeSelObjects item
      )
   )
   
   
   on btn_includeAllObjects pressed do
   (
      free array_excludeSelObjects
   )
   --Resultatet finnes i arrayet "array_excludeSelObjects"
   --SLUTT på eksludering av objekter etter brukervalg.
   
   
   --Enable\disable preview-knapp etter valg av type objektsjekk
   on DDL_chooseView selected sel do
   (
      if sel != 1 then chkBtn_previewSurround.enabled = false else chkBtn_previewSurround.enabled = true
   )--SLUTT enable\disable preview-knapp
   
   --START preview på
   on chkBtn_previewSurround changed onOff do --Hele denne delen aktiveres hver gang man forandrer status på previewknappen
   (
      if onOff == true do--Knappen er trykket ned
      (
         local posCenter = [spn_surroundXPos.value, spn_surroundYPos.value, spn_surroundZPos.value]
         local rad = spn_surroundRadius.value
         local resolution = DDL_chooseResolution.selection as integer--Brukes i alle "by" i for-loops
         local pointJump = 360  -- variabel pointJump som bestemmer tettheten mellom sjekkpunktene for surround. Default 360
         
         local array_verts = #()--Array for vertices   
         local array_faces = #()--Array for faces
         
         for Z = -90 to 90 by pointJump do --Det lages en sirkel med punkter rundt hvert punkt på Z-aksen
         (
            --Sørger for at det kun er et punkt i senter i bånn av kula
            if Z == -90 or Z == 90 then pointJump = 360 else pointJump = resolution
            if pointJump <0 do pointJump = -pointJump --Sørger for at pointJump (setter mellomrom mellom punkter) alltid er positiv.
               
            for XY = 1 to 360 by pointJump do--Sirkelen med punkter som lages rundt hvert Z-punkt
            (
               local pointPos = [cos XY*rad*cos Z, sin XY*rad*cos Z, sin Z*rad] --Punktenes posisjon
               append array_previewPointsZeroPos pointPos -- Posisjonen puttes i array for å kunne flyttes ved forandring av spinnere under preview
               local pointDir = normalize posCenter - pointPos --Punktenes retning
               local pointPos = pointPos + posCenter --PosCenter henter posisjonsverdier fra XYZ-spinnere og legger dem til i variabel pointPos
               append array_previewPointsTruePos pointPos --Posisjonskoordinater etter flytting legges inn her
               
               append array_verts pointPos --Hver posisjon (point3) legges inn i array_verts for å brukes til den geometriske preview-spheren
               
               if (chk_previewAsGeometry.checked == false) do--Punkter lages hvis det ikke er huket av for å lage geometri isteden
               (
                  append array_previewPoints (point pos:pointPos dir:pointDir wirecolor:[0,255,0] name:"previewPoint" size:1)
               )
            )
            if pointJump == 360 do pointJump =  resolution--Forsikrer at pointJump ikke er 360 ved start på neste for-syklus
         )
         
         if chk_previewAsGeometry.checked == true do--Hvis det er bestemt at det skal lages en geometrisk sphere isteden for punkter
         (
            for i = 1 to array_verts.count - (360/resolution) - 1 do --Det lages faces som puttes i array_faces
            (
               v1 = i
               v2 = i + 1
               v3 = i + (360/resolution)
               v4 = i + (360/resolution) + 1
               
               triangle1 = [v1,v2,v3]
               triangle2 = [v2,v4,v3]
               
               append array_faces triangle1
               append array_faces triangle2
            )
             
            previewGeometry = (mesh vertices:array_verts faces:array_faces \
            wirecolor:[0,255,0] name:"previewSphere")--Geometrisk sphere lages
            previewGeometry.pivot = previewGeometry.center
         )
      )--SLUTT preview på
       
       
      --START preview av
      if onOff == false do
      (
         try (delete previewGeometry) catch ()
         delete array_previewPoints
         free array_previewPoints
         free array_previewPointsZeroPos
      )--SLUTT preview av
   )--SLUTT på alt som har med aktivering\deaktivering av preview-knapp å gjøre
   
   
   on btn_run pressed do --RUN
   (
      --START fjern previewobjekter
      try (delete previewGeometry) catch ()
      for i = array_previewPoints do delete i
      free array_previewPoint
      if chk_previewAsGeometry.checked == false do chk_previewAsGeometry.checked = true
      --SLUTT fjern previewobjekter
       
      --START objektsortering
      --Sorterer ut objekter som skal være med i vurderingen, inkludert brukervalg. Puttes til slutt i arrayet "objArray" på toppen av scriptet
      for o = geometry where classOf o != targetObject \
      and (if chk_includeFrozen.checked == true then (o.isFrozen == true or o.isFrozen == false) else o.isFrozen == false ) \
      and (if chk_includeHidden.checked == true then (o.isHidden == true or o.isHidden == false) else o.isHidden == false ) \
      and (if (findItem array_excludeSelObjects o != 0) then false else true) \
      do appendIfUnique objArray o
      --objArray som inneholder alle objekter som skal sjekkes, ligger på toppen av scriptet
      --SLUTT objektsortering
       
       
      --START rayfire-funksjon
      --Selve funksjonen som kjøres for hver pixel. arrayet "visibleObjects" finnes helt på toppen i scriptet
      fn rayFire pointRay =
      (
         local dist = 999999.0 --gammel distanse
         local newDist = 999999.0 --ny distanse for å sjekke om den er kortere enn den gamle
         local obj --Variabel som holder objektet som er nærmest
         
         for o = objArray do
         (
            intRay = intersectRay o pointRay
             
            if intRay != undefined do
            (
               if (newDist = (length (pointRay.pos - intRay.pos))) <dist do
               (
                  obj = o --objektet som er nærmere enn forige sjekkede opbjekt puttes i variabel obj
                  dist = newDist --Dette objektets distanse settes i variabel dist, slik at neste objekt kan bruke dette som "gammel distanse"
               )
            )
         )
         --Objektet med den korteste distansen fra kameraet blir puttet i arrayet for objekter som skal taes vare på
         if obj != undefined do (appendifUnique visibleObjects obj)
      )--SLUTT rayFire-funksjon
       
       
      local numFrames = spn_rangeEnd.value - spn_rangeStart.value --Teller antall frames som er satt av spinnere
       
      for i = 0 to numFrames by (spn_jumpNumFrames.value) do --Hele pakka kjøres en gang for hver frame
      (
         sliderTime = spn_rangeStart.value + i
         
         --START surround
         if DDL_chooseView.selection == 1 do --SURROUND SCENE
         (
            local posCenter = [spn_surroundXPos.value, spn_surroundYPos.value, spn_surroundZPos.value]
            local rad = spn_surroundRadius.value
            local resolution = DDL_chooseResolution.selection as integer
             
            local pointJump = 360--Variabel som bestemmer "by" i for loops slik at man kan redusere "oppløsning"
             
            for Z = -90 to 90 by pointJump do --Det skal lages en sirkel med rayPunkter (XY) rundt hvert punkt på Z-aksen (Z)
            (
               if Z ==  -90 or Z == 90 then pointJump = 360 else pointJump = resolution--Sikrer kun et raypunkt i topp og bånn
               if pointJump <0 do pointJump = -pointJump -- Sørger for at pointJump alltid er et positivt tall
                   
               for XY = 1 to 360 by pointJump do --Det skal lages en sirkel med punkter (XY) rundt hvert punkt på Z-aksen (Z)
               (
                  local pointPos = [cos XY*rad*cos Z, sin XY*rad*cos Z, sin Z*rad] --Posisjonskoordianter for rays
                  local pointDir = normalize posCenter - pointPos --Retningskoordianter for rays
                  local pointPos = pointPos + posCenter --Manuelle posisjonskoordianter legges til
                   
                  rayFire (ray pointPos pointDir) --Funksjonen kjøres
               )
               if pointJump == 360 do pointJump =  resolution --Sørger for at pointJump alltid starter med "resolution" som utgangspunkt
            )--SLUTT på å klatre på Z-aksen
         )--SLUTT surround
         
         
         --START screen
         if DDL_chooseView.selection >= 2 do --CURRENT VIEW, KAMERAER, ALLE KAMERAER
         (
            local resolution = DDL_chooseResolution.selection as integer--oppløsning for rays som sendes ut
             
            if DDL_chooseView.selection >=3 and DDL_chooseView.selection <array_chooseView.count  do
            -- Hvis et av kameraene velges, settes viewport automatisk til det når scriptet starter
            (
               viewPort.setCamera (getNodeByName array_chooseView[DDL_chooseView.selection as integer])
            )
             
            if DDL_chooseView.selection == array_chooseView.count and array_chooseView.count >=4  then
            --Hvis man velger "all cameras" (siste valg i menyen), og det faktisk er kameraer i scenen gjøres dette:
            (
               for i = 3 to (array_chooseView.count-1) do--En omgang for hvert kamera
               (
                  viewPort.setCamera (getNodeByName array_chooseView[i])--Viewport settes hele tiden til riktig kamera
                   
                  --Sjekker objekter for hver pixel, evt. hver pixel med mellomrom satt av pointJump
                  for X = 0 to (getViewSize()).x - 1 by resolution do
                  (
                     --Progress bar
                     if X <((getViewSize()).x - 1) then ProgBar_frame.value = (X/((getViewSize()).x - 1))*100 else ProgBar_frame.value = 0
                     if ProgBar_frame.value == 100 do ProgBar_frame.value = 0
                     
                     --Sjekker objekter for hver pixel, evt. hver pixel med mellomrom satt av pointJump
                     for Y = 0 to (getViewSize()).y - 1 by resolution do
                     (
                        rayFire (mapScreenToWorldRay [x,y])
                     )
                  )--SLUTT på objektsjekk på hver pixel
               )--SLUTT på en gjennomgang på alle kameraer
            )--SLUTT på brukervalget "all cameras"
             
            else --Hvis man velger kun ETT kamera
            (
               --Sjekker objekter for hver pixel, evt. hver pixel med mellomrom satt av pointJump
               for X = 0 to (getViewSize()).x - 1 by resolution do
               (
                  --Progress bar
                  if X <((getViewSize()).x - 1) then ProgBar_frame.value = (X/((getViewSize()).x - 1))*100 else ProgBar_frame.value = 0
                   
                     --Sjekker objekter for hver pixel, evt. hver pixel med mellomrom satt av pointJump
                  for Y = 0 to (getViewSize()).y - 1 by resolution do
                  (
                     rayFire (mapScreenToWorldRay [x,y])
                  )
               )--SLUTT på objektsjekk på hver pixel
            )--SLUTT på å sende ut rays for det valgte kameraet
         )--SLUTT screen- funksjon
      )--SLUTT numFrames for loop
       
      --Objekter som finnes i "objArray", men ikke i "visibleObjects" puttes i "inVisibleObjects"
      for i = objArray where ((findItem visibleObjects i) == 0) do appendifUnique inVisibleObjects i
      free objArray --Tømmes for å klargjøres til en evt. ny runde
      free visibleObjects --Tømmes for å klargjøres til en evt. ny runde
   )--SLUTT på btn_run pressed
   
   on btn_selectInVisibleObjects pressed do
   (
      select (for i = objects where ((findItem inVisibleObjects i) != 0) collect i)
   )
   
   on btn_deleteInVisibleObjects pressed do
   (
      delete (for i = objects where ((findItem inVisibleObjects i) != 0) collect i)
   )
   
   on btn_freeAll pressed do free inVisibleObjects
   
   )-- SLUTT rollout removeInvisibleObjects

   createDialog removeInvisibleObjects width:280 height:760 pos:[250,120]
)
--SLUTT script


[/spoiler]


Trådstarter
hardrock_ram
Innlegg: 1502
Registrert: ons 07 feb, 2007
Sted: Kristiansand

Legg innav hardrock_ram » tir 04 des, 2012

No problem ;) UI`et er kanskje ikke den delen jeg la mest arbeid i, for å si det sånn :P.

For en liten stund siden kom jeg også over en problemfiks til progression bar`en. Den fungerer kun på visse deler av scriptet fordi den ikke oppdaterte seg som den skulle ellers. Skal se om jeg kan få fiksa det siden :)
if your not living on a killing ground, you better make your own


Gå tilbake til «Max scripts»

Hvem er online

Brukere i dette forumet: Ingen registrerte brukere og 2 gjester

cron