| 08-10-2008, 10:14 PM | #1 |
this is a struct as part of my camera system for generating camera map, for absolute camera movement, sadly blizzard is too gay, i cant get the values exact... i dont know wat i have done wrong, everything seems right. The concept is moving camera to each vertex on the terrain and get the Z for tat, and then calculate the Z value in between those using some geometry math. The system would first move the camera to a vertex position, example (0,0). Then it will wait 0.01 to ensure the camera is updated then it will GetCameraTargetPositionZ() and store them to gamecache with X as missionkey and Y as key. But things just doesnt work out well... Maybe someone can try to debug it and find something i havent seen... methods: -CameraMap.Generate() - This will generate the camera map, takes some time -CameraMap.GetZ(x,y) - this will get the camera map Z at a coordinate after the map has been generated, else it will just give 0. JASS://---------------------------------------// // CAMERA MAPPING //---------------------------------------// struct CameraMap private static integer X private static integer Y private static gamecache gc private static integer MaxX private static integer MaxY private static integer MinX private static integer MinY private static integer dx private static integer dy private static timer Tmr private static boolean Checking private static integer Vertices private static integer TotalVertices private static method onInit takes nothing returns nothing set CameraMap.MaxX = R2I(GetCameraBoundMaxX()) set CameraMap.MaxY = R2I(GetCameraBoundMaxY()) set CameraMap.MinX = R2I(GetCameraBoundMinX()) set CameraMap.MinY = R2I(GetCameraBoundMinY()) set CameraMap.gc = InitGameCache("cm.w3v") set CameraMap.TotalVertices = R2I(1+(CameraMap.MaxX-CameraMap.MinX)/128)*R2I(1+(CameraMap.MaxY-CameraMap.MinY)/128) endmethod private static method Scan takes nothing returns nothing if (CameraMap.Checking) then call StoreReal(CameraMap.gc,I2S(CameraMap.X),I2S(CameraMap.Y),GetCameraTargetPositionZ()) set CameraMap.Vertices = CameraMap.Vertices+1 //Stats call ClearTextMessages() call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,0.3,"MaDCam is generating camera map:") call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,0.3,"-Vertex: ("+I2S(CameraMap.X)+","+I2S(CameraMap.Y)+")") call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,0.3,"-Vertices: "+I2S(CameraMap.Vertices)+"/"+I2S(CameraMap.TotalVertices)) call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,0.3,"-ETA: "+R2S(I2R(CameraMap.TotalVertices)*0.02-(CameraMap.Vertices)*0.02)+"s") call DisplayTimedTextToPlayer(GetLocalPlayer(),0,0,0.3,"-Progress: |cffffcc00"+SubString("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!",0,1+80*CameraMap.Vertices/CameraMap.TotalVertices)+"|r - "+I2S(R2I(100*CameraMap.Vertices/CameraMap.TotalVertices))+"%") //-- set CameraMap.X = CameraMap.X+(128*CameraMap.dx) //Scanning sectors if ((CameraMap.X>CameraMap.MaxX) or (CameraMap.X<CameraMap.MinX)) then if (CameraMap.dx==-1) then set CameraMap.X = -128 else set CameraMap.X = 0 endif set CameraMap.Y = CameraMap.Y+(128*CameraMap.dy) endif //Switching sectors if ((CameraMap.Y>CameraMap.MaxY) or (CameraMap.Y<CameraMap.MinY)) then set CameraMap.dx = CameraMap.dx*CameraMap.dy set CameraMap.dy = CameraMap.dy*-1 if (CameraMap.dx==-1) then set CameraMap.X = -128 else set CameraMap.X = 0 endif if (CameraMap.dy==-1) then set CameraMap.Y = -128 else set CameraMap.Y = 0 endif if ((CameraMap.dx==1) and (CameraMap.dy==1)) then call DestroyTimer(CameraMap.Tmr) set CameraMap.Tmr = null call ShowInterface(true, 1) call CinematicFadeBJ( bj_CINEFADETYPE_FADEIN, 1.00, "ReplaceableTextures\\CameraMasks\\White_mask.blp", 0, 0, 0, 0 ) endif endif set CameraMap.Checking=false else call SetCameraPosition(CameraMap.X,CameraMap.Y) set CameraMap.Checking=true endif endmethod static method Generate takes nothing returns nothing set CameraMap.Tmr = CreateTimer() set CameraMap.X = 0 set CameraMap.Y = 0 set CameraMap.dx = 1 set CameraMap.dy = 1 set CameraMap.Vertices = 0 set CameraMap.Checking = false call CinematicFadeBJ( bj_CINEFADETYPE_FADEOUT, 0.00, "ReplaceableTextures\\CameraMasks\\White_mask.blp", 0, 0, 0, 0 ) call TimerStart(CameraMap.Tmr,0.01,true,function CameraMap.Scan) call ShowInterface(false, 0) endmethod static method GetZ takes real X, real Y returns real local real Z //Points local real xa = I2R(R2I(X/128)*128) local real ya = I2R(R2I(Y/128)*128) local real za local real xb local real yb local real zb local real xc local real yc local real zc local real xd local real yd local real zd //vectors local real v0x local real v0y local real v1x local real v1y local real v2x local real v2y //dot products local real dot00 local real dot01 local real dot02 local real dot11 local real dot12 local real DotDivisor //factor for triangle test and calculating Z local real u local real v //Compute points if (X<0) then set xa = xa-128 endif if (Y>=0) then set ya = ya+128 endif set xb = xa+128 set yb = ya set xc = xb set yc = ya-128 set xd = xa set yd = yc //Compute vectors set v0x = xc-xa set v0y = yc-ya set v1x = xb-xa set v1y = yb-ya set v2x = X-xa set v2y = Y-ya //Compute dot products set dot00 = v0x*v0x + v0y*v0y set dot01 = v0x*v1x + v0y*v1y set dot02 = v0x*v2x + v0y*v2y set dot11 = v1x*v1x + v1y*v1y set dot12 = v1x*v2x + v1y*v2y // Compute barycentric coordinates set DotDivisor = 1/(dot00*dot11 - dot01*dot01) set u = (dot11*dot02 - dot01*dot12)*DotDivisor set v = (dot00*dot12 - dot01*dot02)*DotDivisor //Check if point is inside triangle ABC else its in ACD if ((u>0) and (v>0) and (u+v<1)) then set u = (xb-X)/128 set v = (yb-Y)/128 set za = GetStoredReal(CameraMap.gc,I2S(R2I(xa)),I2S(R2I(ya))) set zb = GetStoredReal(CameraMap.gc,I2S(R2I(xb)),I2S(R2I(yb))) set zc = GetStoredReal(CameraMap.gc,I2S(R2I(xc)),I2S(R2I(yc))) set Z = zb + u*(za-zb) + v*(zc-zb) else set u = (X-xd)/128 set v = (Y-yd)/128 set za = GetStoredReal(CameraMap.gc,I2S(R2I(xa)),I2S(R2I(ya))) set zd = GetStoredReal(CameraMap.gc,I2S(R2I(xd)),I2S(R2I(yd))) set zc = GetStoredReal(CameraMap.gc,I2S(R2I(xc)),I2S(R2I(yc))) set Z = zd + u*(zc-zd) + v*(za-zd) endif return Z endmethod endstruct |
| 08-11-2008, 10:22 AM | #2 |
Because I'm a good person, I will share this with the world without insulting anybody in the process: JASS:function SetCameraZ takes real z returns nothing set z = GetCameraField(CAMERA_FIELD_ZOFFSET)+z-GetCameraTargetPositionZ() call SetCameraField(CAMERA_FIELD_ZOFFSET,z,- 0.01) call SetCameraField(CAMERA_FIELD_ZOFFSET,z,0.01) endfunction |
| 08-11-2008, 11:34 AM | #3 |
too bad im trying to make a system works for multiplayer ^^ edit: and ur function is for wat? |
| 08-11-2008, 01:20 PM | #4 | ||
Quote:
Quote:
now the most important question. "why do you need to generate camera map" !? -> -CameraMap.GetZ(x,y) "how i see you need the Z value" -> war3 camera use FORCED Z smoothing and it can't be turn off. so thats why the camera Z values are screwed. -> i post the way to set the absolute camera Z position. wtf ? now you continue =) |
| 08-11-2008, 05:43 PM | #5 |
ok tat function was nice thank you. But u still suck for ur fucked up behaviour XD For tat u must be punished. But since u helped me i will not give u bad rep :) |
| 08-11-2008, 06:29 PM | #6 | |
Quote:
|
| 08-11-2008, 07:03 PM | #7 | |
Quote:
do you think i am simply bad/evil ? lol... anything has a higher sense =) @Vex restore my post with the attached map... you may delete the rest text if you want. |
| 08-11-2008, 07:51 PM | #8 | |
Quote:
|
| 08-11-2008, 09:01 PM | #9 | |
Quote:
|
| 08-11-2008, 09:19 PM | #10 | |||
Quote:
this one -> Quote:
is the mega imba =) i needed 2 years to figure this out... cause I BET NO ONE ON EARTH (xD) no that what camera use somekind stack for this commands at least for timed Z change. and if doesnt get synced with the frames (YES FRAMES!) it will be "lost" and the camera will SELF change constant it's height and you CAN'T DO ANYTHING reset etc. doesnt work. so i just tested X thundret of times different ways. and in this year while developing TcX 1.03 if found out what if to call the camera change with - duration and after with the same but positive it will ballance the whole thing and no gliches will happen. hmm i can create a demo map to demo what i mean and to show what it does fix... the fact what blizz does use hardcoded camera param is a great phail... if they would read params from miscdata.txt this all would be useless... T_T (about the stack lost issues i am not sure =)) ok here is the map OFC you need to wait ~ 30 seconds... to see what i am talking about. after time is elapsed simply watch on your screen =) // @ Vex Quote:
ofc art etc. maybe done by someone else =) // we are currently in TS section ;) if you want you can ban me. it will not stop me from reading anyway. and from posting posts... or you want to get new hobbie stalking my clones ? xD IP is irrelevant =) |
| 08-11-2008, 09:52 PM | #11 |
i agree with toad in tat u have to make things urself, at least once to knwo how it works. Tats why i make my own systems eventho there already exists... just i understand my better and learn better. Toadcop is smart but he had this fucked up attitude which i dont get why lol Maybe he need a gf :P |
| 08-12-2008, 02:25 AM | #12 |
Offtopic: I think it's cause he's russian and thats just the russian mentality (I should know, im russian too). Back on topic: That negative time is brilliant! If only I had known about this months ago! |
| 08-12-2008, 03:37 AM | #13 | |
Quote:
The NIH syndrome KILLS people. One of the main libraries in the only map I ever made was Anitarf's vector system. |
| 08-12-2008, 10:01 AM | #14 | ||
Quote:
Quote:
btw i am not sure what you have understand... but the negative value is for avoiding camera glitches =) not to set he needed Z height =) |
| 08-15-2008, 01:32 PM | #15 |
Hey Toadcop or someone, I used this this Toadcops method to get exact camera height, and it is working fine, exepect that there is some nasty black flashes sometimes. Im not sure if its this Toadcops thingie what causes them or is it something else, does anyone knows anything about this? Im calculating terrain Z height, and changing camera height, so it matches terrain height. EDIT. I made some changes, and now Flashing starts after certain period of time, when game starts everything is ok. EDIT2, Could this have something to do with really big FarZ values? ( I think I fixed it now ) |
