main.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. graphics=require("graphics")
  2. matrix=require("matrix")
  3. quat=require("quat")
  4. vector=require("vector")
  5. loadobj=require("obj")
  6. gui=require("gui")
  7. posteffect=require("posteffect")
  8. keycode,keyname=table.unpack(require("keys"))
  9. tcc=createtccstate()
  10. qq=[[
  11. typedef struct vec3
  12. {
  13. float x,y,z;
  14. }vec3;
  15. vec3 vec3(float x,float y,float z)
  16. {
  17. vec3 v=new vec3;
  18. v.x=x;
  19. v.y=y;
  20. v.z=z;
  21. return v;
  22. }
  23. vec3 __add(vec3 a,vec3 b)
  24. {
  25. return vec3(a.x+b.x,a.y+b.y,a.z+b.z);
  26. }
  27. #vec3 2
  28. #__add 1
  29. #v 1
  30. #v2 0
  31. int main()
  32. {
  33. v=vec3(1.0,1.0,0.5);
  34. v2=v+vec3(0.1,0.1,0.1);
  35. return 0;
  36. }
  37. ]]
  38. sadd=[[
  39. extern lua_pushinteger(void*,int);
  40. int add(int a,int b)
  41. {
  42. return a+b;
  43. }
  44. int main(void* L)
  45. {
  46. lua_pushinteger(L,add(2,3));
  47. return 1;
  48. }
  49. ]]
  50. --addsymbol(tcc,"lua_pushinteger",lua_pushinteger)
  51. --compile(tcc,sadd)
  52. --print(getsymbol(tcc,"main")())
  53. vertex_shader_text=[[
  54. #version 450
  55. layout (location=0) in vec3 pos;
  56. layout (location=1) in vec3 norm;
  57. layout (location=2) in vec2 texcoord;
  58. out vec2 otexcoord;
  59. out vec3 onormal;
  60. out vec3 FragPos;
  61. uniform mat4 M;
  62. uniform mat4 V;
  63. uniform mat4 P;
  64. void main()
  65. {
  66. gl_Position=P*V*M*vec4(pos,1);
  67. FragPos = vec3(M * vec4(pos, 1.0f));
  68. otexcoord=texcoord;
  69. onormal=mat3(transpose(inverse(M))) * norm;
  70. }]]
  71. fragment_shader_text=[[
  72. #version 450
  73. uniform sampler2D tex;
  74. uniform sampler2D tex_spec;
  75. in vec2 otexcoord;
  76. in vec3 onormal;
  77. in vec3 FragPos;
  78. out vec4 color;
  79. uniform mat4 M;
  80. uniform mat4 V;
  81. uniform mat4 P;
  82. uniform vec3 viewPos;
  83. void main()
  84. {
  85. vec3 viewDir = normalize(-viewPos - FragPos);
  86. vec3 norm = normalize(onormal);
  87. vec3 lightDir = normalize(vec3(1,1,1));
  88. vec3 reflectDir = reflect(-lightDir, norm);
  89. float diff = max(dot(norm, lightDir), 0.0);
  90. float spec = pow(max(dot(viewDir, reflectDir), 0.0), 256);
  91. vec3 lightColor = vec3(1,1,1);
  92. vec3 specular = 5.0 * spec * lightColor * texture(tex_spec,otexcoord).xyz;
  93. vec3 diffuse = diff * lightColor;
  94. float ambientStrength = 0.1f;
  95. vec3 ambient = ambientStrength * lightColor;
  96. vec3 result = ( ambient + diffuse + specular) * texture(tex,otexcoord).xyz;
  97. color=vec4(result,1.0f);
  98. }]]
  99. vertex_shader_text2=[[
  100. #version 450
  101. layout (location=0) in vec3 pos;
  102. layout (location=1) in vec3 norm;
  103. layout (location=2) in vec2 texcoord;
  104. out vec3 onormal;
  105. uniform mat4 M;
  106. uniform mat4 V;
  107. uniform mat4 P;
  108. void main()
  109. {
  110. }]]
  111. fragment_shader_text2=[[
  112. #version 450
  113. uniform sampler2D tex;
  114. in vec3 onormal;
  115. out vec4 FragColor;
  116. void main()
  117. {
  118. FragColor=vec4(dot(normalize(vec3(-1,1,-1)),normalize(onormal))*vec3(1,1,1),1);
  119. }]]
  120. vertex_shader_text2=[[
  121. #version 450
  122. layout (location=0) in vec3 pos;
  123. layout (location=1) in vec3 norm;
  124. layout (location=2) in vec2 texcoord;
  125. out vec2 otexcoord;
  126. out vec3 onormal;
  127. //out vec3 FragPos;
  128. uniform mat4 M;
  129. uniform mat4 V;
  130. uniform mat4 P;
  131. void main()
  132. {
  133. gl_Position=P*V*M*vec4(pos,1);
  134. //FragPos = vec3(M * vec4(pos, 1.0f));
  135. otexcoord=texcoord;
  136. onormal=mat3(transpose(inverse(M))) * norm;
  137. }]]
  138. fragment_shader_text2=[[
  139. #version 450
  140. uniform sampler2D tex;
  141. in vec2 otexcoord;
  142. in vec3 onormal;
  143. //in vec3 FragPos;
  144. out vec4 color;
  145. uniform mat4 M;
  146. uniform mat4 V;
  147. uniform mat4 P;
  148. uniform vec3 sun;
  149. //uniform vec3 viewPos;
  150. void main()
  151. {
  152. vec3 norm = normalize(onormal);
  153. vec3 sun = normalize(vec3(1,1,1));
  154. float diff = max(dot(norm, sun), 0.0);
  155. vec3 tex=texture(tex,otexcoord).xyz;
  156. vec3 result = diff*tex + (1.0-diff)*0.3*vec3(0.2,0.3,0.7)*tex;
  157. color=vec4(result,1.0);
  158. }]]
  159. loadobjdata=function(w,shader,file,bvt,ld)
  160. local data=loadobj(file)
  161. local pos,texcoord,normal={},{},{}
  162. if bvt==nil then
  163. bvt=true
  164. end
  165. local gv,gvt,gvn=1,1,1
  166. for _,i in ipairs(data["f"]) do
  167. gv=i[1] or gv
  168. gvt=i[2] or gvt
  169. gvn=i[3] or gvn
  170. table.insert(pos,data["v"][gv])
  171. if bvt then
  172. table.insert(texcoord,data["vt"][gvt])
  173. end
  174. table.insert(normal,data["vn"][gvn])
  175. end
  176. print(file,#pos/3,ld)
  177. local vd=shader:vertex("pos")
  178. if vd~=nil then
  179. for _,i in ipairs(pos) do
  180. vd:add(table.unpack(i))
  181. end
  182. vbo=vd:vbo()
  183. end
  184. if bvt then
  185. local texc=shader:vertex("texcoord")
  186. if texc~=nil then
  187. for _,i in ipairs(texcoord) do
  188. texc:add(table.unpack(i))
  189. end
  190. vbo2=texc:vbo()
  191. end
  192. end
  193. local norm=shader:vertex("norm")
  194. if norm~=nil then
  195. for _,i in ipairs(normal) do
  196. norm:add(table.unpack(i))
  197. end
  198. vbo3=norm:vbo()
  199. end
  200. if bvt then
  201. return w:vao("triangles",vbo,vbo2,vbo3)
  202. end
  203. return w:vao("triangles",vbo,vbo3)
  204. end
  205. errors={}
  206. errfunc=function(str)
  207. errors[#errors+1]=str
  208. print(str)
  209. end
  210. w=graphics.window.new(1366,748,"title",errfunc)
  211. shader=w:shader(w:vertexshader(vertex_shader_text),w:fragmentshader(fragment_shader_text))
  212. shader2=w:shader(w:vertexshader(vertex_shader_text2),w:fragmentshader(fragment_shader_text2))
  213. --vao4=loadobjdata(w,shader2,"robot.obj",false)
  214. --vao3=loadobjdata(w,shader2,"monster.obj")
  215. --vao22=loadobjdata(w,shader2,"skel.obj")--,nil,1.0)
  216. --vao2=loadobjdata(w,shader2,"skel.obj",false)
  217. vao1=loadobjdata(w,shader2,"monster.obj")
  218. vao2=loadobjdata(w,shader2,"box.obj")
  219. tex1=w:textureload(graphics.image.load("monster.bmp"))
  220. tex11=w:textureload(graphics.image.load("box_spec.png"))
  221. --tex2=w:texture(graphics.image.load("btr8chas.jpg"))
  222. --tex3=w:texture(graphics.image.load("monster.bmp"))
  223. dt=graphics:timedelta()
  224. width,height,t=0,0,1
  225. vpos=vector:new(0,0,0)
  226. vquat=quat:identity()
  227. mouseview=false
  228. speed=0.5
  229. tt=3.0
  230. local norm2=function(x,t)
  231. return math.exp(-0.5*((x/t)^2))/(t*math.sqrt(2*math.pi))
  232. end
  233. local norm=function(x,t)
  234. return norm2(x,t)/norm2(0,t)
  235. end
  236. nn=""
  237. for i=0,5 do
  238. nn=nn..tostring(norm(i,tt))..","
  239. end
  240. local shad_blur_h=[[
  241. #version 450
  242. uniform sampler2D tex;
  243. uniform sampler2D depth;
  244. uniform vec2 pix;
  245. in vec2 otexcoord;
  246. out vec4 ocolor;
  247. #define n 5
  248. #define mindist 0.2
  249. float norm[]={]]..nn..[[};
  250. float GetDepth(vec2 uv)
  251. {
  252. float nn=0.1;
  253. float f=50.0;
  254. float z=texture(depth,uv).x;
  255. return smoothstep(mindist,1.0,(2.0*nn)/(f+nn-z*(f-nn)));
  256. }
  257. void main()
  258. {
  259. vec3 color=texture(tex,otexcoord).rgb;
  260. float dd=GetDepth(otexcoord);
  261. float k=1.0;
  262. float kk=1.0;
  263. for(int i=-n;i<0;i++)
  264. {
  265. float d=GetDepth(otexcoord+vec2(pix.x*i,0.0));
  266. d*=max(0.0,1.0+(dd-d));
  267. k=norm[abs(i)]*d;
  268. kk+=k;
  269. color+=texture(tex,otexcoord+vec2(pix.x*i,0.0)).rgb*k;
  270. }
  271. for(int i=1;i<=n;i++)
  272. {
  273. float d=GetDepth(otexcoord+vec2(pix.x*i,0.0));
  274. d*=max(0.0,1.0+(dd-d));
  275. k=norm[abs(i)]*d;
  276. kk+=k;
  277. color+=texture(tex,otexcoord+vec2(pix.x*i,0.0)).rgb*k;
  278. }
  279. ocolor=vec4(color/kk,1.0);
  280. }]]
  281. local shad_blur_v=[[
  282. #version 450
  283. uniform sampler2D tex;
  284. uniform sampler2D depth;
  285. uniform vec2 pix;
  286. in vec2 otexcoord;
  287. out vec4 ocolor;
  288. #define n 5
  289. #define mindist 0.2
  290. float norm[]={]]..nn..[[};
  291. float GetDepth(vec2 uv)
  292. {
  293. float nn=0.1;
  294. float f=50.0;
  295. float z=texture(depth,uv).x;
  296. return smoothstep(mindist,1.0,(2.0*nn)/(f+nn-z*(f-nn)));
  297. }
  298. void main()
  299. {
  300. vec3 color=texture(tex,otexcoord).rgb;
  301. float dd=GetDepth(otexcoord);
  302. float k=1.0;
  303. float kk=1.0;
  304. for(int i=-n;i<0;i++)
  305. {
  306. float d=GetDepth(otexcoord+vec2(0.0,pix.y*i));
  307. d*=max(0.0,1.0+(dd-d));
  308. k=norm[abs(i)]*d;
  309. kk+=k;
  310. color+=texture(tex,otexcoord+vec2(0.0,pix.y*i)).rgb*k;
  311. }
  312. for(int i=1;i<=n;i++)
  313. {
  314. float d=GetDepth(otexcoord+vec2(0.0,pix.y*i));
  315. d*=max(0.0,1.0+(dd-d));
  316. k=norm[abs(i)]*d;
  317. kk+=k;
  318. color+=texture(tex,otexcoord+vec2(0.0,pix.y*i)).rgb*k;
  319. }
  320. ocolor=vec4(color/kk,1.0);
  321. }]]
  322. blur_h=posteffect.new(w,shad_blur_h)
  323. blur_v=posteffect.new(w,shad_blur_v)
  324. blur=posteffect.new(w)
  325. post=posteffect.new(w)
  326. rend=posteffect.new(w)
  327. font=w:font("fonts/mplus-1m-regular.ttf",16)
  328. g=gui.init(w)
  329. local mx,my=0,0
  330. render=function(...)
  331. while not w:shouldclose() do
  332. dt=graphics:timedelta()
  333. t=t+dt
  334. sun=vector:new(math.cos(t),math.sin(t),0.7):normal()
  335. if w.keys["q"] then
  336. mouseview=false
  337. w:mouseenable(true)
  338. end
  339. if w.keys["e"] then
  340. mouseview=true
  341. w:mouseenable(false)
  342. w:mousesetpos(0,0)
  343. end
  344. if mouseview then
  345. local mx,my=w:mousegetpos()
  346. w:mousesetpos(0,0)
  347. vquat=vquat*quat:rotate(vector:new(0,1,0),mx/100)*quat:rotate(vector:new(1,0,0),my/100)
  348. else
  349. mx,my=w:mousegetpos()
  350. end
  351. if w.keys["w"] then
  352. vpos=vpos-vquat:mulvect(vector:new(0,0,dt*speed))
  353. end
  354. if w.keys["s"] then
  355. vpos=vpos-vquat:mulvect(vector:new(0,0,-dt*speed))
  356. end
  357. if w.keys["d"] then
  358. vpos=vpos-vquat:mulvect(vector:new(dt*speed,0,0))
  359. end
  360. if w.keys["a"] then
  361. vpos=vpos-vquat:mulvect(vector:new(-dt*speed,0,0))
  362. end
  363. if w.keys["space"] then
  364. vpos=vpos-vquat:mulvect(vector:new(0,dt*speed,0))
  365. end
  366. if w.keys["left_control"] then
  367. vpos=vpos-vquat:mulvect(vector:new(0,-dt*speed,0))
  368. end
  369. width,height=w:getsize()
  370. w:viewport(0,0,width,height)
  371. --model=quat:rotate(vector:new(0.0,1.0,0.0),t):matrix()*matrix:translate(0,0,3)
  372. view=matrix:translate(table.unpack(vpos))*vquat:matrix()
  373. w:depthtest(true)
  374. w:depthmask(true)
  375. rend:bind()
  376. w:cleardepth()
  377. w:clearcolor(0.2,0.3,0.7,1.0)
  378. proj=matrix:projection(0.01,1000,math.pi/2,width/height)
  379. model=matrix:scale(0.1,0.1,0.1)*matrix:translate(0,0,0)
  380. vao2:draw({M=model,V=view,P=proj,tex=gtex,viewPos=vpos,tex_spec=tex11.tex,sun=sun})
  381. model=matrix:scale(3.0,3.0,3.0)*matrix:translate(5.0,0.0,0)
  382. vao1:draw({M=model,V=view,P=proj,tex=tex1.tex,viewPos=vpos,tex_spec=tex11.tex,sun=sun})
  383. model=matrix:scale(3.0,3.0,3.0)*matrix:translate(10.0,0.0,0)
  384. vao1:draw({M=model,V=view,P=proj,tex=tex1.tex,viewPos=vpos,tex_spec=tex11.tex,sun=sun})
  385. w:depthtest(false)
  386. w:depthmask(false)
  387. blur_h:bind()
  388. blur_v:draw({depth=rend.fdepth.tex,tex=rend.ftex.tex,pix={1/1366,1/768}})
  389. w:bind()
  390. blur_h:draw({depth=rend.fdepth.tex,tex=blur_h.ftex.tex,pix={1/1366,1/768}})
  391. g:draw(200,200,400,400,{0.0,0.0,0.0,0.5})
  392. text="FPS: "..tostring(1/dt).."\n"
  393. --for i,v in pairs(tasklist()) do
  394. -- text=text..i.."\n"
  395. --end
  396. --for i,v in ipairs(errors) do
  397. -- text=text..v.."\n"
  398. --end
  399. font:draw(200+10,200+10+16,380,380,text,{1.0,0.7,0.0,1.0})
  400. --w:depthmask(true)
  401. --w:depthtest(true)
  402. --[[blur:bind()
  403. w:cleardepth()
  404. blur_v:draw({pix={1/1366,1/768}})
  405. w:bind()
  406. w:cleardepth()
  407. blur_v:draw()
  408. --post:draw({tex=blur.ftex.tex})]]
  409. --model=matrix:scale(0.1,0.1,0.1)*matrix:translate(3,0,0)
  410. --vao22:draw({M=model,V=view,P=proj,tex=tex2.tex,viewPos=vpos,tex_spec=tex11.tex})
  411. --model=matrix:scale(0.1,0.1,0.1)*matrix:translate(0,0,0)
  412. --vao2:draw({M=model,V=view,P=proj,tex=tex2.tex,viewPos=vpos,tex_spec=tex11.tex})
  413. --for i=1,10 do
  414. -- model=matrix:scale(0.1,0.1,0.1)*quat:rotate(vector:new(0.0,1.0,0.0),t):matrix()*matrix:translate(i-3,0,3+i)
  415. -- vao2:draw({M=model,V=view,P=proj,tex=tex2.tex,viewPos=vpos,tex_spec=tex11.tex})
  416. --end
  417. --for i=1,10 do
  418. -- model=quat:rotate(vector:new(0.0,1.0,0.0),t):matrix()*matrix:translate(i-3,i-7,3+i)
  419. -- vao3:draw({M=model,V=view,P=proj,tex=tex3.tex,viewPos=vpos,tex_spec=tex11.tex})
  420. --end
  421. w:swap()
  422. graphics.pollevents()
  423. end
  424. w:close()
  425. --closetask(id)
  426. --closetask(id2)
  427. collectgarbage()
  428. end
  429. keycb=function(win,key,scancode,action,mods)
  430. print("key "..tostring(key))
  431. end
  432. --w:keycallback(keycb,errfunc)
  433. qwe=function(tt,...)
  434. local num=0
  435. --tt=1.3
  436. while true do
  437. if t>tt*num then
  438. print("num"..tostring(num))
  439. num=num+1
  440. end
  441. --coroutine.yield()
  442. end
  443. end
  444. --id2=newtask(qwe,errfunc,1.1,"q","w","e","r","t","y")
  445. --id=newtask(qwe,errfunc,1.3)
  446. newtask("render",render,errfunc,1,2,3,4,5)