Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- local gpuobj
- local function putpixel(obj)
- gpuobj.setColor(obj.r,obj.g,obj.b)
- gpuobj.plot(obj.x,obj.y)
- end
- local function copy(orig)
- local orig_type = type(orig)
- local copy
- if orig_type == 'table' then
- copy = {}
- for orig_key, orig_value in pairs(orig) do
- copy[orig_key] = orig_value
- end
- else -- number, string, boolean, etc
- copy = orig
- end
- return copy
- end
- function gouraud(gpu,x1,y1,x2,y2,x3,y3,r1,g1,b1,r2,g2,b2,r3,g3,b3)
- gpuobj = gpu
- A = {x = x1,y = y1,r = r1,g = g1,b = b1}
- B = {x = x2,y = y2,r = r2,g = g2,b = b2}
- C = {x = x3,y = y3,r = r3,g = g3,b = b3}
- if B.y > C.y then
- B,C = C,B
- end
- if A.y > B.y then
- A,B = B,A
- end
- if A.y > C.y then
- A,C = C,A
- end
- if (B.y-A.y > 0) then
- dx1=(B.x-A.x)/(B.y-A.y);
- dr1=(B.r-A.r)/(B.y-A.y);
- dg1=(B.g-A.g)/(B.y-A.y);
- db1=(B.b-A.b)/(B.y-A.y);
- else
- dx1,dr1,dg1,db1=0,0,0,0;
- end
- if (C.y-A.y > 0) then
- dx2=(C.x-A.x)/(C.y-A.y);
- dr2=(C.r-A.r)/(C.y-A.y);
- dg2=(C.g-A.g)/(C.y-A.y);
- db2=(C.b-A.b)/(C.y-A.y);
- else
- dx2,dr2,dg2,db2=0,0,0,0;
- end
- if (C.y-B.y > 0) then
- dx3=(C.x-B.x)/(C.y-B.y);
- dr3=(C.r-B.r)/(C.y-B.y);
- dg3=(C.g-B.g)/(C.y-B.y);
- db3=(C.b-B.b)/(C.y-B.y);
- else
- dx3,dr3,dg3,db3=0,0,0,0;
- end
- E=copy(A);
- S=copy(E);
- if (dx1 > dx2) then
- while (S.y<=B.y) do
- if (E.x-S.x > 0) then
- dr=(E.r-S.r)/(E.x-S.x);
- dg=(E.g-S.g)/(E.x-S.x);
- db=(E.b-S.b)/(E.x-S.x);
- else
- dr,dg,db=0,0,0;
- end
- P=copy(S);
- while (P.x < E.x) do
- putpixel(P);
- P.r=P.r+dr; P.g=P.g+dg; P.b=P.b+db;
- P.x = P.x + 1
- end
- S.x=S.x+dx2; S.r=S.r+dr2; S.g=S.g+dg2; S.b=S.b+db2;
- E.x=E.x+dx1; E.r=E.r+dr1; E.g=E.g+dg1; E.b=E.b+db1;
- S.y = S.y + 1
- E.y = E.y + 1
- end
- E=copy(B);
- while (S.y<=C.y) do
- if (E.x-S.x > 0) then
- dr=(E.r-S.r)/(E.x-S.x);
- dg=(E.g-S.g)/(E.x-S.x);
- db=(E.b-S.b)/(E.x-S.x);
- else
- dr,dg,db=0,0,0;
- end
- P=copy(S);
- while (P.x < E.x) do
- putpixel(P);
- P.r=P.r+dr; P.g=P.g+dg; P.b=P.b+db;
- P.x = P.x + 1
- end
- S.x=S.x+dx2; S.r=S.r+dr2; S.g=S.g+dg2; S.b=S.b+db2;
- E.x=E.x+dx3; E.r=E.r+dr3; E.g=E.g+dg3; E.b=E.b+db3;
- S.y = S.y + 1
- E.y = E.y + 1
- end
- else
- while (S.y<=B.y) do
- if (E.x-S.x > 0) then
- dr=(E.r-S.r)/(E.x-S.x);
- dg=(E.g-S.g)/(E.x-S.x);
- db=(E.b-S.b)/(E.x-S.x);
- else
- dr,dg,db=0,0,0;
- end
- P=copy(S);
- while (P.x < E.x) do
- putpixel(P);
- P.r=P.r+dr; P.g=P.g+dg; P.b=P.b+db;
- P.x = P.x + 1
- end
- S.x=S.x+dx1; S.r=S.r+dr1; S.g=S.g+dg1; S.b=S.b+db1;
- E.x=E.x+dx2; E.r=E.r+dr2; E.g=E.g+dg2; E.b=E.b+db2;
- S.y = S.y + 1
- E.y = E.y + 1
- end
- S=copy(B);
- while (S.y<=C.y) do
- if (E.x-S.x > 0) then
- dr=(E.r-S.r)/(E.x-S.x);
- dg=(E.g-S.g)/(E.x-S.x);
- db=(E.b-S.b)/(E.x-S.x);
- else
- dr,dg,db=0,0,0;
- end
- P=copy(S);
- while (P.x < E.x) do
- putpixel(P);
- P.r=P.r+dr; P.g=P.g+dg; P.b=P.b+db;
- P.x = P.x + 1
- end
- S.x=S.x+dx3; S.r=S.r+dr3; S.g=S.g+dg3; S.b=S.b+db3;
- E.x=E.x+dx2; E.r=E.r+dr2; E.g=E.g+dg2; E.b=E.b+db2;
- S.y = S.y + 1
- E.y = E.y + 1
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement