Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @name Ranger camera V2
- @persist S:wirelink Res Materials:array Image:table Image2:table Mat:table T DT AT Loading Scanning CV:vector CA:angle PixelSize Range Delta:vector2
- runOnTick(1)
- runOnFile(1)
- runOnChat(1)
- if(first()){
- S = entity():isConstrainedTo():wirelink()
- function wirelink:initScreen(Res){
- This[1048574]=0
- This[1048569]=3
- This[1048575]=1
- This[1048572]=Res
- This[1048573]=Res
- }
- function wirelink:drawPixel(X, Y, Color:vector, Res){
- This[X+Y*Res]=rgb2digi(Color, 3)
- Image[X+1, array]:setVector(Y+1, Color)
- }
- function wirelink:drawLine(X, Y, Down, Len, Color:vector, Res){
- if(Down){
- for(I=1, Len){
- This:drawPixel(X, Y+I-1, Color, Res)
- }
- }else{
- for(I=1, Len){
- This:drawPixel(X+I-1, Y, Color, Res)
- }
- }
- }
- function vector g(X, Y){
- return Image2[X+1, array]:vector(Y+1)
- }
- function vector array:averageV(){
- AR = array()
- AG = array()
- AB = array()
- foreach(K, V:vector=This){
- AR:pushNumber(V:x())
- AG:pushNumber(V:y())
- AB:pushNumber(V:z())
- }
- return vec(AR:average(), AG:average(), AB:average())
- }
- function wirelink:aa(X, Y, Res){
- if(X==0 & Y==0){
- This:drawPixel(X, Y, array(g(0,0), g(0,0), g(1,0), g(0,1), g(1,1)):averageV(), Res)
- }elseif(X==Res-1 & Y==0){
- This:drawPixel(X, Y, array(g(Res-1,0), g(Res-1,0), g(Res-2,0), g(Res-1,1), g(Res-2,1)):averageV(), Res)
- }elseif(X==0 & Y==Res-1){
- This:drawPixel(X, Y, array(g(0,Res-1), g(0,Res-1), g(1,Res-1), g(0,Res-2), g(1,Res-2)):averageV(), Res)
- }elseif(X==Res-1 & Y==Res-1){
- This:drawPixel(X, Y, array(g(Res-1,Res-1), g(Res-1,Res-1), g(Res-2,Res-1), g(Res-1,Res-2), g(Res-2,Res-2)):averageV(), Res)
- }elseif(X==0){
- This:drawPixel(X, Y, array(g(0,Y-1), g(1,Y-1), g(0,Y), g(0,Y), g(0,Y), g(1,Y), g(0,Y+1), g(1,Y+1)):averageV(), Res)
- }elseif(X==Res-1){
- This:drawPixel(X, Y, array(g(Res-1,Y-1), g(Res-2,Y-1), g(Res-1,Y), g(Res-1,Y), g(Res-1,Y), g(Res-2,Y), g(Res-1,Y+1), g(Res-2,Y+1)):averageV(), Res)
- }elseif(Y==0){
- This:drawPixel(X, Y, array(g(X-1,0), g(X-1,1), g(X,0), g(X,0), g(X,0), g(X,1), g(X+1,0), g(X+1,1)):averageV(), Res)
- }elseif(Y==Res-1){
- This:drawPixel(X, Y, array(g(X-1,Res-1), g(X-1,Res-2), g(X,Res-1), g(X,Res-1), g(X,Res-1), g(X,Res-2), g(X+1,Res-1), g(X+1,Res-2)):averageV(), Res)
- }else{
- This:drawPixel(X, Y, array(g(X-1,Y-1), g(X-1,Y), g(X-1,Y+1), g(X,Y-1), g(X,Y), g(X,Y), g(X,Y), g(X,Y), g(X,Y), g(X,Y), g(X,Y+1), g(X+1,Y-1), g(X+1,Y), g(X+1,Y+1)):averageV(), Res)
- }
- }
- Res = 128
- PixelSize = 3
- S:initScreen(Res)
- rangerPersist(1)
- rangerFilter(players())
- rangerIgnoreWorld(0)
- Materials = array("wood", "metal", "concrete", "tile", "plastic", "dirt", "grass")
- Image = table()
- Image2 = table()
- for(I=1,Res){
- Image:pushArray(array())
- Image2:pushArray(array())
- }
- S:drawLine(3, 3, 0, Materials:count()*4+2, vec(100,255,0), Res)
- S:drawLine(3, 4, 1, 2, vec(100,255,0), Res)
- S:drawLine(3, 6, 0, Materials:count()*4+2, vec(100,255,0), Res)
- S:drawLine(Materials:count()*4+4, 4, 1, 2, vec(100,255,0), Res)
- Delta = vec2(1, 0)
- }else{
- rangerFilter(players())
- if(T<Materials:count() & fileCanLoad() & !Loading){
- fileLoad(">e2shared/"+Materials:string(T+1)+".txt")
- S:drawLine(4+T*4, 4, 0, 4, vec(80,204,0), Res)
- S:drawLine(4+T*4, 5, 0, 4, vec(80,204,0), Res)
- Loading = 1
- }elseif(T<Materials:count() & fileClk() & Loading){
- print("Loaded "+Materials:string(T+1))
- Mat[Materials:string(T+1), table] = vonDecodeTable(fileRead())
- Loading = 0
- T++
- }
- if(T==Materials:count()){
- S:initScreen(Res)
- T++
- }
- while(perf(90)){
- #[ TEXTURE TEST ] #
- if(T>=Materials:count() & DT<256*Materials:count()){
- PI = floor(DT/256)
- PX = (DT%16)
- PY = floor(DT/16)%16
- S:drawPixel(PX+array(0,1,1,0,1,2,2,2):number(PI)*16, PY+array(1,0,1,2,2,2,1,0):number(PI)*16, Mat[Materials:string(PI+1), table][PY+1, array]:vector(PX+1), Res)
- DT++
- }
- if(DT==Res*Res*Materials:count()){print("Done drawing"), DT++}
- #[ RANGER CAMERA ]#
- if(T>=Materials:count() & Scanning & DT<Res*Res){
- PX = DT%Res
- PY = floor(DT/Res)
- R = rangerOffset(100000, CV, CA:forward()-CA:up()*(2*PY/Res-1)+CA:right()*(2*PX/Res-1))
- if(R:hit()){
- MatT = R:matType()
- Pos = R:hitWorld()? R:position() : R:entity():toLocal(R:position())
- Box = R:entity():boxSize()
- Pi = floor((Pos-(R:hitWorld()? vec() : Box))/PixelSize)
- if(R:hitWorld()){
- Norm = R:hitNormal()
- if(round(abs(Norm:x()))==1){
- PiX = Pi:z()%16
- PiY = Pi:y()%16
- }elseif(round(abs(Norm:y()))==1){
- PiX = Pi:z()%16
- PiY = Pi:x()%16
- }else{
- PiX = Pi:x()%16
- PiY = Pi:y()%16
- }
- }else{
- PiX = (Pi:x()+(Pi:z()*(abs(abs(Pos:x())-abs(Box:x()/2))<2) ))%16
- PiY = (Pi:y()+(Pi:z()*(abs(abs(Pos:y())-abs(Box:y()/2))<2) ))%16
- }
- Ra = R:position():distance(CV)
- Image2[PX+1, array]:setVector(PY+1, clamp((Range-Ra)/Range, 0, 1)*Mat[MatT, table][PiX+1, array]:vector(PiY+1))
- }else{
- Image2[PX+1, array]:setVector(PY+1, clamp((Range-Ra)/Range, 0, 1)*Mat[MatT, table][PiX+1, array]:vector(PiY+1))
- }
- S:drawPixel(PX, PY, vec(255,0,0), Res)
- DT++
- if(changed(time())){
- Time = (Res*Res-DT)/(Delta:x()-Delta:y())
- setName("Taking the picture... "+round(DT/(0.01*Res*Res))+"% Estimated time until completion: "+floor(Time/60)+"m "+round(Time%60)+"s")
- Delta = vec2(DT, Delta:x())
- }
- }
- #[ BLUR ]#
- if(DT>Res+1 & AT<Res*Res){
- PX = AT%Res
- PY = floor(AT/Res)
- S:aa(PX, PY, Res)
- AT++
- }
- #[ NO BLUR ] #
- if(DT>Res+1 & AT<Res*Res){
- PX = AT%Res
- PY = floor(AT/Res)
- S:drawPixel(PX, PY, g(PX, PY), Res)
- AT++
- }
- #]#
- }
- }
- if(chatClk(owner())){
- if(owner():lastSaid()=="/cam" & DT==0){
- hideChat(1)
- CV = owner():shootPos()
- CA = owner():eyeAngles()
- Range = CV:distance(owner():aimPos())*8
- holoCreate(1, CV)
- holoAng(1, CA)
- holoModel(1, "models/dav0r/camera.mdl")
- #[holoCreate(2, CV-CA:right()*Size/2+CA:up()*Size/2)
- holoScale(2, vec(0.2))
- holoAng(2, CA)
- holoCreate(3, CV+CA:right()*Size/2-CA:up()*Size/2)
- holoScale(3, vec(0.2))
- holoAng(3, CA)]#
- Scanning = 1
- print("Range is "+Range)
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement