Page 3 of 6

Re: Would A Classic Doom Inspired Game Work In LOVE2D?

Posted: Thu Jan 08, 2015 7:53 pm
by Jasoco
Davidobot wrote:Here's a example of raycasting engine done in LOVE, complete with floors, transparent blocks too.
Awesome job! You fixed a few of the problems I was having. But you seemingly forgot doors. (Which I had but were slightly buggy) Also, the floor and ceiling rendering should be replaced with a shader as the current method just doesn't look right at low resolutions.

Re: Would A Classic Doom Inspired Game Work In LOVE2D?

Posted: Fri Jan 09, 2015 11:54 am
by Davidobot
Jasoco wrote:
Davidobot wrote:Here's a example of raycasting engine done in LOVE, complete with floors, transparent blocks too.
Awesome job! You fixed a few of the problems I was having. But you seemingly forgot doors. (Which I had but were slightly buggy) Also, the floor and ceiling rendering should be replaced with a shader as the current method just doesn't look right at low resolutions.
What were the problems that you had? And yeah... I kinda didn't do the doors. Yet! Probably soon..... And I will probably replace the floor with a shader, like that of xXMonkeyManXx.

Re: Would A Classic Doom Inspired Game Work In LOVE2D?

Posted: Fri Jan 09, 2015 2:01 pm
by Jasoco
I could never get see-through walls to work. (I tried to figure out how the raycasting routine worked so I could make it continue casting when it hit a see-through wall and just add that wall as a reference but it never worked right.)

But I did do see-through doors since they were rendered independently of the walls.

Re: Would A Classic Doom Inspired Game Work In LOVE2D?

Posted: Fri Jan 09, 2015 5:43 pm
by lelSkrub
have not tried it yet, but this could be useful
viewtopic.php?f=5&t=11307

Re: Would A Classic Doom Inspired Game Work In LOVE2D?

Posted: Sat Jan 10, 2015 8:44 am
by Davidobot
Jasoco wrote:I could never get see-through walls to work. (I tried to figure out how the raycasting routine worked so I could make it continue casting when it hit a see-through wall and just add that wall as a reference but it never worked right.)

But I did do see-through doors since they were rendered independently of the walls.
I'm trying to get doors to work using this shader: (You are very much familiar with it)

Code: Select all

--By xXxMoNkEyMaNxXx
--[[Complete API----  This was made to be a module, PLEASE USE IT AS A MODULE

   .cw=false
   -Counter clockwise vertex order starting at top left.

   .cw=true
   -Clockwise vertex order starting at top left.


   .preload(loadup):

   -loadup==true sets pixel effect to polygon texturer,
   -loadup==false clears any pixel effect.
   *NOTE: preload(false) must be done to draw blank polygons after textured ones.


   .setRepeat(origin,size):
   -Makes the image repeat every 'size' starting at 'origin'.
   -The default is origin={0,0},size={1,1}.


   .quad(image,v1,v2,v3,v4) - Draws a polygon.

   -if 'image' is nil, the function will prepare to make it blank.


   .quad(v1,v2,v3,v4) - draws a polygon with no image.


   .fast(image,v1,v2,v3,v4) - draws a polygon with 'image' on it.
   -slightly(!!!) faster than quad.
   -Must include an image.
   -Must call .preload(true) beforehand.


   Info:
   Vertices are in the form {x,y}.
   Vertices go clockwise from the top left.

   v1---v2
   | img |
   v4---v3
--]]
local glsl=love.graphics.newShader[[
//Made by xXxMoNkEyMaNxXx

extern Image img;
extern vec2 v1;
extern vec2 v2;
extern vec2 v3;
extern vec2 v4;

extern vec2 p0;
extern vec2 rep;

extern number SIZEY;//So annoying

vec2 one=vec2(1.0,1.0);

number c(vec2 v1,vec2 v2)
{
   return v1.x*v2.y-v2.x*v1.y;
}
number intersect(vec2 v1,vec2 d1,vec2 v2,vec2 d2)
{
   //v1+d1*
   return c(v2-v1,d2)/c(d1,d2);
}
vec4 mask(vec4 base,vec4 over)
{
   return vec4(over.rgb*over.a+base.rgb*(1-over.a),over.a+base.a*(1-over.a));
}
vec4 effect(vec4 colour,Image UNUSED1,vec2 UNUSED2,vec2 inverted)
{
   vec2 p=vec2(inverted.x,SIZEY-inverted.y);//SO ANNOYING

   vec2 A1=normalize(v2-v1);
   vec2 A2=normalize(v3-v4);

   vec2 B1=normalize(v2-v3);
   vec2 B2=normalize(v1-v4);

   number Adiv=c(A1,A2);
   number Bdiv=c(B1,B2);

   vec2 uv;

   bvec2 eq0=bvec2(abs(Adiv)<=0.0001,abs(Bdiv)<=0.0001);
   if(eq0.x && eq0.y){
      //Both edges are parallel, therefore the shape is a parallelogram (Isometric)
      number dis=dot(p-v1,A1);

      //cos theta
      number ct=dot(A1,B1);

      //Closest point on v1->A1 to p
      vec2 pA=v1+A1*dis;

      //uv
      number r=length(p-pA)/sqrt(1-ct*ct);
      uv=vec2(1-r/length(v2-v3),(dis+r*ct)/length(v2-v1));
   }else if(eq0.x){
      //One Vanishing point occurs in numerically set scenarios in 3D, and is a feature of 2.5D

      //Horizon is A1 (=A2) from B
      vec2 Vp=v3+B1*c(v4-v3,B2)/Bdiv;

      //Some point in the distance that diagonals go to
      vec2 D=Vp+A1*intersect(Vp,A1,v4,normalize(v2-v4));

      //uv
      number u=intersect(v1,A1,Vp,normalize(p-Vp));
      number v=intersect(v1,A1,D,normalize(p-D))-u;

      number len=length(v2-v1);
      uv=vec2(len-v,u)/len;//Reversed components to match up with other one
   }else if(eq0.y){
      //If the other edge is the parallel one
      vec2 Vp=v1+A1*c(v4-v1,A2)/Adiv;
      vec2 D=Vp+B1*intersect(Vp,B1,v4,normalize(v2-v4));
      number u=intersect(v3,B1,Vp,normalize(p-Vp));
      number len=length(v2-v3);
      uv=vec2(u,len-intersect(v3,B1,D,normalize(p-D))+u)/len;
   }else{
      //Else, two vanishing points

      //*intersect(v1,A1,v4,A2)
      //*intersect(v3,B1,v4,B2)

      //Vanishing points
      vec2 A=v1+A1*c(v4-v1,A2)/Adiv;
      vec2 B=v3+B1*c(v4-v3,B2)/Bdiv;

      //Horizon
      vec2 H=normalize(A-B);

      //Pixel
      uv=vec2(intersect(v4,-H,A,normalize(p-A))/intersect(v4,-H,v2,-A1),intersect(v4,H,B,normalize(p-B))/intersect(v4,H,v2,-B1));
   }
   return mask(colour,Texel(img,mod(uv*rep+vec2(p0.x-1,p0.y),one)));
}
]]
local gl_send=glsl.send
local q=love.graphics.polygon
-- local lgr = love.graphics
local setEffect=love.graphics.setShader
gl_send(glsl,"SIZEY",love.graphics.getHeight())--So annoying
gl_send(glsl,"p0",{0,0})
gl_send(glsl,"rep",{1,1})

module(...)
cw=true--clockwise
function preload(loadup)
   if loadup then
      setEffect(glsl)
   else
      setEffect()
   end
end
function setRepeat(origin,size)
   gl_send(glsl,"p0",origin)
   gl_send(glsl,"rep",size)
end
function fast(img,v1,v2,v3,v4)
   gl_send(glsl,"img",img)
   gl_send(glsl,"v1",v2)
   gl_send(glsl,"v2",v3)
   gl_send(glsl,"v3",v4)
   gl_send(glsl,"v4",v1)
   q("fill",v1[1],v1[2],v2[1],v2[2],v3[1],v3[2],v4[1],v4[2])
end
function quad(img,v1,v2,v3,v4,h)
   if h then gl_send(glsl,"SIZEY",h) end
   if img and v4 then
      setEffect(glsl)
      gl_send(glsl,"img",img)
      if cw then
         gl_send(glsl,"v1",v2)
         gl_send(glsl,"v2",v3)
         gl_send(glsl,"v3",v4)
         gl_send(glsl,"v4",v1)
      else
         gl_send(glsl,"v1",v2)
         gl_send(glsl,"v2",v1)
         gl_send(glsl,"v3",v4)
         gl_send(glsl,"v4",v3)
      end
   else
      setEffect()
   end
   -- lgr.setBlendMode("premultiplied")
   if v4 then
      q("fill",v1[1],v1[2],v2[1],v2[2],v3[1],v3[2],v4[1],v4[2])
   else--img acts as a vertex
      q("fill",img[1],img[2],v1[1],v1[2],v2[1],v2[2],v3[1],v3[2])
   end
   -- lgr.setBlendMode("alpha")
   setEffect()
end
But for some reason, instead of drawing an image, the shader just draws a coloured polygon.
The doors are supposed to be those skin-coloured polygons.

EDIT:
Image
I even got the doors to have the right "angle"

Re: Would A Classic Doom Inspired Game Work In LOVE2D?

Posted: Sat Jan 10, 2015 12:29 pm
by Jasoco
The way I did doors was using a special raycasting function to cast each segment of the door (Each of which would each be a separate single line) and then those door segments would be added to my draw pool and sorted along with each of the wall segments and sprite objects. (By using a single line for each door I could manipulate it any way I wanted to. Eventually having swinging double doors instead of just sliding ones if I wanted to.)

It worked almost perfectly but as I complained about in my original thread, it would show gaps when trying to view from certain angles.

Re: Would A Classic Doom Inspired Game Work In LOVE2D?

Posted: Sat Jan 10, 2015 4:17 pm
by Davidobot
EDIT:
Everything! And I mean everything works now! See for yourself:
Image
Bump into the doors to open them.

Re: Would A Classic Doom Inspired Game Work In LOVE2D?

Posted: Sun Jan 11, 2015 9:37 am
by Robin
So is the constant spinning to the left intentional or is it just what happens on my computer?

Re: Would A Classic Doom Inspired Game Work In LOVE2D?

Posted: Sun Jan 11, 2015 9:53 am
by zorg
Robin wrote:So is the constant spinning to the left intentional or is it just what happens on my computer?
It doesn't spin for me, but the floor does glitch occasionally when i turn.

Re: Would A Classic Doom Inspired Game Work In LOVE2D?

Posted: Sun Jan 11, 2015 9:56 am
by bartbes
Robin wrote:So is the constant spinning to the left intentional or is it just what happens on my computer?
Do you have a controller plugged in?