port from perforce

This commit is contained in:
2026-04-18 22:31:51 +02:00
commit 8d0ab5b7cc
8409 changed files with 3972376 additions and 0 deletions

View File

@@ -0,0 +1,49 @@
# Blender3D v246 OBJ File: atari.blend
# www.blender3d.org
v -0.993693 7.438359 -0.000000
v 1.006307 7.438359 0.000000
v -0.993695 -7.114214 -0.000000
v 1.006306 -7.114214 0.000000
v -7.638318 -7.373180 0.000000
v -7.638318 -5.373180 -0.000000
v -1.462695 7.438359 0.000000
v -3.462695 7.438360 -0.000000
v -3.462695 7.438360 -0.000000
v -1.462695 7.438359 0.000000
v -0.993693 7.438359 -0.000000
v 1.006307 7.438359 0.000000
v -7.638318 -5.373180 -0.000000
v -7.638318 -7.373180 0.000000
v -0.993695 -7.114214 -0.000000
v 1.006306 -7.114214 0.000000
v -1.462696 -0.052856 0.000000
v -3.462696 -0.052856 -0.000000
v -2.519978 -4.180912 0.000000
v -3.934192 -2.766699 -0.000000
v 3.933834 -2.766700 0.000000
v 2.519620 -4.180914 -0.000000
v 3.462338 -0.052857 0.000000
v 1.462337 -0.052856 -0.000000
v 7.637960 -5.373180 0.000000
v 7.637960 -7.373180 -0.000000
v 1.462339 7.438359 -0.000000
v 3.462339 7.438358 -0.000000
v 3.462339 7.438358 -0.000000
v 1.462339 7.438359 -0.000000
v 7.637960 -5.373180 0.000000
v 7.637960 -7.373180 -0.000000
usemtl Material
s 1
f 3 1 2 4
f 8 9 10 7
f 1 11 12 2
f 5 14 13 6
f 4 16 15 3
f 18 8 7 17
f 6 20 19 5
f 20 18 17 19
f 21 31 32 22
f 23 21 22 24
f 29 23 24 30
f 31 25 26 32
f 30 27 28 29

View File

@@ -0,0 +1,12 @@
FILE atari.obj
FLATTEN
FLOATBITS 12
COLOR 192 192 192 64
EXTRUDE 1
SUBDIVIDE
SUBDIVIDE
SUBDIVIDE
SUPER 0.25

View File

@@ -0,0 +1,46 @@
# Blender3D v246 OBJ File: commod.blend
# www.blender3d.org
v 6.490464 3.638708 -0.000000
v 3.611959 0.214475 0.000000
v -0.109388 3.638713 -0.000001
v -0.109388 0.214476 0.000000
v 6.490464 3.730206 -0.000000
v 3.611959 0.305973 0.000000
v -0.109388 3.730211 -0.000001
v -0.109388 0.305974 0.000000
v 0.289035 -7.356400 -0.000000
v -3.941339 -4.426592 0.000000
v -5.872333 -8.448413 0.000000
v 0.131454 -3.652155 0.000000
v 0.289035 -7.356400 -0.000000
v 0.287997 7.421998 -0.000000
v 0.146595 3.754244 -0.000000
v 0.146595 3.754244 -0.000000
v 0.287997 7.421998 -0.000000
v 0.131454 -3.652155 0.000000
v -3.972942 4.483369 -0.000000
v -5.872331 8.469555 -0.000000
v -6.921259 -0.003901 0.000000
v -12.237351 0.014822 -0.000000
v -0.109388 -3.602269 0.000000
v -0.109388 -0.178032 0.000001
v 6.550732 -3.602271 -0.000000
v 3.604821 -0.178037 0.000000
v -0.109388 -3.602269 0.000000
v -0.109388 -0.178032 0.000001
v 6.550732 -3.602271 -0.000000
v 3.604821 -0.178037 0.000000
usemtl Material
s 1
f 3 1 2 4
f 1 5 6 2
f 4 8 7 3
f 10 18 9 11
f 18 12 13 9
f 17 14 15 16
f 16 19 20 17
f 19 21 22 20
f 21 10 11 22
f 27 23 24 28
f 30 26 25 29
f 28 30 29 27

View File

@@ -0,0 +1,13 @@
FILE commod.obj
FLATTEN
FLOATBITS 12
COLOR 192 192 192 64
EXTRUDE 1
SUBDIVIDE
SUBDIVIDE
SUBDIVIDE
SUPER 0.25

View File

@@ -0,0 +1,41 @@
# Blender3D v246 OBJ File: crystal.blend
# www.blender3d.org
v 0.353553 -0.045309 -0.353553
v 0.482963 -0.045309 0.129410
v 0.129409 -0.045309 0.482963
v -0.353553 -0.045309 0.353553
v -0.482963 -0.045309 -0.129410
v -0.129409 -0.045309 -0.482963
v 0.640755 3.946158 -0.640755
v 0.875288 3.946158 0.234532
v 0.234533 3.946158 0.875287
v -0.640755 3.946158 0.640755
v -0.875288 3.946158 -0.234532
v -0.234533 3.946158 -0.875287
v 0.574351 4.390408 -0.574351
v -0.210228 4.390408 -0.784578
v -0.784579 4.390408 -0.210227
v -0.574351 4.390408 0.574351
v 0.210227 4.390408 0.784578
v 0.784579 4.390408 0.210227
v 0.000000 4.786534 -0.000000
usemtl (null)
s off
f 1 7 8 2
f 2 8 9 3
f 3 9 10 4
f 4 10 11 5
f 5 11 12 6
f 7 1 6 12
f 7 12 14 13
f 12 11 15 14
f 11 10 16 15
f 10 9 17 16
f 9 8 18 17
f 8 7 13 18
f 19 13 14
f 19 14 15
f 19 15 16
f 19 16 17
f 19 17 18
f 19 18 13

View File

@@ -0,0 +1,7 @@
FILE crystal.obj
FLOATBITS 14
COLOR 255 255 255 255
UNINDEX

View File

@@ -0,0 +1,90 @@
# Blender3D v246 OBJ File: duck.blend
# www.blender3d.org
v 2.565486 -0.102426 -1.000000
v 2.565486 -0.102426 1.000000
v -3.066047 -0.014552 1.000000
v -3.066046 -0.014552 -1.000000
v 2.259124 2.302860 -1.000000
v 2.259121 2.302860 1.000000
v -1.594982 2.266742 0.879797
v -1.594982 2.266742 -0.879797
v 2.259124 2.302860 -1.745345
v 2.259123 -0.420440 -1.984043
v -2.259122 -0.420440 -1.984043
v -1.053419 2.266742 -1.745345
v -3.481300 1.470057 0.999999
v -2.350906 2.439857 0.879796
v -2.350906 2.439857 -0.879798
v -3.481299 1.470057 -1.000001
v 2.259122 -0.420440 1.984043
v 2.259121 2.302860 1.745346
v -1.053421 2.266741 1.745345
v -2.259123 -0.420440 1.984042
v 3.243165 0.302860 -0.999999
v 4.133813 4.112998 -0.999999
v 4.133810 4.112998 1.000001
v 3.243165 0.302860 1.000001
v 2.259123 -0.681183 -1.000000
v 2.259123 -0.681183 1.000000
v -2.259123 -0.681183 1.000000
v -2.259122 -0.681183 -1.000000
v -3.351362 3.104919 -1.680221
v -3.351364 3.104919 1.680219
v -0.267524 3.758731 -1.680220
v -0.267526 3.758731 1.680220
v -1.469109 4.989134 -0.805017
v -1.469110 4.989134 0.805016
v -2.396492 5.168098 0.805016
v -2.396492 5.168098 -0.805018
v -3.167788 3.950947 0.586844
v -3.167787 3.950947 -0.573384
v -3.254336 3.552009 -0.626610
v -3.254336 3.552009 0.640070
v -4.586704 3.563728 -0.626611
v -4.586705 3.563728 0.640069
v -4.500156 3.962667 0.586843
v -4.500155 3.962667 -0.573385
usemtl Material
s 1
f 5 8 7 6
f 1 10 9 5
f 10 1 4 11
f 8 12 11 4
f 5 9 12 8
f 9 10 11 12
f 7 14 13 3
f 4 16 15 8
f 3 13 16 4
f 13 14 15 16
f 6 18 17 2
f 7 19 18 6
f 3 20 19 7
f 2 17 20 3
f 17 18 19 20
f 21 1 5 22
f 6 23 22 5
f 2 24 23 6
f 1 21 24 2
f 21 22 23 24
f 25 1 2 26
f 3 27 26 2
f 4 28 27 3
f 1 25 28 4
f 25 26 27 28
f 15 14 30 29
f 8 15 29 31
f 14 7 32 30
f 7 8 31 32
f 32 31 33 34
f 30 32 34 35
f 31 29 36 33
f 33 36 35 34
f 35 36 38 37
f 36 29 39 38
f 30 35 37 40
f 29 30 40 39
f 39 40 42 41
f 40 37 43 42
f 38 39 41 44
f 37 38 44 43
f 41 42 43 44

View File

@@ -0,0 +1,13 @@
FILE duck.obj
/FLATTEN
FLOATBITS 13
COLOR 255 255 0 64
SUBDIVIDE
SUBDIVIDE
SUBDIVIDE
SUBDIVIDE

View File

@@ -0,0 +1,796 @@
# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware
# File Created: 26.08.2010 19:01:07
#
# object icemage
#
v -31.997184753418 8.518324851990 1.905359268188
v -32.248725891113 8.663727760315 1.179888963699
v -31.741449356079 13.918359756470 0.960696041584
v -33.351200103760 14.890666961670 1.247375607491
v -34.428703308105 14.972445487976 0.003240784630
v -32.913181304932 13.966187477112 1.555379629135
v -31.419591903687 12.239754676819 1.244592308998
v -34.317237854004 13.697469711304 0.047062538564
v -35.646945953369 13.086496353149 3.019788265228
v -35.455146789551 13.103430747986 3.132490634918
v -35.388469696045 12.936099052429 2.932483434677
v -35.488666534424 12.919167518616 2.827769756317
v -32.623897552490 14.953702926636 0.577370464802
v -33.186286926270 15.217096328735 0.297459393740
v -32.994422912598 15.283218383789 -0.144497826695
v -31.696132659912 17.737085342407 0.577826857567
v -32.300117492676 17.615146636963 0.619406938553
v -32.171882629395 17.157648086548 0.362521439791
v -31.776174545288 17.397022247314 0.094636894763
v -32.014652252197 16.241344451904 0.994761586189
v -32.146949768066 15.875457763672 0.617083787918
v -32.277004241943 17.447294235229 1.250655055046
v -31.966382980347 15.314019203186 1.302740216255
v -32.346618652344 15.861530303955 1.517609000206
v -34.129589080811 14.837094306946 1.082531690598
v -33.803535461426 14.966871261597 1.520578026772
v -33.493278503418 14.229289054871 1.439657568932
v -33.819332122803 14.099517822266 1.001611351967
v -33.185504913330 14.362272262573 0.003669964848
v -33.486526489258 14.600859642029 -0.259475737810
v -33.158847808838 14.584714889526 -0.458941310644
v -33.013996124268 14.346125602722 -0.051740445197
v -32.490406036377 16.801723480225 0.694725692272
v -32.417407989502 16.851558685303 0.453657954931
v -32.447746276855 16.825757980347 1.242824196815
v -31.698184967041 17.244626998901 1.459532380104
v -31.889875411987 15.730410575867 1.462653875351
v -32.267963409424 16.849966049194 1.399473428726
v -32.116271972656 16.168849945068 1.712698221207
v -32.095588684082 17.223117828369 1.406516790390
v -32.315593719482 10.293083190918 1.120679140091
v -32.833709716797 9.745144844055 0.685264527798
v -31.682670593262 10.375526428223 1.170535802841
v -32.075202941895 7.750069141388 2.727233409882
v -32.382041931152 7.918982982635 1.449484348297
v -32.304779052734 9.277928352356 1.724194645882
v -32.571289062500 8.881817817688 1.056186079979
v -32.314037322998 4.585237503052 3.958039760590
v -32.329174041748 4.647766113281 3.929004669189
v -32.586460113525 4.533944129944 4.063166141510
v -32.584995269775 4.714251041412 4.099331378937
v -31.984312057495 8.330290794373 2.361292123795
v -32.661346435547 8.134746551514 0.905057311058
v -32.076263427734 7.854726314545 0.413680732250
v -32.447658538818 0.729999244213 3.941976785660
v -32.603538513184 1.583035826683 2.835028171539
v -33.862712860107 1.583035826683 3.012344360352
v -33.706836700439 0.729998052120 4.119290828705
v -31.965906143188 -0.127986118197 4.653245925903
v -32.579566955566 -0.127986118197 2.122603893280
v -34.376995086670 -0.127986118197 2.375716209412
v -34.267936706543 -0.127986118197 4.977413177490
v -32.278182983398 16.415470123291 0.967835783958
v -32.087730407715 16.377042770386 0.619961500168
v -32.258853912354 16.462001800537 1.354497432709
v -32.042587280273 16.503486633301 1.603141903877
v -32.418418884277 17.250982284546 0.649399399757
v -32.257862091064 17.011964797974 0.357009440660
v -31.832599639893 17.080101013184 -0.103324390948
v -31.721597671509 16.884466171265 1.637370586395
v -32.388339996338 17.152757644653 1.248728632927
v -32.294517517090 17.034914016724 1.459627151489
v -31.887567520142 16.761873245239 1.371733665466
v -31.786783218384 16.479820251465 1.642531871796
v -31.897682189941 16.657316207886 1.540611624718
v -31.938133239746 16.939834594727 1.563921332359
v -31.849966049194 17.158941268921 1.445300340652
v -31.839788436890 16.504594802856 1.646515250206
v -31.859815597534 16.213878631592 2.451771259308
v -31.784297943115 16.583820343018 2.022721052170
v -31.831111907959 16.792280197144 1.563358426094
v -31.819379806519 16.929647445679 1.496272563934
v -31.740087509155 16.824638366699 1.653789281845
v -32.072494506836 16.766401290894 1.009122371674
v -32.133773803711 16.798997879028 1.014418482780
v -32.093978881836 16.822822570801 1.022916197777
v -32.023941040039 16.777864456177 1.018185973167
v -31.898504257202 15.281540870667 2.305564641953
v -31.977479934692 14.988492965698 1.750282883644
v -32.373943328857 15.227070808411 1.895742297173
v -32.232769012451 15.403326988220 2.330358028412
v -31.791402816772 16.296525955200 1.917162895203
v -32.174171447754 15.662533760071 1.369217753410
v -31.969768524170 16.302444458008 1.937056303024
v -31.895473480225 16.621128082275 1.760307073593
v -35.817985534668 13.159472465515 2.940819025040
v -35.123023986816 13.259115219116 3.107459783554
v -35.042957305908 13.012639045715 2.954074144363
v -35.737918853760 12.912999153137 2.787436485291
v -33.115123748779 13.386695861816 8.624922752380
v -33.328956604004 13.452832221985 8.688874244690
v -33.319099426270 13.593267440796 8.563547134399
v -33.105266571045 13.527137756348 8.499597549438
v -32.205413818359 11.105333328247 0.551453411579
v -32.980075836182 11.376443862915 0.827435016632
v -33.475486755371 11.590643882751 0.307396829128
v -31.571304321289 7.080128192902 2.889817714691
v -31.929550170898 6.771647453308 2.076762676239
v -32.498611450195 6.754424571991 2.373501062393
v -32.357044219971 7.119402885437 3.200647592545
v -31.715494155884 16.962827682495 1.684719920158
v -31.887651443481 16.992288589478 1.743818402290
v -32.194412231445 17.074079513550 1.635889172554
v -32.112483978271 17.155117034912 1.574225068092
v -31.810945510864 17.112775802612 1.648246169090
v -31.830513000488 16.675849914551 2.021351099014
v -31.866664886475 16.499996185303 1.904148697853
v -31.815505981445 16.638198852539 1.763145446777
v -31.879470825195 16.703378677368 1.718359947205
v -31.965751647949 16.453798294067 1.666112184525
v -32.037227630615 16.602193832397 1.561128735542
v -32.004058837891 16.596693038940 1.787257552147
v -31.945905685425 16.450057983398 1.920449137688
v -31.988615036011 16.695301055908 1.329406380653
v -32.202102661133 16.784200668335 1.345346212387
v -31.990421295166 16.734109878540 1.088752746582
v -32.203907012939 16.823011398315 1.104692578316
v -31.928482055664 16.835548400879 1.352544546127
v -32.141967773438 16.924449920654 1.368484258652
v -31.930284500122 16.874366760254 1.111891150475
v -32.143772125244 16.963270187378 1.127830982208
v -32.218090057373 15.451521873474 3.314572811127
v -32.164306640625 15.278358459473 1.775196433067
v -32.134185791016 15.260808944702 2.997768402100
v -32.107719421387 15.566678047180 2.030409336090
v -32.042339324951 14.783009529114 2.479770898819
v -32.016777038574 15.015810966492 2.385302782059
v -32.781795501709 16.834943771362 1.089307785034
v -33.008132934570 16.379281997681 0.058881696314
v -32.677524566650 17.618532180786 1.089307188988
v -32.934581756592 17.094129562378 -0.240780636668
v -33.292987823486 -0.127986118197 6.356444835663
v -34.099445343018 -0.127986118197 6.577024459839
v -32.539005279541 -0.127986118197 3.425388097763
v -33.787651062012 -0.127986118197 3.044495344162
v -33.433540344238 0.223619341850 6.138091087341
v -34.107284545898 0.223619341850 6.322371959686
v -32.595272064209 0.652186334133 3.641833066940
v -33.693809509277 0.652186334133 3.239802837372
v -33.982563018799 13.178085327148 7.281796455383
v -34.333179473877 13.315762519836 7.415574550629
v -34.317176818848 13.626564025879 7.131840229034
v -33.966564178467 13.488887786865 6.998062610626
v -32.206527709961 14.465166091919 6.508258342743
v -32.076953887939 4.895846843719 4.213287353516
v -32.498676300049 4.978840351105 3.404784679413
v -33.071250915527 4.980308532715 3.703355789185
v -32.672336578369 4.876806259155 4.523750782013
v -33.479885101318 12.946027755737 8.193766593933
v -33.821929931641 13.065222740173 8.285115242004
v -33.728969573975 13.349129676819 8.165291786194
v -33.386924743652 13.229945182800 8.073944091797
v -33.866264343262 13.910938262939 9.298095703125
v -33.802604675293 14.041048049927 9.177555084229
v -33.580593109131 13.960398674011 9.199933052063
v -33.644256591797 13.830294609070 9.320478439331
v -34.282409667969 13.309967994690 7.423308849335
v -34.646903991699 13.473879814148 7.415839195251
v -34.395587921143 13.382693290710 8.568157196045
v -34.045284271240 13.241168975830 8.614869117737
v -34.509410858154 13.762405395508 7.141604900360
v -34.245056152344 13.649977684021 8.474081993103
v -34.144908905029 13.598495483398 7.149076938629
v -33.894744873047 13.508457183838 8.520791053772
v -33.863643646240 14.704897880554 8.028573989868
v -33.831069946289 14.464674949646 8.206997871399
v -34.161434173584 14.513258934021 8.328614234924
v -34.194015502930 14.753490447998 8.150190353394
v -33.909530639648 13.997517585754 6.886907100677
v -34.461536407471 14.100785255432 7.071669101715
v -33.833976745605 13.704867362976 7.301520347595
v -34.385982513428 13.808127403259 7.486295223236
v -32.304779052734 9.277928352356 1.724194645882
v -32.571289062500 8.881817817688 1.056186079979
v -33.266887664795 12.070313453674 7.983743190765
v -35.297782897949 13.115639686584 9.381443023682
v -34.243774414063 15.566042900085 7.942427635193
v -31.145057678223 17.461441040039 0.536246299744
v -31.422748565674 17.057958602905 0.308585911989
v -31.413185119629 8.518324851990 1.600832104683
v -30.829187393188 8.518324851990 1.296304941177
v -31.462324142456 10.293083190918 0.429220288992
v -31.237754821777 8.737154006958 0.660303592682
v -32.015861511230 9.762223243713 0.041592024267
v -31.714895248413 8.636934280396 0.966273128986
v -32.572116851807 9.729071617126 0.181619226933
v -31.297702789307 13.966187477112 -0.276111185551
v -31.657979965210 14.890666961670 -0.672249794006
v -33.463691711426 13.044974327087 -0.584959506989
v -33.841983795166 14.896970748901 -0.892094075680
v -32.743053436279 14.757488250732 -1.335632085800
v -32.744380950928 13.478013992310 -1.282303214073
v -31.443386077881 14.966871261597 -1.155155062675
v -31.918712615967 14.837094306946 -1.423970341682
v -31.484939575195 14.229289054871 -0.837222278118
v -31.960266113281 14.099517822266 -1.106037378311
v -32.231945037842 14.953702926636 0.133005708456
v -32.427921295166 14.607201576233 0.355187982321
v -32.579875946045 15.217096328735 -0.390034586191
v -32.846023559570 14.362272262573 -0.117091588676
v -32.854248046875 14.506834983826 -0.473890781403
v -31.121664047241 16.649293899536 1.147350311279
v -31.265048980713 16.716506958008 1.327266931534
v -31.541818618774 16.436847686768 1.567088127136
v -31.381027221680 16.345188140869 1.291296720505
v -31.704357147217 15.590689659119 0.607241630554
v -31.669996261597 16.321453094482 0.589885711670
v -31.429101943970 16.302482604980 0.906704843044
v -31.722351074219 16.202447891235 0.973716855049
v -31.989900588989 15.781081199646 0.348373144865
v -31.813554763794 16.136959075928 0.724047362804
v -31.668016433716 17.568565368652 1.279842138290
v -31.121946334839 17.293586730957 1.167494177818
v -31.974452972412 15.533119201660 0.785701155663
v -31.466215133667 15.606966018677 1.454222798347
v -32.193275451660 12.240173339844 -3.845551252365
v -32.407695770264 12.178560256958 -3.847173452377
v -32.206195831299 12.075271606445 -3.633208274841
v -32.340045928955 12.031950950623 -3.594486713409
v -31.331628799438 17.121456146240 1.351514339447
v -31.255022048950 16.696878433228 0.369969636202
v -31.379299163818 16.895051956177 0.293755739927
v -31.122577667236 17.078544616699 0.556102812290
v -31.164323806763 16.625259399414 0.599251747131
v -31.864589691162 16.713165283203 0.130561813712
v -31.092498779297 16.980318069458 1.155432462692
v -31.960203170776 12.455036163330 -3.659325838089
v -32.605667114258 12.211319923401 -3.870613574982
v -31.922100067139 12.218555450439 -3.476807117462
v -32.567565917969 11.974842071533 -3.688097953796
v -29.708450317383 7.800247192383 -4.776975154877
v -29.891532897949 8.371130943298 -4.760089874268
v -30.767707824707 7.892626285553 -5.155910015106
v -30.584623336792 7.511089324951 -5.172795295715
v -31.655244827271 16.730957031250 1.355006933212
v -31.649015426636 16.624225616455 1.522708177567
v -31.544023513794 15.311674118042 2.280770063400
v -31.516208648682 15.112933158875 1.833988308907
v -31.711137771606 17.123373031616 1.503736376762
v -31.577495574951 17.050094604492 1.425683498383
v -31.183095932007 16.887014389038 1.379608631134
v -32.028301239014 11.376443862915 -0.251602113247
v -32.606121063232 11.590643882751 -0.678216218948
v -33.251434326172 11.613685607910 -0.371195673943
v -30.835031509399 9.384673118591 0.968822896481
v -31.233854293823 8.978951454163 0.368816524744
v -31.092916488647 7.859561920166 2.215020418167
v -30.110631942749 7.750069141388 1.702806711197
v -30.462715148926 8.330290794373 1.567853689194
v -31.228704452515 8.367003440857 1.954616785049
v -30.982673645020 7.918982982635 0.719781637192
v -31.269193649292 8.134746551514 0.179117724299
v -31.706787109375 7.553994178772 1.080193877220
v -31.106275558472 6.387320995331 1.239339828491
v -30.631996154785 6.695800304413 2.059120416641
v -30.537212371826 6.370097637177 0.942601263523
v -29.887220382690 6.735074996948 1.670755863190
v -30.835031509399 9.384673118591 0.968822896481
v -31.395812988281 9.352155685425 1.688188552856
v -31.233854293823 8.978951454163 0.368816524744
v -32.088600158691 8.935916900635 0.351322680712
v -29.644744873047 3.813707113266 1.598033905029
v -29.659885406494 3.881285905838 1.584394216537
v -31.260017395020 2.097736597061 -1.285754442215
v -30.817529678345 0.729999065399 -0.544374883175
v -29.402599334717 3.801919698715 1.427372455597
v -30.136091232300 2.097736597061 -1.871825218201
v -29.373783111572 3.972135782242 1.490752935410
v -29.693603515625 0.729997932911 -1.130449056625
v -31.692405700684 -0.127986118197 -1.849611520767
v -30.795936584473 -0.127986118197 0.311684042215
v -30.088041305542 -0.127986118197 -2.686208009720
v -28.741167068481 -0.127986118197 -0.759780406952
v -31.578828811646 15.887893676758 1.674004077911
v -31.745822906494 16.320714950562 2.505528450012
v -31.808404922485 15.785044670105 2.626383543015
v -31.672298431396 16.188924789429 2.438270568848
v -31.708578109741 16.573745727539 2.017269372940
v -31.751691818237 16.790170669556 1.556319952011
v -31.674287796021 16.771411895752 1.552067637444
v -31.659198760986 16.908330917358 1.484740018845
v -31.726860046387 16.689754486084 2.086827278137
v -31.640680313110 16.650588989258 2.007683753967
v -31.528463363647 16.694005966187 0.969953894615
v -31.460699081421 16.709432601929 0.965959072113
v -31.491317749023 16.742624282837 0.979526340961
v -31.570585250854 16.717535018921 0.985545933247
v -31.712223052979 17.050382614136 1.623583555222
v -31.521949768066 16.822437286377 1.715049862862
v -31.598213195801 17.011877059937 1.632930397987
v -31.243717193604 16.947568893433 1.567442417145
v -31.309574127197 17.048273086548 1.516418218613
v -31.729145050049 16.489873886108 1.638548970222
v -31.616680145264 16.255460739136 1.911635160446
v -31.703607559204 15.462508201599 1.335338711739
v -31.668401718140 16.473613739014 1.889873743057
v -31.766733169556 16.456445693970 1.964226245880
v -31.619279861450 16.407691955566 1.641167640686
v -31.527168273926 16.534318923950 1.524406194687
v -31.528451919556 16.533403396606 1.753015518188
v -31.603404998779 16.404481887817 1.895789742470
v -31.629404067993 16.670101165771 1.700355768204
v -31.701160430908 16.622983932495 1.754912495613
v -31.512697219849 16.762035369873 1.530852437019
v -31.629613876343 16.585748672485 1.741165995598
v -31.761871337891 16.612373352051 1.743553638458
v -31.084661483765 8.354222297668 -7.097832679749
v -28.737159729004 7.216344356537 -3.752846240997
v -30.204565048218 8.893461227417 -5.629972457886
v -29.309412002563 8.798869132996 -4.884624481201
v -28.954425811768 7.968389511108 -5.235550880432
v -29.849805831909 7.906418323517 -5.982896804810
v -29.847072601318 8.387351036072 -4.548900604248
v -29.457881927490 8.075687408447 -5.256869316101
v -30.775289535522 8.476111412048 -5.423805713654
v -30.027734756470 8.053167343140 -5.567494869232
v -29.992691040039 4.305690765381 1.234726071358
v -29.571168899536 4.036267280579 2.001631259918
v -29.420114517212 4.376801490784 0.944743931293
v -28.975786209106 4.090212821960 1.695297122002
v -31.582000732422 16.641191482544 1.300131917000
v -31.604055404663 16.682695388794 1.060935854912
v -31.374748229980 16.712675094604 1.044995784760
v -31.352695465088 16.671171188354 1.284191727638
v -31.599693298340 16.791795730591 1.328872680664
v -31.370388031006 16.821773529053 1.312933087349
v -31.392442703247 16.863290786743 1.073737740517
v -31.621749877930 16.833311080933 1.089677572250
v -31.906486511230 14.767882347107 2.479254484177
v -32.141658782959 15.468361854553 3.321377515793
v -32.057750701904 15.277648925781 3.004572868347
v -31.880922317505 15.000683784485 2.384785175323
v -31.683845520020 15.224857330322 1.773367166519
v -31.673698425293 15.518347740173 2.028757572174
v -30.869192123413 16.094652175903 -0.095114916563
v -30.821786880493 16.574121475220 0.948193311691
v -30.640996932983 17.932716369629 0.948192775249
v -30.719123840332 17.384508132935 -0.394777327776
v -29.145776748657 0.223619028926 0.980777859688
v -28.461166381836 0.223619028926 0.853902697563
v -30.213954925537 0.652186095715 -1.836133003235
v -30.861829757690 0.652186155319 -0.781108260155
v -29.177198410034 -0.127986118197 1.237716913223
v -28.357734680176 -0.127986118197 1.085850000381
v -30.251062393188 -0.127986118197 -2.048913717270
v -31.032918930054 -0.127986222506 -0.924024283886
v -27.484622955322 8.664202690125 -5.921338081360
v -32.073020935059 7.356976032257 -4.695828914642
v -29.741661071777 7.656284809113 -4.793882369995
v -29.846357345581 7.681778907776 -5.004799842834
v -29.596649169922 7.730965137482 -5.120641708374
v -29.491954803467 7.705473423004 -4.909721851349
v -30.141965866089 8.537597656250 -4.452879905701
v -29.692926406860 8.541932106018 -4.574271202087
v -30.124855041504 8.600554466248 -4.945173263550
v -29.778091430664 8.351603507996 -4.919981479645
v -33.325271606445 17.505264282227 1.287179350853
v -32.397495269775 17.129987716675 -0.724039196968
v -33.306945800781 17.422872543335 1.314238667488
v -32.379295349121 17.046024322510 -0.696891903877
v -32.043392181396 17.330255508423 0.222997710109
v -32.411384582520 17.479423522949 1.020757794380
v -34.054271697998 19.959398269653 -0.566653847694
v -33.336788177490 19.527635574341 -1.913185358047
v -32.100658416748 18.944868087769 0.643081605434
v -31.719804763794 18.779035568237 0.181376591325
v -30.391792297363 17.501203536987 0.133264541626
v -31.319505691528 17.877267837524 2.144440174103
v -31.335071563721 17.993915557861 2.115446090698
v -30.407360076904 17.617853164673 0.104271054268
v -32.974411010742 21.034385681152 -0.465645283461
v -32.339542388916 20.702020645142 -1.983207583427
v -31.596229553223 17.672687530518 1.360634326935
v -31.778337478638 19.166721343994 0.850791215897
v -31.228239059448 17.523519515991 0.562875032425
v -31.626792907715 19.164421081543 0.389084637165
v -31.395812988281 9.352155685425 1.688188552856
v -32.088600158691 8.935916900635 0.351322680712
v -33.306945800781 17.422872543335 1.314238667488
v -32.379295349121 17.046024322510 -0.696891903877
v -30.391792297363 17.501203536987 0.133264541626
v -31.319505691528 17.877267837524 2.144440174103
v -33.325271606445 17.505264282227 1.287179350853
v -32.397495269775 17.129987716675 -0.724039196968
v -31.335071563721 17.993915557861 2.115446090698
v -30.407360076904 17.617853164673 0.104271054268
v -32.167892456055 15.150259017944 0.817123830318
v -32.292480468750 15.263488769531 0.611842215061
v -31.852001190186 15.027585029602 0.608804821968
v -32.062038421631 14.993104934692 0.684888422489
v -31.847116470337 15.102244377136 0.384583324194
v -32.246578216553 15.187336921692 0.246905580163
v -34.054271697998 19.959398269653 -0.566653847694
v -33.336788177490 19.527635574341 -1.913185358047
v -32.974411010742 21.034385681152 -0.465645283461
v -32.339542388916 20.702020645142 -1.983207583427
v -32.928104400635 13.206510543823 7.910933494568
v -32.943916320801 13.348491668701 7.829181671143
v -32.784313201904 13.303127288818 7.711736202240
v -32.768505096436 13.161140441895 7.793483734131
v -33.836784362793 13.215758323669 6.877782344818
v -34.089855194092 13.310139656067 7.098917484283
v -33.459545135498 12.944771766663 7.640221118927
v -33.202205657959 12.858826637268 7.459089756012
v -34.131282806396 13.625467300415 6.914244651794
v -33.397373199463 13.208617210388 7.565878868103
v -33.878219604492 13.531089782715 6.693112373352
v -33.140037536621 13.122680664063 7.384747505188
v -21.875457763672 10.284508705139 0.569477081299
v -21.581298828125 10.570493698120 0.008087125607
v -36.512210845947 6.479164600372 -9.387242317200
v -36.455619812012 6.534179210663 -9.495234489441
v -21.717227935791 9.742151260376 0.376089453697
v -21.423061370850 10.028150558472 -0.185298517346
v -36.481769561768 6.374832630157 -9.424442291260
v -36.425182342529 6.429849624634 -9.532436370850
# 426 vertices
g icemage
f 16 19 18 17
f 190 43 41 1
f 2 1 41 42
f 195 2 42 196
f 4 6 7 3
f 200 199 8 5
f 4 5 25 26
f 6 4 26 27
f 8 6 27 28
f 5 8 28 25
f 3 208 13 4
f 4 13 14 5
f 5 14 15 200
f 29 13 208 32
f 14 13 29 30
f 14 30 31 15
f 38 35 65 66
f 21 20 63 64
f 221 220 21 64
f 17 22 222 16
f 224 23 24 20
f 63 20 24 65
f 10 26 25 9
f 11 27 26 10
f 12 28 27 11
f 9 25 28 12
f 29 32 400 397
f 398 30 29 397
f 31 30 398 402
f 222 22 40 36
f 68 34 33 67
f 69 235 34 68
f 33 35 71 67
f 10 9 96 97
f 11 10 97 98
f 98 99 12 11
f 12 99 96 9
f 102 101 100 103
f 73 38 66 75
f 91 90 89 88
f 77 249 36 40
f 40 22 71 72
f 41 43 104 105
f 42 41 105 106
f 196 42 106 254
f 387 271 184 183
f 44 257 260 52
f 45 44 52 53
f 263 45 53 54
f 257 107 108 263
f 45 263 108 109
f 44 45 109 110
f 44 110 107 257
f 46 52 260 269
f 53 52 46 47
f 388 54 53 47
f 48 55 56 49
f 49 56 57 50
f 58 51 50 57
f 51 58 55 48
f 55 59 60 56
f 56 60 61 57
f 57 61 62 58
f 58 62 59 55
f 66 65 24 39
f 64 63 33 34
f 235 221 64 34
f 63 65 35 33
f 79 286 285 80
f 18 68 67 17
f 69 68 18 19
f 67 71 22 17
f 289 83 82 81
f 38 72 71 35
f 289 81 116 292
f 84 87 86 85
f 112 111 298 115
f 115 114 113 112
f 94 78 39 93
f 78 75 66 39
f 74 307 117 78
f 120 123 122 121
f 75 118 119 73
f 73 81 82 76
f 82 83 70 76
f 73 84 85 38
f 38 85 86 72
f 72 86 87 76
f 87 84 73 76
f 23 89 90 24
f 24 90 91 39
f 91 88 316 95
f 92 94 93 37
f 78 94 92 74
f 93 95 316 37
f 95 93 39 91
f 97 96 186 187
f 98 97 187 154
f 185 99 98 154
f 186 96 99 185
f 150 159 160 151
f 151 160 161 152
f 153 152 161 162
f 150 153 162 159
f 105 104 7 6
f 106 105 6 8
f 254 106 8 199
f 156 108 107 155
f 109 108 156 157
f 110 109 157 158
f 155 107 110 158
f 70 111 112 76
f 76 112 113 72
f 72 113 114 40
f 40 114 115 77
f 77 115 298 249
f 292 116 80 285
f 79 117 307 286
f 80 118 117 79
f 80 116 119 118
f 81 73 119 116
f 78 120 121 75
f 75 121 122 118
f 118 122 123 117
f 117 123 120 78
f 124 125 127 126
f 128 130 131 129
f 124 128 129 125
f 125 129 131 127
f 127 131 130 126
f 126 130 128 124
f 340 132 136 339
f 137 134 341 342
f 134 137 136 132
f 339 136 133 343
f 137 342 344 135
f 136 137 135 133
f 346 138 139 345
f 138 140 141 139
f 146 148 149 147
f 142 146 147 143
f 143 147 149 145
f 144 148 146 142
f 187 186 185 154
f 49 156 155 48
f 157 156 49 50
f 157 50 51 158
f 48 155 158 51
f 101 160 159 100
f 102 161 160 101
f 162 161 102 103
f 159 162 103 100
f 164 163 166 165
f 167 170 169 168
f 168 169 172 171
f 173 171 172 174
f 167 173 174 170
f 163 169 170 166
f 164 172 169 163
f 174 172 164 165
f 170 174 165 166
f 176 175 178 177
f 175 179 180 178
f 176 181 179 175
f 182 181 176 177
f 180 182 177 178
f 16 188 189 19
f 190 191 192 43
f 193 194 192 191
f 195 196 194 193
f 198 3 7 197
f 200 201 202 199
f 198 203 204 201
f 197 205 203 198
f 202 206 205 197
f 201 204 206 202
f 3 198 207 208
f 198 201 209 207
f 201 200 15 209
f 207 210 32 208
f 209 211 210 207
f 209 15 31 211
f 213 214 215 212
f 216 217 218 219
f 221 217 216 220
f 188 16 222 223
f 224 219 225 23
f 218 215 225 219
f 226 227 204 203
f 228 226 203 205
f 229 228 205 206
f 227 229 206 204
f 210 399 400 32
f 210 211 401 399
f 211 31 402 401
f 222 36 230 223
f 232 233 234 231
f 69 232 231 235
f 234 233 236 212
f 226 237 238 227
f 228 239 237 226
f 239 228 229 240
f 229 227 238 240
f 242 243 244 241
f 245 246 214 213
f 247 88 89 248
f 250 230 36 249
f 230 251 236 223
f 192 252 104 43
f 194 253 252 192
f 196 254 253 194
f 387 255 256 271
f 258 259 260 257
f 261 262 259 258
f 263 54 262 261
f 257 263 264 265
f 261 266 264 263
f 258 267 266 261
f 258 257 265 267
f 268 269 260 259
f 262 270 268 259
f 388 270 262 54
f 272 273 274 275
f 273 276 277 274
f 276 278 279 277
f 278 272 275 279
f 275 274 280 281
f 274 277 282 280
f 279 283 282 277
f 279 275 281 283
f 214 284 225 215
f 217 231 234 218
f 235 231 217 221
f 218 234 212 215
f 287 288 285 286
f 189 188 233 232
f 69 19 189 232
f 233 188 223 236
f 289 290 291 83
f 213 212 236 251
f 289 292 293 290
f 294 295 296 297
f 299 300 298 111
f 300 299 301 302
f 305 284 303 304
f 303 284 214 246
f 74 303 306 307
f 308 309 310 311
f 246 245 312 313
f 245 314 291 290
f 70 83 291 314
f 245 213 295 294
f 213 251 296 295
f 251 314 297 296
f 297 314 245 294
f 23 225 248 89
f 225 284 247 248
f 247 315 316 88
f 92 37 305 304
f 303 74 92 304
f 305 37 316 315
f 315 247 284 305
f 237 357 317 238
f 239 318 357 237
f 358 318 239 240
f 317 358 240 238
f 319 320 321 322
f 320 323 324 321
f 325 326 324 323
f 319 322 326 325
f 252 197 7 104
f 253 202 197 252
f 254 199 202 253
f 327 328 265 264
f 266 329 327 264
f 267 330 329 266
f 328 330 267 265
f 70 314 299 111
f 314 251 301 299
f 251 230 302 301
f 230 250 300 302
f 250 249 298 300
f 292 285 288 293
f 287 286 307 306
f 288 287 306 313
f 288 313 312 293
f 290 293 312 245
f 303 246 309 308
f 246 313 310 309
f 313 306 311 310
f 306 303 308 311
f 331 332 333 334
f 335 336 337 338
f 331 334 336 335
f 334 333 337 336
f 333 332 338 337
f 332 331 335 338
f 134 132 340 341
f 341 340 339 342
f 339 343 344 342
f 141 140 347 348
f 140 138 346 347
f 346 345 348 347
f 345 139 141 348
f 349 350 351 352
f 353 354 350 349
f 354 355 351 350
f 356 353 349 352
f 357 318 358 317
f 273 272 328 327
f 329 276 273 327
f 329 330 278 276
f 272 278 330 328
f 241 244 322 321
f 242 241 321 324
f 326 243 242 324
f 322 244 243 326
f 360 361 362 359
f 359 362 364 363
f 360 359 363 365
f 366 361 360 365
f 364 362 361 366
f 369 367 368 370
f 370 368 380 377
f 372 383 384 375
f 371 372 375 376
f 373 375 384 381
f 374 376 375 373
f 382 386 376 374
f 367 369 378 379
f 378 377 380 379
f 385 386 384 383
f 385 371 376 386
f 382 381 384 386
f 391 392 389 390
f 396 394 393 395
f 397 400 224 20
f 21 398 397 20
f 220 402 398 21
f 224 400 399 219
f 399 401 216 219
f 401 402 220 216
f 404 403 405 406
f 408 407 410 409
f 411 414 413 412
f 412 413 416 415
f 417 415 416 418
f 411 417 418 414
f 407 413 414 410
f 408 416 413 407
f 418 416 408 409
f 414 418 409 410
f 419 420 422 421
f 423 425 426 424
f 419 423 424 420
f 420 424 426 422
f 422 426 425 421
f 421 425 423 419
# 358 polygons

View File

@@ -0,0 +1,9 @@
FILE magier.obj
FLOATBITS 18
COLOR 160 160 192 48
SUBDIVIDE
SUBDIVIDE
SUBDIVIDE

View File

@@ -0,0 +1,55 @@
# Blender3D v246 OBJ File: pipe.blend
# www.blender3d.org
v 1.000000 -0.068392 -1.000000
v 1.000000 -0.068392 1.000000
v -1.000000 -0.068392 1.000000
v -1.000000 -0.068392 -1.000000
v 1.000000 1.931608 -1.000000
v 0.999999 1.931608 1.000000
v -1.000000 1.931608 1.000000
v -1.000000 1.931608 -1.000000
v -1.000000 7.137950 0.999999
v -1.000000 7.137950 -1.000000
v 0.999999 7.137950 1.000000
v 1.000000 7.137950 -1.000000
v 0.999999 8.430844 2.308585
v 1.000000 9.845057 0.894372
v -1.000000 9.845057 0.894372
v -1.000000 8.430844 2.308585
v -1.000000 11.799010 3.262538
v -1.000001 9.799011 3.262538
v 0.999999 9.799010 3.262539
v 1.000000 11.799009 3.262538
v 0.999999 11.799009 6.610482
v 0.999998 9.799010 6.610483
v -1.000002 11.799010 6.610482
v -1.000002 9.799011 6.610482
v -1.000002 9.885715 9.740471
v -1.000003 8.471502 8.326259
v 0.999997 8.471501 8.326258
v 0.999998 9.885714 9.740470
usemtl Material
s off
f 1 5 6 2
f 2 6 7 3
f 3 7 8 4
f 5 1 4 8
f 8 7 9 10
f 7 6 11 9
f 5 8 10 12
f 6 5 12 11
f 11 12 14 13
f 12 10 15 14
f 9 11 13 16
f 10 9 16 15
f 15 16 18 17
f 16 13 19 18
f 14 15 17 20
f 13 14 20 19
f 19 20 21 22
f 20 17 23 21
f 18 19 22 24
f 17 18 24 23
f 23 24 26 25
f 21 23 25 28
f 22 21 28 27

View File

@@ -0,0 +1,48 @@
# Blender3D v246 OBJ File: speaker.blend
# www.blender3d.org
v 1.000000 -1.000000 -1.000000
v 1.000000 -1.000000 1.000000
v -1.000000 -1.000000 1.000000
v -1.000000 -1.000000 -1.000000
v 1.329818 0.525312 -1.329816
v 1.329816 0.525312 1.329818
v -1.329818 0.525312 1.329817
v -1.329817 0.525312 -1.329817
v -4.513914 1.206360 -4.513916
v -4.513916 1.206361 4.513912
v 4.513912 1.206361 4.513916
v 4.513917 1.206360 -4.513913
v -1.000000 -0.628519 -1.000000
v -1.000000 -0.628519 1.000000
v 1.000000 -0.628519 1.000000
v 1.000000 -0.628519 -1.000000
v -1.000000 -1.110448 1.000000
v -1.000000 -1.110448 -1.000000
v 1.000000 -1.110448 1.000000
v 1.000000 -1.110448 -1.000000
v 0.409877 -0.126748 0.409877
v 0.409877 -0.126748 -0.409876
v -0.409876 -0.126748 -0.409877
v -0.409877 -0.126748 0.409877
usemtl Material
s off
f 5 8 7 6
f 1 5 6 2
f 2 6 7 3
f 3 7 8 4
f 5 1 4 8
f 12 16 13 9
f 14 10 9 13
f 15 11 10 14
f 16 12 11 15
f 16 15 14 13
f 3 4 18 17
f 2 3 17 19
f 4 1 20 18
f 1 2 19 20
f 20 19 17 18
f 11 12 22 21
f 12 9 23 22
f 10 11 21 24
f 9 10 24 23
f 22 23 24 21

View File

@@ -0,0 +1,13 @@
FILE speaker.obj
FLOATBITS 12
COLOR 192 192 192 64
SUBDIVIDE
SUBDIVIDE
SUBDIVIDE
SUBDIVIDE
SUBDIVIDE

View File

@@ -0,0 +1,746 @@
# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware
# File Created: 26.08.2010 19:00:58
#
# object yeti
#
v 1.314332127571 10.623770713806 1.420240998268
v 0.625918507576 10.517333030701 -0.526583313942
v 4.180276393890 17.195013046265 3.114506483078
v 4.850432872772 18.508104324341 -1.657061100006
v 4.060075759888 14.474054336548 1.769938468933
v -0.210936114192 14.025011062622 2.174564361572
v 4.353685379028 13.984340667725 -2.981467485428
v 2.066122293472 12.645709991455 1.764097332954
v 1.592382907867 11.209568977356 -1.731272697449
v -0.351546078920 13.067730903625 1.409396290779
v 1.702728748322 10.285366058350 0.728078603745
v 4.107552051544 18.050165176392 1.806145668030
v 4.937689304352 13.950608253479 -0.724246323109
v 3.771867513657 13.440473556519 -0.119294166565
v 2.363398551941 14.853709220886 0.849438130856
v 1.231210708618 12.911808013916 1.105312705040
v 0.776429951191 11.803779602051 1.086931228638
v 3.176019430161 16.640167236328 1.976472973824
v -0.493189245462 8.650757789612 0.510106861591
v 0.560467302799 8.809416770935 -1.298832654953
v 1.795096039772 9.138214111328 0.887199282646
v 1.241387605667 8.873748779297 2.078572511673
v -0.063236355782 16.776367187500 3.432990312576
v -0.149306580424 14.022768020630 3.082942962646
v 3.408163547516 14.440959930420 1.539299845695
v 3.767860174179 16.336364746094 2.781335353851
v 0.585282623768 10.529923439026 2.054375410080
v 0.105524852872 9.734599113464 2.366200685501
v 0.429444968700 11.356166839600 -0.881854951382
v -0.634224951267 11.198785781860 -0.740007579327
v 2.040129899979 11.267612457275 1.036928892136
v 1.402403354645 11.592227935791 1.951820135117
v -0.023261681199 11.007268905640 2.275835275650
v 0.752508461475 10.940473556519 2.067555189133
v 0.598677039146 11.656700134277 1.826556682587
v -0.161381125450 11.763227462769 1.925493717194
v 0.897665858269 12.768471717834 1.547745466232
v -0.095756396651 12.868602752686 1.753116846085
v -0.136435151100 12.122369766235 1.787559509277
v 0.686979055405 12.059694290161 1.658589243889
v 1.786469697952 13.892630577087 1.921871066093
v 0.111171841621 13.700503349304 2.584665536880
v 0.024621203542 13.242889404297 1.933269262314
v 1.416505455971 13.183135032654 1.701570153236
v 0.671737015247 19.294443130493 -2.484138250351
v 3.314612865448 18.157123565674 -2.005704879761
v 3.201619625092 15.928068161011 -2.885510206223
v 0.124579235911 16.981613159180 -3.827348947525
v 3.163069248199 -0.294663816690 6.847945690155
v 5.076788902283 -0.294663816690 6.223717689514
v 1.707496166229 -0.010998446494 2.385535717010
v 3.621215581894 -0.010998446494 1.761307597160
v 0.238128811121 7.458798408508 1.691676855087
v 1.359109878540 8.209510803223 1.622428774834
v 0.238128691912 7.232666015625 -0.791580855846
v 1.359109878540 8.196269035339 0.246045008302
v 4.987578392029 18.123369216919 1.694012045860
v 4.457374095917 16.583663940430 1.997020363808
v 4.279422760010 14.948985099792 1.385898232460
v 5.448926448822 15.047858238220 0.593832254410
v 6.484005451202 14.838102340698 -1.623559951782
v 6.321901321411 18.593492507935 -0.841494858265
v 8.317439079285 15.172784805298 3.453292369843
v 7.220720767975 14.388467788696 4.137443542480
v 7.572786808014 12.430075645447 5.189960479736
v 9.230917930603 11.755267143250 5.368982315063
v 10.844825744629 11.872086524963 3.723229169846
v 10.553778648376 13.638566017151 2.283097982407
v 12.019544601440 16.563951492310 8.847179412842
v 10.816220283508 16.585742950439 9.058531761169
v 10.668390274048 15.567550659180 9.506174087524
v 11.647694587708 14.912013053894 9.755078315735
v 12.806382179260 14.809663772583 9.150767326355
v 12.965273857117 15.847500801086 8.693296432495
v 10.117362022400 17.155076980591 6.269696712494
v 8.205344200134 16.277963638306 6.985670089722
v 7.795433521271 13.702623367310 8.166699409485
v 10.741980552673 12.099314689636 7.966635704041
v 12.484533309937 13.002366065979 6.467772960663
v 12.194471359253 15.725602149963 5.100582599640
v 8.658669471741 14.571877479553 3.607074022293
v 8.143432617188 14.073976516724 3.875048398972
v 8.085231781006 13.382689476013 3.525587558746
v 8.628991127014 13.314910888672 2.948162078857
v 8.960724830627 13.830489158630 2.331645488739
v 9.024043083191 14.538259506226 2.684873342514
v 9.864500999451 15.254542350769 9.291102409363
v 11.941793441772 13.935882568359 8.830650329590
v 12.955663681030 14.940114974976 10.528685569763
v 10.878380775452 16.258773803711 10.989130020142
v 10.465517997742 16.605640411377 8.133187294006
v 11.479391098022 17.609884262085 9.831212997437
v 13.556679725647 16.291212081909 9.370770454407
v 12.552516937256 14.940005302429 7.793585777283
v 4.070079326630 4.635048389435 4.121130466461
v 1.558646321297 4.486677169800 4.965374469757
v 3.121975421906 4.639068126678 1.358950972557
v 1.190529108047 4.497227668762 2.012906074524
v 1.371363162994 5.284864425659 3.807677507401
v 3.058949470520 5.418428897858 3.279914140701
v 2.856006860733 5.493698596954 2.273089170456
v 1.144548773766 5.100633144379 2.682417392731
v 5.235395431519 1.267968416214 3.098830699921
v 3.814800262451 0.158752471209 -1.256348729134
v -0.770572721958 0.158752784133 0.239333629608
v 1.192423939705 1.267969369888 4.417592048645
v 11.372889518738 16.501575469971 7.719831943512
v 9.957793235779 16.347127914429 8.211069107056
v 9.769875526428 15.106131553650 9.243859291077
v 11.406728744507 14.230610847473 9.583378791809
v 12.738918304443 14.214807510376 8.602041244507
v 12.731384277344 15.177521705627 7.721199512482
v 0.209453314543 21.996494293213 5.323814392090
v 1.346630334854 22.276943206787 4.506127834320
v 1.274773716927 21.889976501465 3.665192365646
v 0.260266214609 22.921991348267 2.881885051727
v -0.495462775230 22.508146286011 5.176055431366
v 0.434058725834 18.503526687622 2.600007057190
v 2.744607925415 19.292034149170 2.064757823944
v 2.994823694229 19.725376129150 1.225018262863
v -1.024152755737 19.489009857178 5.193631172180
v 0.394533455372 19.622484207153 5.221730709076
v 1.601295948029 20.445066452026 4.589701652527
v 2.188350677490 20.825193405151 2.249223232269
v -0.814185619354 20.990585327148 5.267087936401
v 0.222079247236 20.925880432129 5.160559654236
v 1.956332683563 21.532526016235 4.672331333160
v 1.735772609711 22.165149688721 2.570432901382
v 0.549379646778 22.385635375977 1.404956102371
v 1.232834458351 20.728425979614 4.318493366241
v 1.381327390671 21.440717697144 4.321575164795
v 0.057782933116 20.602193832397 4.788325786591
v -0.214439749718 19.949258804321 4.754437446594
v 1.723861455917 20.723516464233 2.891973018646
v 1.291361451149 22.034339904785 2.630550622940
v 0.578930079937 21.001504898071 3.232609033585
v -0.043895080686 20.993633270264 2.728995323181
v -0.205326437950 19.871749877930 2.873221158981
v 0.924375176430 19.247634887695 2.480952978134
v -0.665877819061 20.298532485962 4.633618354797
v -0.273819565773 20.299499511719 4.756604671478
v -0.234876766801 21.243244171143 4.639650344849
v -0.198173791170 20.362071990967 4.780577182770
v 0.197509706020 20.458591461182 4.845102310181
v 0.047884151340 21.337074279785 4.735821247101
v -0.300373435020 21.254243850708 4.684960842133
v 0.286611765623 20.531881332397 4.825314044952
v 0.635717928410 20.673826217651 4.790056228638
v 0.323594927788 21.525690078735 4.798839092255
v 0.007018841803 21.373706817627 4.841049194336
v 0.759402155876 20.749210357666 4.690922260284
v 1.044423341751 20.930545806885 4.609981060028
v 0.643846035004 21.649518966675 4.637950897217
v 0.370059430599 21.451038360596 4.719588756561
v 11.370756149292 15.403600692749 8.371135711670
v 11.075138092041 15.408411026001 8.421906471252
v 11.046102523804 15.212824821472 8.495439529419
v 11.304404258728 15.048144340515 8.575037956238
v 11.586236000061 15.016310691833 8.408514976501
v 11.619465827942 15.214001655579 8.329041481018
v -0.788815259933 19.639696121216 4.662641048431
v -0.467963755131 19.599403381348 4.764943122864
v -0.411437600851 20.092605590820 4.778760433197
v -0.710743844509 20.131189346313 4.681683063507
v -0.294105172157 19.634372711182 4.744843959808
v 0.001451201737 19.692813873291 4.751884460449
v -0.101606592536 20.160507202148 4.794797420502
v -0.377689898014 20.111114501953 4.793797969818
v 0.102887794375 19.747312545776 4.730805397034
v 0.357470959425 19.846076965332 4.647753715515
v 0.201370924711 20.238107681274 4.699004173279
v -0.044060893357 20.149099349976 4.785582542419
v 0.610186159611 20.165969848633 1.971378684044
v 0.140422150493 19.723609924316 4.419354438782
v 0.125103801489 20.104207992554 4.434136867523
v 0.600193917751 20.497343063354 1.996145725250
v 11.132748603821 14.081577301025 12.261481285095
v 11.344567298889 13.947119712830 12.214531898499
v 11.395352363586 13.914007186890 12.538464546204
v 11.183533668518 14.048475265503 12.585412979126
v 11.754401206970 15.740092277527 12.048895835876
v 12.495170593262 15.269845008850 11.884695053101
v 12.953685760498 15.740643501282 12.604961395264
v 12.212916374207 16.210893630981 12.769162178040
v 5.046970367432 17.185993194580 2.600825071335
v 5.034593105316 15.812689781189 2.853672027588
v 5.085008144379 15.022797584534 2.569435358047
v 6.773377895355 14.102838516235 4.067620277405
v 6.826600074768 14.735031127930 4.387204170227
v 7.297788619995 15.567758560181 4.142139434814
v 0.575494229794 19.858240127563 4.560906410217
v 0.785040438175 19.994735717773 4.472736835480
v 0.488455951214 20.410673141479 4.558507442474
v 0.271131455898 20.263231277466 4.643347263336
v -0.553714632988 21.243156433105 4.536312580109
v -1.433292627335 22.240844726563 4.795571327209
v -1.816316246986 22.717163085938 3.498183250427
v -0.026917345822 23.182056427002 4.227444648743
v -0.337901383638 10.986615180969 2.321347475052
v -1.104154586792 10.973947525024 2.415193080902
v -1.323405981064 11.662999153137 2.111299514771
v -0.516992390156 11.779050827026 1.963051676750
v -1.902063012123 10.831643104553 2.152791738510
v -2.377029657364 10.344623565674 0.954103469849
v -2.484564065933 10.949427604675 0.315402299166
v -2.065407991409 11.586920738220 2.248194456100
v -1.605675339699 10.726692199707 -0.368705689907
v -0.689090073109 9.694777488708 -0.561212480068
v -1.147760391235 11.607524871826 -0.914222896099
v -4.339358329773 16.314424514771 3.626734972000
v -3.643629074097 16.208965301514 2.317269086838
v -3.075538873672 14.776071548462 1.429522633553
v -4.469233989716 14.560177803040 2.633969068527
v -10.429918289185 8.924689292908 4.579857349396
v -10.520167350769 9.003962516785 4.758938312531
v -10.306502342224 9.072105407715 4.980929851532
v -10.117010116577 8.875373840332 4.668329238892
v -1.569898843765 16.997430801392 -3.593836069107
v -1.326125979424 18.978244781494 -2.165946006775
v -4.374059200287 17.878072738647 -1.537585616112
v -4.041964530945 15.643017768860 -2.444267034531
v -2.688011169434 12.735500335693 2.310749053955
v -2.046218395233 12.862777709961 1.567772865295
v -2.421931266785 11.638953208923 -1.228927493095
v -4.975103378296 14.357153892517 -1.801578044891
v -4.703036785126 14.248079299927 0.400856524706
v -4.424059391022 13.877016067505 0.750735044479
v -0.823632359505 12.382283210754 -1.113528490067
v -0.817737281322 13.950378417969 -2.013253211975
v -0.493189245462 8.957030296326 0.101068302989
v -1.566474318504 8.794699668884 -1.274345397949
v -2.807840347290 9.127334594727 0.951287925243
v -1.353462100029 22.415794372559 2.802138566971
v -10.016528129578 9.132749557495 5.028144836426
v -9.932551383972 9.057652473450 4.849781513214
v -2.161795377731 13.767850875854 2.284933567047
v -0.349008202553 13.619172096252 2.600627660751
v -0.418317526579 13.177232742310 1.936998009682
v -1.867313981056 13.021327018738 2.074200868607
v -1.505555152893 12.702034950256 1.963621616364
v -0.441641181707 12.872829437256 1.793002963066
v -0.491593062878 12.131579399109 1.829858660698
v -1.355699777603 12.046169281006 2.015032768250
v 0.086794272065 16.741462707520 3.411396503448
v 0.000724926591 13.987863540649 3.061349391937
v -3.859236955643 14.483927726746 2.253036499023
v -3.993047952652 15.852533340454 3.189259529114
v 0.092090904713 18.027463912964 4.476171493530
v -0.116254843771 17.052566528320 2.559793710709
v -2.227766036987 8.863530158997 2.177206993103
v -1.211458325386 9.758448600769 2.455739259720
v -0.549831867218 9.554021835327 2.418000459671
v -0.493189245462 8.337011337280 2.245642662048
v -1.005219459534 10.657509803772 2.386000156403
v -0.299399316311 10.616191864014 2.204678297043
v -1.498715639114 11.666466712952 1.316044807434
v -0.361890435219 11.941252708435 1.408053636551
v -0.207519352436 20.754594802856 -1.004854917526
v -5.100049495697 18.557579040527 -1.031350374222
v -2.969249010086 -0.257548689842 3.435474634171
v -2.404259204865 -0.132012546062 -1.231137752533
v -4.402620792389 -0.132012546062 -1.473081231117
v -4.967611312866 -0.257548689842 3.193531036377
v -5.722054004669 1.205904603004 0.107997611165
v -1.500251889229 1.205871105194 0.619037091732
v -5.176235198975 -0.056890159845 -4.400267601013
v -0.954445183277 -0.056889243424 -3.889132261276
v -4.698151588440 18.087125778198 1.963422179222
v -4.881496429443 16.774679183960 2.326860427856
v -6.297142982483 17.526973724365 1.072813034058
v -4.364029407501 14.474310874939 0.921766996384
v -5.204586029053 14.471834182739 -0.193547293544
v -6.351468086243 14.453694343567 -1.939906835556
v -7.011885166168 17.173263549805 -1.356396913528
v -5.996282577515 16.860298156738 2.022351026535
v -5.131925106049 16.072990417480 2.431679248810
v -7.009764671326 13.393430709839 2.497391939163
v -7.491403579712 13.558509826660 2.256341457367
v -4.916592121124 15.322458267212 2.043268203735
v -6.652422904968 13.067894935608 2.191553354263
v -7.620923519135 11.747973442078 0.505180597305
v -7.255540370941 11.885508537292 1.198909282684
v -8.045276641846 12.324373245239 -0.086816988885
v -8.544428825378 12.776358604431 0.333025634289
v -8.410820960999 12.733423233032 1.315567016602
v -9.090394020081 14.267187118530 2.567953586578
v -7.416586399078 13.760046958923 2.804419994354
v -8.064449310303 12.104849815369 5.519719123840
v -10.654025077820 12.457002639771 5.534173011780
v -6.546365261078 12.123166084290 2.412967920303
v -6.792917728424 10.162062644958 4.677184104919
v -7.363391876221 10.785151481628 1.530357599258
v -8.784414291382 8.268274307251 2.743216276169
v -8.907815933228 11.117248535156 -0.152283146977
v -10.994162559509 9.155460357666 2.088630437851
v -10.003880500793 13.130916595459 -0.000861645734
v -12.128422737122 11.730845451355 3.292875289917
v -9.209101676941 9.817576408386 6.054382324219
v -10.711824417114 9.773313522339 5.967722415924
v -8.476883888245 8.817212104797 5.003099441528
v -9.730105400085 7.830090999603 3.995076417923
v -11.298230171204 8.255322456360 3.681793689728
v -11.857752799988 9.407767295837 4.762355327606
v -7.795100688934 12.905997276306 1.623378753662
v -8.572031974792 8.752280235291 5.144316196442
v -10.437286376953 8.307763099670 3.535209417343
v -10.949327468872 6.454314708710 4.640764236450
v -9.084073066711 6.898839473724 6.249881267548
v -9.747138977051 9.728564262390 6.236776828766
v -10.259181022644 7.875117778778 7.342337608337
v -12.124428749084 7.430591106415 5.733224391937
v -11.612391471863 9.284042358398 4.627660751343
v -8.525933265686 5.432276248932 4.259545803070
v -8.716138839722 5.386947154999 4.095461368561
v -8.645595550537 5.065109729767 4.102601528168
v -8.455398559570 5.110433578491 4.266685962677
v -3.508063554764 4.668843269348 0.389148205519
v -3.363759279251 5.636010169983 1.117675781250
v -3.571665525436 5.975960731506 2.209834337234
v -4.078780651093 5.064280986786 3.225779771805
v -1.505940675735 4.592480659485 0.794044971466
v -1.643558382988 5.308066368103 1.547214269638
v -1.476429462433 4.999841690063 3.741227865219
v -1.851463794708 5.648015975952 2.639372825623
v -2.345488548279 8.403146743774 2.449186563492
v -1.224507331848 7.653771400452 2.512281179428
v -2.345488548279 8.391988754272 1.063202857971
v -1.224507331848 7.427639007568 0.029023583978
v -9.747764587402 8.741217613220 6.305990219116
v -10.929364204407 8.498507499695 6.110970497131
v -9.291212081909 8.288903236389 5.386250495911
v -10.003801345825 7.644118785858 4.660173892975
v -11.267092704773 7.774911403656 4.335814476013
v -11.740447044373 8.234076499939 5.272163867950
v -2.647537946701 18.607414245605 2.403655767441
v -0.398358345032 18.544706344604 2.567007780075
v -3.177245140076 19.814607620239 0.286162763834
v 1.042062282562 21.082956314087 -0.560458004475
v 0.060336455703 18.605728149414 2.950746059418
v -2.518361330032 20.796836853027 3.281527757645
v -2.087504386902 19.914682388306 4.453348159790
v -1.590026617050 21.105251312256 1.043216586113
v 0.769906103611 21.894365310669 0.154594197869
v -1.599653840065 20.973529815674 1.832125663757
v -0.890138566494 22.184608459473 1.911024808884
v -0.833358108997 21.057140350342 2.772016286850
v -0.193734630942 19.245420455933 2.292565822601
v -1.190763831139 22.378578186035 1.611273765564
v -2.673269271851 21.928880691528 3.181867837906
v -1.639484167099 21.142704010010 4.568805694580
v -2.025445938110 21.726961135864 3.222366094589
v -2.020741939545 21.001731872559 3.281077146530
v -1.362013339996 20.753194808960 4.339628219604
v -0.736630856991 20.701667785645 4.860389709473
v -1.240293264389 20.054353713989 4.436268329620
v -0.867165565491 19.970785140991 4.969744205475
v -0.750081062317 20.308370590210 4.607372283936
v -1.136039257050 20.399627685547 4.487499237061
v -0.872017204762 21.324506759644 4.433781623840
v -1.197673797607 20.476682662964 4.467945098877
v -1.534822702408 20.635271072388 4.299048900604
v -1.171107053757 21.480421066284 4.342116832733
v -0.860022306442 21.329694747925 4.505421161652
v -1.582044243813 20.713603973389 4.234140872955
v -1.819215536118 20.888000488281 4.007954120636
v -1.417783737183 21.698492050171 4.231680393219
v -1.184795141220 21.520507812500 4.456363677979
v -1.849651455879 20.974643707275 3.858372926712
v -2.002878665924 21.191648483276 3.634537696838
v -1.579282402992 21.841094970703 3.911918401718
v -1.426054954529 21.624097824097 4.135755538940
v -0.833851635456 19.582759857178 4.638945102692
v -1.161524534225 19.614780426025 4.543101310730
v -1.075525045395 20.167078018188 4.572563648224
v -0.771468758583 20.138029098511 4.662826538086
v -1.273487329483 19.667001724243 4.433852672577
v -1.497527360916 19.770359039307 4.279274940491
v -1.321674704552 20.293586730957 4.414492607117
v -1.108669519424 20.193805694580 4.566733360291
v -1.571323990822 19.839405059814 4.201626777649
v -1.705143213272 19.960283279419 3.994483232498
v -1.495726823807 20.411911010742 4.167451858521
v -1.364056110382 20.290054321289 4.373929023743
v -0.132663473487 20.159912109375 1.729213118553
v -1.359064936638 19.852714538574 3.955346345901
v -1.297272562981 20.232295989990 3.989447832108
v -0.125787690282 20.479883193970 1.756808638573
v -10.107940673828 5.393135070801 5.211322784424
v -9.442782402039 5.551656246185 5.785136699677
v -10.358691215515 4.600616455078 5.720925331116
v -9.693542480469 4.759130001068 6.294745445251
v -1.772950768471 20.059461593628 3.827646493912
v -1.868857145309 20.220109939575 3.639699459076
v -1.614065289497 20.609409332275 3.895127534866
v -1.515480995178 20.443634033203 4.083107948303
# 395 vertices
g yeti
f 113 114 198 117
f 33 34 35 36
f 11 31 32 1
f 2 208 30 29
f 18 15 5 3
f 160 155 158 159
f 45 46 47 48
f 8 5 15 16
f 9 7 13 14
f 229 7 9 228
f 19 230 20 55
f 115 116 198 114
f 2 29 31 11
f 155 156 157 158
f 5 8 14 13
f 42 43 44 41
f 37 38 39 40
f 23 24 25 26
f 248 249 18 3
f 208 2 20 230
f 2 11 21 20
f 11 1 22 21
f 22 28 252 253
f 249 6 24 23
f 6 15 25 24
f 15 18 26 25
f 18 249 23 26
f 27 255 252 28
f 22 1 27 28
f 27 1 32 17
f 31 14 8 32
f 228 9 29 30
f 29 9 14 31
f 32 8 16 17
f 255 27 34 33
f 27 17 35 34
f 17 257 36 35
f 257 255 33 36
f 16 10 38 37
f 10 257 39 38
f 257 17 40 39
f 17 16 37 40
f 15 6 42 41
f 6 10 43 42
f 10 16 44 43
f 16 15 41 44
f 258 4 46 45
f 4 7 47 46
f 7 229 48 47
f 229 258 45 48
f 49 51 52 50
f 50 103 106 49
f 50 52 104 103
f 51 105 104 52
f 49 106 105 51
f 57 12 3 58
f 3 5 59 58
f 5 13 60 59
f 13 7 61 60
f 7 4 62 61
f 4 12 57 62
f 186 189 190 185
f 187 188 189 186
f 60 84 83 59
f 60 61 85 84
f 61 62 86 85
f 57 81 86 62
f 63 64 76 75
f 65 77 76 64
f 66 78 77 65
f 66 67 79 78
f 67 68 80 79
f 63 75 80 68
f 108 107 75 76
f 77 109 108 76
f 78 110 109 77
f 111 110 78 79
f 112 111 79 80
f 107 112 80 75
f 82 64 63 81
f 83 65 64 82
f 84 66 65 83
f 67 66 84 85
f 68 67 85 86
f 81 63 68 86
f 87 88 89 90
f 91 92 93 94
f 87 90 92 91
f 177 178 179 180
f 89 88 94 93
f 88 87 91 94
f 101 100 95 97
f 98 102 101 97
f 99 102 98 96
f 54 53 99 100
f 56 54 100 101
f 102 55 56 101
f 53 55 102 99
f 95 96 106 103
f 97 95 103 104
f 98 97 104 105
f 106 96 98 105
f 70 69 107 108
f 71 70 108 109
f 110 72 71 109
f 73 72 110 111
f 74 73 111 112
f 69 74 112 107
f 21 22 54 56
f 22 253 53 54
f 253 19 55 53
f 99 96 95 100
f 3 12 119 118
f 12 4 120 119
f 258 338 120 4
f 248 3 118 339
f 119 123 122 118
f 120 124 123 119
f 343 124 120 338
f 122 121 339 118
f 134 135 136 139
f 124 128 127 123
f 129 128 124 343
f 139 136 137 138
f 127 114 113 126
f 127 128 115 114
f 129 116 115 128
f 126 113 117 125
f 123 127 131 130
f 127 126 132 131
f 126 125 354 132
f 121 122 133 356
f 122 123 130 133
f 130 131 135 134
f 131 132 136 135
f 132 354 137 136
f 356 133 139 138
f 133 130 134 139
f 140 141 142 195
f 143 144 145 146
f 147 148 149 150
f 151 152 153 154
f 69 70 156 155
f 70 71 157 156
f 71 72 158 157
f 72 73 159 158
f 73 74 160 159
f 74 69 155 160
f 161 162 163 164
f 165 166 167 168
f 169 170 171 172
f 174 175 386 385
f 174 173 176 175
f 89 182 181 90
f 89 93 183 182
f 92 184 183 93
f 90 181 184 92
f 178 177 181 182
f 179 178 182 183
f 180 179 183 184
f 181 177 180 184
f 57 58 186 185
f 58 59 187 186
f 59 83 188 187
f 83 82 189 188
f 82 81 190 189
f 81 57 185 190
f 191 192 193 194
f 196 117 198 197
f 199 202 201 200
f 204 203 206 205
f 207 209 30 208
f 211 210 213 212
f 215 214 217 216
f 219 218 221 220
f 222 223 212 213
f 224 227 226 225
f 229 228 224 225
f 19 328 231 230
f 233 197 198 116
f 207 204 205 209
f 216 217 235 234
f 213 226 227 222
f 237 236 239 238
f 240 243 242 241
f 244 247 246 245
f 248 210 211 249
f 208 230 231 207
f 207 231 232 204
f 204 232 250 203
f 250 253 252 251
f 249 244 245 6
f 6 245 246 212
f 212 246 247 211
f 211 247 244 249
f 254 251 252 255
f 250 251 254 203
f 254 256 206 203
f 205 206 222 227
f 228 30 209 224
f 209 205 227 224
f 206 256 223 222
f 255 199 200 254
f 254 200 201 256
f 256 201 202 257
f 257 202 199 255
f 223 240 241 10
f 10 241 242 257
f 257 242 243 256
f 256 243 240 223
f 212 236 237 6
f 6 237 238 10
f 10 238 239 223
f 223 239 236 212
f 258 219 220 259
f 259 220 221 225
f 225 221 218 229
f 229 218 219 258
f 260 263 262 261
f 263 260 265 264
f 263 264 266 262
f 261 262 266 267
f 260 261 267 265
f 268 270 269 210
f 210 269 271 213
f 213 271 272 226
f 226 272 273 225
f 225 273 274 259
f 259 274 270 268
f 276 275 278 277
f 279 276 277 280
f 272 271 282 281
f 272 281 283 273
f 273 283 284 274
f 270 274 284 285
f 286 289 288 287
f 290 287 288 291
f 292 290 291 293
f 292 293 295 294
f 294 295 297 296
f 286 296 297 289
f 298 288 289 299
f 291 288 298 300
f 293 291 300 301
f 302 295 293 301
f 303 297 295 302
f 299 289 297 303
f 304 285 286 287
f 282 304 287 290
f 281 282 290 292
f 294 283 281 292
f 296 284 283 294
f 285 284 296 286
f 305 308 307 306
f 309 312 311 310
f 305 309 310 308
f 313 316 315 314
f 307 311 312 306
f 306 312 309 305
f 318 317 320 319
f 321 317 318 322
f 324 323 321 322
f 325 319 324 326
f 327 318 319 325
f 322 318 327 328
f 326 324 322 328
f 320 264 265 323
f 317 266 264 320
f 321 267 266 317
f 265 267 321 323
f 329 298 299 330
f 331 300 298 329
f 301 300 331 332
f 333 302 301 332
f 334 303 302 333
f 330 299 303 334
f 232 327 325 250
f 250 325 326 253
f 253 326 328 19
f 324 319 320 323
f 210 336 335 268
f 268 335 337 259
f 258 259 337 338
f 248 339 336 210
f 335 336 341 340
f 337 335 340 342
f 343 338 337 342
f 341 336 339 121
f 344 347 346 345
f 342 340 349 348
f 129 343 342 348
f 347 138 137 346
f 349 350 196 197
f 349 197 233 348
f 129 348 233 116
f 350 125 117 196
f 340 352 351 349
f 349 351 353 350
f 350 353 354 125
f 121 356 355 341
f 341 355 352 340
f 352 344 345 351
f 351 345 346 353
f 353 346 137 354
f 356 138 347 355
f 355 347 344 352
f 357 195 359 358
f 360 363 362 361
f 364 367 366 365
f 368 371 370 369
f 330 216 234 329
f 329 234 235 331
f 331 235 217 332
f 332 217 214 333
f 333 214 215 334
f 334 215 216 330
f 372 375 374 373
f 376 379 378 377
f 380 383 382 381
f 384 173 174 385
f 176 387 386 175
f 385 386 387 384
f 307 308 389 388
f 307 388 390 311
f 310 311 390 391
f 308 310 391 389
f 314 388 389 313
f 315 390 388 314
f 316 391 390 315
f 389 391 316 313
f 270 275 276 269
f 269 276 279 271
f 271 279 280 282
f 282 280 277 304
f 304 277 278 285
f 285 278 275 270
f 392 395 394 393
f 20 21 56 55
f 327 232 231 328
# 339 polygons

View File

@@ -0,0 +1,9 @@
FILE yeti.obj
FLOATBITS 18
COLOR 256 256 256 24
SUBDIVIDE
SUBDIVIDE
SUBDIVIDE

View File

@@ -0,0 +1,30 @@
#pragma once
#ifndef BINMESHDATA_HEADER
#define BINMESHDATA_HEADER
struct BinVertex
{
float m_Pos[ 3 ];
};
struct BinMesh
{
int m_PrimitiveCount;
unsigned char* m_pTopology;
BinVertex* m_pVertex;
void Set( int PrimitiveCount,
unsigned char* Vertex,
unsigned char* Topology )
{
m_PrimitiveCount= PrimitiveCount;
m_pVertex= (BinVertex*)Vertex;
m_pTopology= Topology;
}
static const unsigned char c_FinishPoly= 255;
static const unsigned char c_FarVertex= 254;
};
#endif

View File

@@ -0,0 +1,957 @@
#include "defines.h"
#include "ConfigFiles.h"
#include "globals.h"
#include "ShaderFactory.h"
#include "textinfo.h"
#include "entityinfo.h"
#include "intrin.h"
#include "greebledata.h"
#include "cave.h"
HANDLE g_FileChangeNotification= NULL;
static std::string g_strShaderData;
extern int g_iActLoadStep;
void StopFileWatch()
{
if (g_FileChangeNotification != INVALID_HANDLE_VALUE && g_FileChangeNotification != NULL)
{
FindCloseChangeNotification(g_FileChangeNotification);
}
g_FileChangeNotification= NULL;
}
void StartFileWatch()
{
StopFileWatch();
std::string strPath= ".\\cfg\\";
g_FileChangeNotification= FindFirstChangeNotification(
strPath.c_str(),
FALSE,
FILE_NOTIFY_CHANGE_LAST_WRITE );
}
bool CheckFileWatch()
{
if (g_FileChangeNotification == INVALID_HANDLE_VALUE || g_FileChangeNotification == NULL)
{
return false;
}
DWORD dwRet= WaitForSingleObject( g_FileChangeNotification, 1 );
if( WAIT_OBJECT_0 == dwRet )
{
FindNextChangeNotification( g_FileChangeNotification );
g_iActLoadStep= 0;
ReadDataFromDisc();
// Shader neu compilieren
PrepareShaders();
//Texte neu setzen
CreateTextRenderJobs();
SetCrystalPos();
return true;
}
return false;
}
void ReadSceneTxt()
{
FrameWork::TextFileReader tfr;
tfr.read( "cfg/scene.txt" );
for( int i= 0; i < (int)tfr.getFileLines().size(); ++i )
{
std::string strAct= tfr.getFileLines()[ i ];
std::string strCommandFull;
if( FrameWork::StringHelper::splitAt( strAct, "=", strCommandFull ) )
{
}
std::stringstream ss;
ss << strAct;
if( strCommandFull.size() < 4 )
{
continue;
}
int iFunc= strCommandFull[ strCommandFull.size() - 1 ] - '0';
iFunc+= 10 * ( strCommandFull[ strCommandFull.size() - 2 ] - '0' );
iFunc+= 100 * ( strCommandFull[ strCommandFull.size() - 3 ] - '0' );
std::string strCommand;
strCommand= strCommandFull.substr( 0, strCommandFull.size() - 3 );
if( strCommand == "SCENE" )
{
DWORD dwMask= 0;
for( int j= 0; j < 32; ++j )
{
char c= '.';
ss >> c;
if( c != '.' )
{
dwMask|= 1 << j;
}
}
g_SceneMask[ iFunc ]= dwMask;
}
}
}
int g_iCurSpriptLength;
int g_iCurSpriptParams;
void ReadScriptTxt()
{
/*
g_iCurSpriptLength= 0;
g_iCurSpriptParams= 0;
FrameWork::TextFileReader tfrScript;
tfrScript.read( "cfg/script.txt" );
//#ifdef SCRIPTEDITOR
for( int i= 0; i < (int)tfrScript.getFileLines().size(); ++i )
{
std::string strAct= tfrScript.getFileLines()[ i ];
std::string strCommandFull;
if( FrameWork::StringHelper::splitAt( strAct, "=", strCommandFull ) )
{
}
std::stringstream ss;
ss << strAct;
if( strCommandFull == "SKIP" )
{
#ifdef SCRIPTEDITOR
ss >> g_iSkipTicks;
#endif
}
if( strCommandFull == "CLEAN" )
{
g_iCurSpriptLength= 0;
g_iCurSpriptParams= 0;
}
else if( strCommandFull == "CSPEED" )
{
g_Script[ g_iCurSpriptLength++ ]= CSPEED;
ss >> g_ScriptParamFloat[ g_iCurSpriptParams++ ];
}
else if( strCommandFull == "OSPEED" )
{
g_Script[ g_iCurSpriptLength++ ]= OSPEED;
ss >> g_ScriptParamFloat[ g_iCurSpriptParams++ ];
}
else if( strCommandFull == "CTIME" )
{
g_Script[ g_iCurSpriptLength++ ]= CTIME;
ss >> g_ScriptParamFloat[ g_iCurSpriptParams++ ];
}
else if( strCommandFull == "OTIME" )
{
g_Script[ g_iCurSpriptLength++ ]= OTIME;
ss >> g_ScriptParamFloat[ g_iCurSpriptParams++ ];
}
else if( strCommandFull == "CAM" )
{
g_Script[ g_iCurSpriptLength++ ]= CAM;
int iVal= 0;
ss >> iVal;
g_Script[ g_iCurSpriptLength++ ]= iVal;
}
else if( strCommandFull == "CAM" )
{
g_Script[ g_iCurSpriptLength++ ]= CAM;
int iVal= 0;
ss >> iVal;
g_Script[ g_iCurSpriptLength++ ]= iVal;
}
else if( strCommandFull == "OBJ" )
{
g_Script[ g_iCurSpriptLength++ ]= OBJ;
int iVal= 0;
ss >> iVal;
g_Script[ g_iCurSpriptLength++ ]= iVal;
iVal= 0;
ss >> iVal;
g_Script[ g_iCurSpriptLength++ ]= iVal;
}
else if( strCommandFull == "TICK" )
{
g_Script[ g_iCurSpriptLength++ ]= TICK;
int iVal= 0;
ss >> iVal;
g_Script[ g_iCurSpriptLength++ ]= iVal;
}
else if( strCommandFull == "QUIT" )
{
g_Script[ g_iCurSpriptLength++ ]= QUIT;
}
}
//#endif
*/
}
void SetParamValue( int Bank, int i, float fVal )
{
g_GreebleParam[ Bank * 4 + i ]= fVal;
}
void ReadParamTxt()
{
FrameWork::TextFileReader tfrSong;
tfrSong.read( "cfg/param.txt" );
for( int i= 0; i < (int)tfrSong.getFileLines().size(); ++i )
{
std::string strAct= tfrSong.getFileLines()[ i ];
std::string strCommandFull;
if( FrameWork::StringHelper::splitAt( strAct, "=", strCommandFull ) )
{
}
std::stringstream ss;
ss << strAct;
#ifdef SINGLEEDITMODE
if( strCommandFull == "PCUR" )
{
ss >> g_iCurrentPortrait;
}
else if( strCommandFull == "OCUR" )
{
ss >> g_iCurrentObject;
}
else if( strCommandFull == "OCOUNT" )
{
ss >> g_iCurrentObjectCount;
}
else if( strCommandFull == "CCUR" )
{
ss >> g_iCurrentCamera;
}
#endif
if( strCommandFull.size() < 4 )
{
continue;
}
int iFunc= strCommandFull[ strCommandFull.size() - 1 ] - '0';
iFunc+= 10 * ( strCommandFull[ strCommandFull.size() - 2 ] - '0' );
iFunc+= 100 * ( strCommandFull[ strCommandFull.size() - 3 ] - '0' );
std::string strCommand;
strCommand= strCommandFull.substr( 0, strCommandFull.size() - 3 );
if( strCommand == "BANK" )
{
for( int j= 0; j < 4; ++j )
{
float fVal= 0.0f;
ss >> fVal;
int iVal= (int)( fVal * 64.0f + 0.5f );
fVal= (float)( iVal ) / 64.0f;
SetParamValue( iFunc, j, fVal );
}
}
else if( strCommand == "SIZE" )
{
ss >> g_GreebleObj[ iFunc ].m_iSizeX;
ss >> g_GreebleObj[ iFunc ].m_iSizeY;
}
else if( strCommand == "BASE" )
{
ss >> g_GreebleObj[ iFunc ].m_iBaseMeshType;
ss >> g_GreebleObj[ iFunc ].m_iBaseBank;
}
else if( strCommand == "OFFSET" )
{
ss >> g_GreebleObj[ iFunc ].m_iOffsetFunc;
ss >> g_GreebleObj[ iFunc ].m_iOffsetBank;
}
else if( strCommand == "HEIGHT" )
{
ss >> g_GreebleObj[ iFunc ].m_iHeightFunc;
ss >> g_GreebleObj[ iFunc ]. m_iHeightBank;
}
else if( strCommand == "MIX" )
{
ss >> g_GreebleObj[ iFunc ].m_iMixFunc;
ss >> g_GreebleObj[ iFunc ].m_iMixBank;
}
else if( strCommand == "COLOR" )
{
float fR;
float fG;
float fB;
float fA;
ss >> fR;
ss >> fG;
ss >> fB;
ss >> fA;
fR= min( 255.0f, fR );
fG= min( 255.0f, fG );
fB= min( 255.0f, fB );
fA= min( 255.0f, fA );
DWORD dwColor= ( (int)fA << 24 ) |
( (int)fR << 16 ) |
( (int)fG << 8 ) |
( (int)fB );
g_GreebleObj[ iFunc ].m_dwColor= dwColor;
}
#ifdef SINGLEFUNCEDITOR
/*if( strCommand == "DRAW" )
{
ss >> g_iCamFunc;
ss >> g_iPaintFunc[ 0 ];
ss >> g_iPaintFunc[ 1 ];
}
if( strCommand == "CAMREPEAT" )
{
ss >> g_iCamRepeat;
}*/
#endif
}
}
void ReadShader( char* pcTarget, const char* pcVarName, const char* pcFileName )
{
FrameWork::TextFileReader tfrShaderTxt;
tfrShaderTxt.read( pcFileName );
//shorten the data?
int iPos= 0;
for( int i= 0; i < (int)tfrShaderTxt.getFileLines().size(); ++i )
{
std::string strAct= tfrShaderTxt.getFileLines()[ i ];
bool bNonWhiteFound= false;
for( size_t j= 0; j < strAct.size(); ++j )
{
char c= strAct[ j ];
if( c == ' ' && !bNonWhiteFound )
{
continue;
}
if( c == '\t' && !bNonWhiteFound )
{
continue;
}
bNonWhiteFound= true;
if( c == '/' && strAct[ j + 1 ] == '/' )
{
break;
}
pcTarget[ iPos ]= c;
iPos++;
}
// better readability?
pcTarget[ iPos ]= 13;
iPos++;
}
pcTarget[ iPos ]= 0;
std::stringstream ss;
ss << "const char " << pcVarName << "[]=\n";
ss << "\"";
int iCount= 0;
char cPrevious= 0;
while( pcTarget[ iCount ] != 0 )
{
char c= pcTarget[ iCount ];
if( c == 13 )
{
if( 13 != cPrevious && 10 != cPrevious )
{
ss << "\\n\"\n\"";
}
}
else
{
ss << c;
}
cPrevious= c;
iCount++;
}
ss << "\";\n\n";
g_strShaderData+= ss.str();
}
void ReadShaders()
{
g_strShaderData= "";
ReadShader( g_ShaderVSGeneral, "g_ShaderVSGeneral", "cfg/vsgeneral.txt" );
ReadShader( g_ShaderPSPhong, "g_ShaderPSPhong", "cfg/psphong.txt" );
ReadShader( g_ShaderPSCrystal, "g_ShaderPSCrystal", "cfg/pscrystal.txt" );
ReadShader( g_ShaderPSDepth, "g_ShaderPSDepth", "cfg/psdepth.txt" );
ReadShader( g_ShaderPSText, "g_ShaderPSText", "cfg/pstext.txt" );
ReadShader( g_ShaderPSEnvLit, "g_ShaderPSEnvLit", "cfg/psenvlit.txt" );
ReadShader( g_ShaderVSSky, "g_ShaderVSSky", "cfg/vssky.txt" );
ReadShader( g_ShaderPSSky, "g_ShaderPSSky", "cfg/pssky.txt" );
ReadShader( g_ShaderVSOcean, "g_ShaderVSOcean", "cfg/vsocean.txt" );
ReadShader( g_ShaderPSOcean, "g_ShaderPSOcean", "cfg/psocean.txt" );
ReadShader( g_ShaderVSFSQuad, "g_ShaderVSFSQuad", "cfg/vsfsquad.txt" );
ReadShader( g_ShaderPSTexGen, "g_ShaderPSTexGen", "cfg/pstexgen.txt" );
ReadShader( g_ShaderPSPSSM, "g_ShaderPSPSSM", "cfg/pspssm.txt" );
ReadShader( g_ShaderPSAmbOcc, "g_ShaderPSAmbOcc", "cfg/psao.txt" );
ReadShader( g_ShaderPSDOF, "g_ShaderPSDOF", "cfg/psdof.txt" );
ReadShader( g_ShaderPSRay, "g_ShaderPSRay", "cfg/psray.txt" );
ReadShader( g_ShaderPSBlur, "g_ShaderPSBlur", "cfg/psblur.txt" );
ReadShader( g_ShaderPSTerrain, "g_ShaderPSTerrain", "cfg/psterrain.txt" );
ReadShader( g_ShaderVSFluid, "g_ShaderVSFluid", "cfg/vsfluid.txt" );
ReadShader( g_ShaderPSFluid, "g_ShaderPSFluid", "cfg/psfluid.txt" );
}
void ReadTextInfos()
{
m_iTextCount= -1;
int iCharPos= 0;
STextInfo* pInfo= m_TextInfos;
FrameWork::TextFileReader tfr;
tfr.read( "cfg/text.txt" );
for( int i= 0; i < (int)tfr.getFileLines().size(); ++i )
{
std::string strAct= tfr.getFileLines()[ i ];
std::string strCommandFull;
if( FrameWork::StringHelper::splitAt( strAct, "=", strCommandFull ) )
{
}
std::stringstream ss;
ss << strAct;
if( strCommandFull == "Text" )
{
if( m_iTextCount < m_iMaxTextCount )
{
m_iTextCount++;
pInfo= m_TextInfos + m_iTextCount;
}
strcpy_s( m_pcTextData + iCharPos, sizeof( m_pcTextData ) - iCharPos, strAct.c_str() );
iCharPos+= strAct.size() + 1;
if( m_iTextCount == 0 )
{
pInfo->m_v3Pos.x= 0.0f;
pInfo->m_v3Pos.y= 0.0f;
pInfo->m_v3Pos.z= 0.0f;
pInfo->m_v3Rot.x= 0.0f;
pInfo->m_v3Rot.y= 0.0f;
pInfo->m_v3Rot.z= 0.0f;
pInfo->m_v3Scale.x= 1.0f;
pInfo->m_v3Scale.y= 1.0f;
pInfo->m_v3Scale.z= 1.0f;
}
else
{
*pInfo= m_TextInfos[ m_iTextCount - 1 ];
}
pInfo->m_v3Move.x= 0.0f;
pInfo->m_v3Move.y= 0.0f;
pInfo->m_v3Move.z= 0.0f;
pInfo->m_iTimeStart= 0;
pInfo->m_iTimeLength= 0;
}
else if( strCommandFull == "Pos" )
{
ss >> pInfo->m_v3Pos.x;
ss >> pInfo->m_v3Pos.y;
ss >> pInfo->m_v3Pos.z;
}
else if( strCommandFull == "Rot" )
{
ss >> pInfo->m_v3Rot.x;
ss >> pInfo->m_v3Rot.y;
ss >> pInfo->m_v3Rot.z;
pInfo->m_v3Rot.x*= c_PI / 180.0f;
pInfo->m_v3Rot.y*= c_PI / 180.0f;
pInfo->m_v3Rot.z*= c_PI / 180.0f;
}
else if( strCommandFull == "Scale" )
{
ss >> pInfo->m_v3Scale.x;
ss >> pInfo->m_v3Scale.y;
ss >> pInfo->m_v3Scale.z;
}
else if( strCommandFull == "Move" )
{
ss >> pInfo->m_v3Move.x;
ss >> pInfo->m_v3Move.y;
ss >> pInfo->m_v3Move.z;
}
else if( strCommandFull == "Time" )
{
ss >> pInfo->m_iTimeStart;
ss >> pInfo->m_iTimeLength;
}
}
m_iTextCount++;
}
void ReadEntityInfos()
{
m_iEntityCount= -1;
int iCharPos= 0;
SEntityInfo* pInfo= m_EntityInfos;
FrameWork::TextFileReader tfr;
tfr.read( "cfg/entity.txt" );
for( int i= 0; i < (int)tfr.getFileLines().size(); ++i )
{
std::string strAct= tfr.getFileLines()[ i ];
std::string strCommandFull;
if( FrameWork::StringHelper::splitAt( strAct, "=", strCommandFull ) )
{
}
std::stringstream ss;
ss << strAct;
if( strCommandFull == "Entity" )
{
if( m_iEntityCount < m_iMaxEntityCount )
{
m_iEntityCount++;
pInfo= m_EntityInfos + m_iEntityCount;
}
strcpy_s( m_pcEntityData + iCharPos, sizeof( m_pcEntityData ) - iCharPos, strAct.c_str() );
iCharPos+= strAct.size() + 1;
if( m_iEntityCount == 0 )
{
pInfo->m_v3Pos.x= 0.0f;
pInfo->m_v3Pos.y= 0.0f;
pInfo->m_v3Pos.z= 0.0f;
pInfo->m_v3Rot.x= 0.0f;
pInfo->m_v3Rot.y= 0.0f;
pInfo->m_v3Rot.z= 0.0f;
pInfo->m_v3Scale.x= 1.0f;
pInfo->m_v3Scale.y= 1.0f;
pInfo->m_v3Scale.z= 1.0f;
}
else
{
*pInfo= m_EntityInfos[ m_iEntityCount - 1 ];
}
pInfo->m_v3Move.x= 0.0f;
pInfo->m_v3Move.y= 0.0f;
pInfo->m_v3Move.z= 0.0f;
pInfo->m_iTimeStart= 0;
pInfo->m_iTimeLength= 0;
}
else if( strCommandFull == "Pos" )
{
ss >> pInfo->m_v3Pos.x;
ss >> pInfo->m_v3Pos.y;
ss >> pInfo->m_v3Pos.z;
}
else if( strCommandFull == "Rot" )
{
ss >> pInfo->m_v3Rot.x;
ss >> pInfo->m_v3Rot.y;
ss >> pInfo->m_v3Rot.z;
pInfo->m_v3Rot.x*= c_PI / 180.0f;
pInfo->m_v3Rot.y*= c_PI / 180.0f;
pInfo->m_v3Rot.z*= c_PI / 180.0f;
}
else if( strCommandFull == "Scale" )
{
ss >> pInfo->m_v3Scale.x;
ss >> pInfo->m_v3Scale.y;
ss >> pInfo->m_v3Scale.z;
}
else if( strCommandFull == "Move" )
{
ss >> pInfo->m_v3Move.x;
ss >> pInfo->m_v3Move.y;
ss >> pInfo->m_v3Move.z;
}
else if( strCommandFull == "Time" )
{
ss >> pInfo->m_iTimeStart;
ss >> pInfo->m_iTimeLength;
}
}
m_iEntityCount++;
}
void ReadCrystalInfos()
{
m_iCrystalCount= -1;
SCrystalInfo* pInfo= m_CrystalInfos;
FrameWork::TextFileReader tfr;
tfr.read( "cfg/cryspos.txt" );
for( int i= 0; i < (int)tfr.getFileLines().size(); ++i )
{
std::string strAct= tfr.getFileLines()[ i ];
std::string strCommandFull;
if( FrameWork::StringHelper::splitAt( strAct, "=", strCommandFull ) )
{
}
std::stringstream ss;
ss << strAct;
if( strCommandFull == "Crystal" )
{
if( m_iCrystalCount < m_iMaxCrystalCount )
{
m_iCrystalCount++;
pInfo= m_CrystalInfos + m_iCrystalCount;
}
if( m_iCrystalCount == 0 )
{
pInfo->m_v3Pos.x= 0.0f;
pInfo->m_v3Pos.y= 0.0f;
pInfo->m_v3Pos.z= 0.0f;
pInfo->m_v3Rot.x= 0.0f;
pInfo->m_v3Rot.y= 0.0f;
pInfo->m_v3Rot.z= 0.0f;
pInfo->m_fScale= 1.0f;
}
else
{
*pInfo= m_CrystalInfos[ m_iCrystalCount - 1 ];
}
}
else if( strCommandFull == "Pos" )
{
ss >> pInfo->m_v3Pos.x;
ss >> pInfo->m_v3Pos.y;
ss >> pInfo->m_v3Pos.z;
}
else if( strCommandFull == "Rot" )
{
ss >> pInfo->m_v3Rot.x;
ss >> pInfo->m_v3Rot.y;
ss >> pInfo->m_v3Rot.z;
pInfo->m_v3Rot.x*= c_PI / 180.0f;
pInfo->m_v3Rot.y*= c_PI / 180.0f;
pInfo->m_v3Rot.z*= c_PI / 180.0f;
}
else if( strCommandFull == "Scale" )
{
ss >> pInfo->m_fScale;
}
}
m_iCrystalCount++;
}
void ReadDataFromDisc()
{
ReadParamTxt();
ReadScriptTxt();
ReadShaders();
ReadTextInfos();
ReadEntityInfos();
ReadCrystalInfos();
ReadSceneTxt();
/*static bool bWritten= false;
if( bWritten )
{
return;
}*/
#ifdef CREATE_HEADER
WriteHeader();
#endif
}
void WriteHeaderFunc()
{
std::ofstream ofs( "greeblearrays.h" );
ofs << "const float g_GreebleParam[ 4 * 48 ]=" << "\n";
ofs << "{" << "\n";
for( int i= 0; i < 4 * 48; ++i )
{
char pcSpecial[ 1024 ];
sprintf_s(
pcSpecial,
1024,
"%1.9ff,\n",
g_GreebleParam[ i ] );
ofs << pcSpecial;
}
ofs << "};" << "\n";
ofs << "\n";
{
int iBytes= sizeof( g_GreebleObj );
ofs << "const unsigned char byteObjectData[ " << iBytes <<" ]=" << "\n";
ofs << "{" << "\n";
int iLine= 0;
for( int i= 0; i < iBytes; ++i )
{
ofs << (int)(((unsigned char*)g_GreebleObj)[ i ]) << ",";
iLine++;
if( iLine == 8 )
{
ofs << "\n";
iLine= 0;
}
}
ofs << "\n" << "};" << "\n";
ofs << "Greeble::SObjectDescription* g_GreebleObj= (Greeble::SObjectDescription*)byteObjectData;\n\n";
}
}
void WriteHeaderScript()
{
/*
std::ofstream ofs( "scriptdata.h" );
ofs << "const int g_iScriptLength= " << g_iCurSpriptLength << ";\n";
ofs << "const unsigned char g_Script[ g_iScriptLength ]=" << "\n";
ofs << "{" << "\n";
for( int i= 0; i < g_iCurSpriptLength; ++i )
{
ofs << (int)g_Script[ i ] << ",\n";
}
ofs << "};" << "\n";
ofs << "const float g_ScriptParamFloat[ " << g_iCurSpriptParams << " ]=" << "\n";
ofs << "{" << "\n";
for( int i= 0; i < g_iCurSpriptParams; ++i )
{
char pcSpecial[ 1024 ];
sprintf_s(
pcSpecial,
1024,
"%1.9ff,\n",
g_ScriptParamFloat[ i ] );
ofs << pcSpecial;
}
ofs << "};" << "\n";
ofs << "\n";
ofs << "\n";
*/
}
void WriteSceneHeader()
{
std::ofstream ofs( "scenedata.h" );
int iLast= g_SceneMaskCount - 1;
while( g_SceneMask[ iLast ] == 0 )
{
iLast--;
}
ofs << "DWORD g_SceneMask[]=" << "\n";
ofs << "{" << "\n";
for( int i= 0; i <= iLast; ++i )
{
ofs << g_SceneMask[ i ] << ",\n";
}
ofs << "};" << "\n";
ofs << "\n";
}
void WriterShaderInclude()
{
std::ofstream ofs( "shaderdata.h" );
ofs << g_strShaderData;
}
void WriterTextInclude()
{
std::ofstream ofs( "textdata.h" );
ofs << "int m_iTextCount= " << m_iTextCount <<";\n";
ofs << "\n";
ofs << "const char m_pcTextData[]=\n";
ofs << "{\n";
int iZeroCount= 0;
for( int i= 0; i < 65536; ++i )
{
char pcSpecial[ 1024 ];
sprintf_s(
pcSpecial,
1024,
"\t%d,\n",
(int)m_pcTextData[ i ] );
ofs << pcSpecial;
if( m_pcTextData[ i ] == 0 )
{
iZeroCount++;
if( iZeroCount == m_iTextCount )
{
break;
}
}
}
ofs << "};\n";
ofs << "\n";
ofs << "const DWORD c_BinaryText[]= " << "\n";
ofs << "{\n";
for( int i= 0; i < (int)m_iTextCount; ++i )
{
int dwords= m_iTextCount * sizeof( STextInfo ) / 4;
if( dwords > 0 )
{
DWORD* pdwData= (DWORD*)&(m_TextInfos);
for( int j= 0; j < dwords; ++j )
{
char pcSpecial[ 1024 ];
sprintf_s( pcSpecial,
1024,
"\t%d,\n",
pdwData[ j ] );
ofs << pcSpecial;
}
}
}
if( m_iTextCount == 0 )
{
ofs << "0";
}
ofs << "};\n";
ofs << "\n";
ofs << "STextInfo* m_TextInfos= (STextInfo*)c_BinaryText;\n";
ofs << "\n";
}
void WriterEntityInclude()
{
std::ofstream ofs( "entitydata.h" );
ofs << "int m_iEntityCount= " << m_iEntityCount <<";\n";
ofs << "\n";
ofs << "const char m_pcEntityData[]=\n";
ofs << "{\n";
int iZeroCount= 0;
for( int i= 0; i < 65536; ++i )
{
char pcSpecial[ 1024 ];
sprintf_s(
pcSpecial,
1024,
"\t%d,\n",
(int)m_pcEntityData[ i ] );
ofs << pcSpecial;
if( m_pcEntityData[ i ] == 0 )
{
iZeroCount++;
if( iZeroCount == m_iEntityCount )
{
break;
}
}
}
ofs << "};\n";
ofs << "\n";
ofs << "const DWORD c_BinaryEntity[]= " << "\n";
ofs << "{\n";
for( int i= 0; i < (int)m_iEntityCount; ++i )
{
int dwords= m_iEntityCount * sizeof( SEntityInfo ) / 4;
if( dwords > 0 )
{
DWORD* pdwData= (DWORD*)&(m_EntityInfos);
for( int j= 0; j < dwords; ++j )
{
char pcSpecial[ 1024 ];
sprintf_s( pcSpecial,
1024,
"\t%d,\n",
pdwData[ j ] );
ofs << pcSpecial;
}
}
}
if( m_iEntityCount == 0 )
{
ofs << "0";
}
ofs << "};\n";
ofs << "\n";
ofs << "SEntityInfo* m_EntityInfos= (SEntityInfo*)c_BinaryEntity;\n";
ofs << "\n";
}
void WriterCrystalInclude()
{
std::ofstream ofs( "crystaldata.h" );
ofs << "int m_iCrystalCount= " << m_iCrystalCount <<";\n";
ofs << "\n";
ofs << "const DWORD c_BinaryCrystal[]= " << "\n";
ofs << "{\n";
for( int i= 0; i < (int)m_iCrystalCount; ++i )
{
int dwords= m_iCrystalCount * sizeof( SCrystalInfo ) / 4;
if( dwords > 0 )
{
DWORD* pdwData= (DWORD*)&(m_CrystalInfos);
for( int j= 0; j < dwords; ++j )
{
char pcSpecial[ 1024 ];
sprintf_s( pcSpecial,
1024,
"\t%d,\n",
pdwData[ j ] );
ofs << pcSpecial;
}
}
}
if( m_iCrystalCount == 0 )
{
ofs << "0";
}
ofs << "};\n";
ofs << "\n";
ofs << "SCrystalInfo* m_CrystalInfos= (SCrystalInfo*)c_BinaryCrystal;\n";
ofs << "\n";
}
void WriteHeader()
{
WriteHeaderFunc();
//#ifdef SCRIPTEDITOR
WriteHeaderScript();
//#endif
WriterShaderInclude();
WriterTextInclude();
WriterEntityInclude();
WriterCrystalInclude();
WriteSceneHeader();
}

View File

@@ -0,0 +1,44 @@
#pragma once
#include "defines.h"
#include <windows.h>
#include <iostream>
#include <sstream>
#include <fstream>
#include <cstdio>
#include "StringHelper.h"
#include "TextFileReader.h"
extern HANDLE g_FileChangeNotification;
void StopFileWatch();
void StartFileWatch();
void ReadDataFromDisc();
bool CheckFileWatch();
void WriteHeader();
extern int g_iCurSpriptLength;
extern int g_iCurSpriptParams;
void ReadTextInfos();
void ReadEntityInfos();
void ReadCrystalInfos();
void ReadScriptTxt();
void ReadSceneTxt();
void ReadShader( char* pcTarget, const char* pcFileName );
void ReadShaders();
void WriteHeaderFunc();
void ReadParamTxt();

View File

@@ -0,0 +1,233 @@
/***********************************************************************************/
/** \file EditorHelp.cpp
** \brief Implementation zur Klasse EditorHelp
*************************************************************************************
** Autor: Christian Roesch
*************************************************************************************
** -tut nichts-
**
*//*********************************************************************************/
// includes
#include "EditorHelp.h"
#include <cmath>
#include <ctime>
#include <cassert>
#include <sstream>
bool EditorHelp::m_KeyPressed[ 256 ]= { false };
bool EditorHelp::m_KeyDown[ 256 ]= { false };
HWND EditorHelp::m_hwnd= NULL;
bool EditorHelp::m_bShowDebugData= true;
LPD3DXFONT EditorHelp::m_pDebugFont= NULL;
extern int c_iScreenSizeY;
extern int c_iScreenSizeX;
extern IDirect3DDevice9 *g_d3d_device;
// Methoden-Definitionen
EditorHelp::EditorHelp()
{
}
EditorHelp::~EditorHelp()
{
}
void EditorHelp::SetHWND( HWND hwnd )
{
m_hwnd= hwnd;
}
void EditorHelp::CheckKeys()
{
if( m_hwnd == NULL )
{
m_hwnd= GetForegroundWindow();
}
if( m_hwnd == GetForegroundWindow() )
{
for( int i= 0; i < 256; i++ )
{
SHORT iKey= GetAsyncKeyState( i );
m_KeyPressed[ i ]= false;
if( iKey & 0x8000 )
{
if( m_KeyDown[ i ] == false )
{
m_KeyPressed[ i ]= true;
}
m_KeyDown[ i ]= true;
}
else
{
m_KeyDown[ i ]= false;
}
}
}
else
{
for( int i= 0; i < 256; i++ )
{
m_KeyPressed[ i ]= false;
m_KeyDown[ i ]= false;
}
}
}
float EditorHelp::GetKeyDownVal( float fCurrent,
int KeyAdd,
int KeySub,
float fDefault,
float fSlow,
float fFast )
{
return GetKeyVal( fCurrent,
m_KeyDown[ KeyAdd ],
m_KeyDown[ KeySub ],
fDefault,
fSlow,
fFast );
}
float EditorHelp::GetKeyPressedVal( float fCurrent,
int KeyAdd,
int KeySub,
float fDefault,
float fSlow,
float fFast )
{
return GetKeyVal( fCurrent,
m_KeyPressed[ KeyAdd ],
m_KeyPressed[ KeySub ],
fDefault,
fSlow,
fFast );
}
float EditorHelp::GetKeyVal( float fCurrent,
bool bAdd,
bool bSub,
float fDefault,
float fSlow,
float fFast )
{
//Konventionen fuer Tastenbelegung eingehalten?
assert( fSlow <= fDefault );
assert( fDefault <= fFast );
float fChange= fDefault;
if( m_KeyDown[ VK_SHIFT ] )
{
fChange= fFast;
}
if( m_KeyDown[ VK_CONTROL ] )
{
fChange= fSlow;
}
int iVal= (int)Round( fCurrent / fChange );
if( bAdd )
{
return (float)(iVal + 1 ) * fChange;
}
if( bSub )
{
return (float)(iVal - 1 ) * fChange;
}
return fCurrent;
}
float EditorHelp::Round(float Val )
{
return floor(Val + 0.5f);
}
void EditorHelp::PrintDebug( int iLine, int iColumn, char* pcData )
{
PrintDebugPos( 2.0f + (float)iLine * 12.0f,
2.0f + (float)iColumn * 9.0f,
pcData );
}
void EditorHelp::PrintDebugPos( float fY, float fX, char* pcData )
{
if( m_bShowDebugData )
{
RECT r= {
0 + (int)fX,
0 + (int)fY,
c_iScreenSizeX + (int)fX,
c_iScreenSizeY + (int)fX };
m_pDebugFont->DrawText(
NULL,
pcData,
strlen(pcData),
&r,
DT_TOP | DT_LEFT,
0xff000000 );
r.top-=1;
r.left-=1;
m_pDebugFont->DrawText(
NULL,
pcData,
strlen(pcData),
&r,
DT_TOP | DT_LEFT,
0xffffffff );
}
}
std::string EditorHelp::GetDateString()
{
time_t t;
struct tm ts;
t = time(NULL);
localtime_s( &ts, &t );
std::stringstream ss;
ss << ts.tm_mon + 1 << "_";
ss << ts.tm_mday << "_";
ss << ts.tm_hour << "_";
ss << ts.tm_min << "_";
ss << ts.tm_sec;
return ss.str();
}
void EditorHelp::PreparePrint()
{
if( m_pDebugFont != NULL )
{
return;
}
static D3DXFONT_DESC FontDescription=
{
50,
20,
0,
8,
FALSE,
0,
0,
5, // CLEARTYPE_QUALITY
0,
"Courier"
};
FontDescription.Height= 12;
FontDescription.Width= 9;
D3DXCreateFontIndirect( g_d3d_device,
&FontDescription,
&m_pDebugFont );
}
/************************************************************************************
** Ende der Datei: EditorHelp.cpp
************************************************************************************/

View File

@@ -0,0 +1,88 @@
/***********************************************************************************/
/** \file EditorHelp.h
** \brief Header File zur Klasse EditorHelp
*************************************************************************************
** Autor: Christian Roesch
*************************************************************************************
** _tut nichts_
**
*//*********************************************************************************/
#ifndef _EditorHelp_H
#define _EditorHelp_H
// includes
#include <windows.h>
#include <string>
#include <d3dx9core.h>
// Klassen-Deklaration
/***********************************************************************************/
/** \brief EditorHelp _tut nichts_
*************************************************************************************
** Genau genommen _tut dies nichts_
**
*//*********************************************************************************/
class EditorHelp
{
public:
EditorHelp();
~EditorHelp();
static float Round(float Val );
static void CheckKeys();
static float GetKeyDownVal( float fCurrent,
int KeyAdd,
int KeySub,
float fDefault,
float fSlow,
float fFast );
static float GetKeyPressedVal( float fCurrent,
int KeyAdd,
int KeySub,
float fDefault,
float fSlow,
float fFast );
static bool m_KeyPressed[ 256 ];
static bool m_KeyDown[ 256 ];
static void PrintDebug( int iLine, int iColumn, char* pcData );
static void PrintDebugPos( float fY, float fX, char* pcData );
static std::string GetDateString();
static void SetHWND( HWND hwnd );
static bool m_bShowDebugData;
static void PreparePrint();
protected:
private:
static HWND m_hwnd;
static LPD3DXFONT m_pDebugFont;
static float GetKeyVal( float fCurrent,
bool bAdd,
bool bSub,
float fDefault,
float fSlow,
float fFast );
};
#endif//_EditorHelp_H
class EditorHelp;
/************************************************************************************
** Ende der Datei: EditorHelp.h
************************************************************************************/

View File

@@ -0,0 +1,78 @@
#include "defines.h"
#include "Environment.h"
#include "shader.h"
#include "globals.h"
#include "intrin.h"
void Environment::Init()
{
}
void Environment::Update(const D3DXMATRIX &mView /*, const D3DXMATRIX &mProj*/ )
{
D3DXVECTOR3 vViewPos;
// Extract view position
vViewPos.x = -(mView._41 * mView._11 + mView._42 * mView._12 + mView._43 * mView._13);
vViewPos.y = -(mView._41 * mView._21 + mView._42 * mView._22 + mView._43 * mView._23);
vViewPos.z = -(mView._41 * mView._31 + mView._42 * mView._32 + mView._43 * mView._33);
// Extract orientation
D3DXVECTOR3 vRight(1.0f, 0.0f, 0.0f); // (mView._11, mView._21, mView._31);
D3DXVECTOR3 vUp(0.0f, 1.0f, 0.0f); // (mView._12, mView._22, mView._32);
D3DXVECTOR3 vLook(0.0f, 0.0f, 1.0f); // (mView._13, mView._23, mView._33);
// Cube face orientations
const D3DXVECTOR3 aFaceOrientations[MaxFaceCount][3] = {
{ -vLook, vUp, vRight }, { vLook, vUp, -vRight },
{ vRight, -vLook, vUp }, { vRight, vLook, -vUp },
{ vRight, vUp, vLook }, { -vRight, vUp, -vLook }
};
// Copy projection
for(int i = 0; i < MaxFaceCount; i++)
{
// Get orientation
const D3DXVECTOR3 *pFaceOrientation = aFaceOrientations[i];
const D3DXVECTOR3 &vFaceRight = pFaceOrientation[0];
const D3DXVECTOR3 &vFaceUp = pFaceOrientation[1];
const D3DXVECTOR3 &vFaceLook = pFaceOrientation[2];
D3DXMATRIX &mEnvLocal = m_LocalMatrix[i];
// Compose local matrix
D3DXMatrixIdentity(&mEnvLocal);
memcpy(mEnvLocal.m[0], &vFaceRight, sizeof(float) * 3);
memcpy(mEnvLocal.m[1], &vFaceUp, sizeof(float) * 3);
memcpy(mEnvLocal.m[2], &vFaceLook, sizeof(float) * 3);
D3DXMATRIX &mEnvView = m_ViewMatrix[i];
// Compose view matrix
D3DXMatrixIdentity(&mEnvView);
mEnvView._11 = vFaceRight.x; mEnvView._21 = vFaceRight.y; mEnvView._31 = vFaceRight.z;
mEnvView._12 = vFaceUp.x; mEnvView._22 = vFaceUp.y; mEnvView._32 = vFaceUp.z;
mEnvView._13 = vFaceLook.x; mEnvView._23 = vFaceLook.y; mEnvView._33 = vFaceLook.z;
mEnvView._41 = -D3DXVec3Dot(&vViewPos, &vFaceRight);
mEnvView._42 = -D3DXVec3Dot(&vViewPos, &vFaceUp);
mEnvView._43 = -D3DXVec3Dot(&vViewPos, &vFaceLook);
D3DXMATRIX &mEnvProj = m_ProjMatrix[i];
// 90°
D3DXMatrixPerspectiveFovLH(&mEnvProj,
c_PI / 2.0f, 1.0f,
0.1f, 10000.0f);
// mEnvProj._33 = mProj._33;
// mEnvProj._34 = mProj._34;
// mEnvProj._43 = mProj._43;
// mEnvProj._44 = mProj._44;
// Copy remaining data
memcpy(&m_ViewPos[i], &vViewPos, sizeof(D3DXVECTOR3));
memcpy(&m_ViewDir[i], &vFaceLook, sizeof(D3DXVECTOR3));
}
}

View File

@@ -0,0 +1,54 @@
#pragma once
/***********************************************************************************/
/** \file Environment.h
** \brief Header File zur Klasse Environment
*************************************************************************************
** Autor: Christian Roesch
*************************************************************************************
** _tut nichts_
**
*//*********************************************************************************/
#ifndef _ENVIRONMENT_H
#define _ENVIRONMENT_H
// includes
#include <d3dx9.h>
#include <cassert>
// Klassen-Deklaration
extern IDirect3DDevice9* g_d3d_device;
/***********************************************************************************/
/** \brief Environment _tut nichts_
*************************************************************************************
** Genau genommen _tut dies nichts_
**
*//*********************************************************************************/
class Environment
{
public:
static const int MaxFaceCount = 6;
void Init();
void Update(const D3DXMATRIX &mView /*, const D3DXMATRIX &mProj*/ );
D3DXMATRIX m_ViewMatrix[MaxFaceCount];
D3DXMATRIX m_ProjMatrix[MaxFaceCount];
D3DXVECTOR3 m_ViewPos[MaxFaceCount];
D3DXVECTOR3 m_ViewDir[MaxFaceCount];
D3DXMATRIX m_LocalMatrix[MaxFaceCount];
};
#endif//_Environment_H
class Environment;
/************************************************************************************
** Ende der Datei: Environment.h
************************************************************************************/

View File

@@ -0,0 +1,314 @@
#include "FluidContext.h"
#include "globals.h"
#include "intrin.h"
void FluidContext::BuildUp(int screenX, int screenY, D3DMULTISAMPLE_TYPE multiSampleType)
{
currentFluid = NULL;
D3DVERTEXELEMENT9 decl[] =
{
{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{1, 0, D3DDECLTYPE_FLOAT4, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
{1, 16, D3DDECLTYPE_FLOAT1, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 1},
D3DDECL_END()
};
g_d3d_device->CreateVertexDeclaration(decl, &vertexDecl);
D3DVERTEXELEMENT9 quadDecl[] =
{
{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{0, 12, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
D3DDECL_END()
};
g_d3d_device->CreateVertexDeclaration(quadDecl, &quadVertexDecl);
float* quadData;
g_d3d_device->CreateVertexBuffer(sizeof(float) * 20, D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &quadVertexBuffer, NULL);
quadVertexBuffer->Lock(0, sizeof(float) * 20, (void**)&quadData, 0);
::memcpy(quadData, particleQuadVerts, sizeof(float) * 20);
quadVertexBuffer->Unlock();
int* quadIndexData;
g_d3d_device->CreateIndexBuffer(6 * sizeof(int), D3DUSAGE_WRITEONLY, D3DFMT_INDEX32, D3DPOOL_MANAGED, &quadIndexBuffer, NULL);
quadIndexBuffer->Lock(0, 0, (void**)&quadIndexData, 0);
quadIndexData[0] = 0;
quadIndexData[1] = 1;
quadIndexData[2] = 2;
quadIndexData[3] = 2;
quadIndexData[4] = 0;
quadIndexData[5] = 3;
quadIndexBuffer->Unlock();
// build up the render targets
renderTargetWidth = screenX;
renderTargetHeight = screenY;
renderTargetDDX = D3DXVECTOR4(1.0f / renderTargetWidth, 1.0f / renderTargetHeight, 0.00f, 0.0f );
g_d3d_device->CreateRenderTarget( screenX,
screenY,
D3DFMT_A16B16G16R16F,
multiSampleType,
0,
FALSE,
&renderSurface,
NULL);
}
void FluidContext::RenderParticles(const FluidParticleSystem& particleInfo)
{
g_d3d_device->SetStreamSource(0, quadVertexBuffer, 0, sizeof(float) * 5);
g_d3d_device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA | particleInfo.InstanceCount);
g_d3d_device->SetStreamSource(1, particleInfo.InstanceDataBuffer, 0, sizeof(InstanceData));
g_d3d_device->SetStreamSourceFreq(1, D3DSTREAMSOURCE_INSTANCEDATA | 1ul);
g_d3d_device->SetVertexDeclaration(vertexDecl);
g_d3d_device->SetIndices(quadIndexBuffer);
g_d3d_device->SetTexture(0, NULL); // pos
g_d3d_device->SetTexture(1, NULL); // normal
// Begin
{
g_Shaders[ FluidPosition ].Activate();
g_d3d_device->SetRenderState( D3DRS_ZWRITEENABLE, TRUE );
g_d3d_device->SetRenderTarget(0, renderSurface); // pos
g_d3d_device->Clear(0, NULL, D3DCLEAR_TARGET, 0x0, 1.0f, 0);
g_d3d_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);
g_d3d_device->StretchRect( renderSurface, NULL,
currentFluid->renderSurfacePingPong[0], NULL, D3DTEXF_LINEAR );
}
{
g_Shaders[ FluidNormal ].Activate();
g_d3d_device->SetRenderState( D3DRS_ZWRITEENABLE, FALSE );
g_d3d_device->SetRenderTarget(0, renderSurface); // normal
g_d3d_device->Clear(0, NULL, D3DCLEAR_TARGET, 0x0, 1.0f, 0);
g_d3d_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);
g_d3d_device->StretchRect( renderSurface, NULL,
currentFluid->renderSurfacePingPong[2], NULL, D3DTEXF_LINEAR );
}
g_d3d_device->SetStreamSourceFreq(0, 1);
g_d3d_device->SetStreamSourceFreq(1, 1);
g_d3d_device->SetStreamSource(1, NULL, 0, 0);
}
void FluidContext::RenderParticleDepth(const FluidParticleSystem& particleInfo)
{
g_d3d_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
D3DXMATRIX mat;
D3DXMatrixMultiply( &mat, &g_matView, &g_matProjection );
D3DXMatrixTranspose( &mat, &mat );
g_d3d_device->SetVertexShaderConstantF( 31, (float*)&mat, 4 );
g_d3d_device->SetPixelShaderConstantF( 31, (float*)&mat, 4 );
g_d3d_device->SetVertexShaderConstantF( 35, (float*)&g_matView, 4 );
g_d3d_device->SetPixelShaderConstantF( 35, (float*)&g_matView, 4 );
g_d3d_device->SetStreamSource(0, quadVertexBuffer, 0, sizeof(float) * 5);
g_d3d_device->SetStreamSourceFreq(0, D3DSTREAMSOURCE_INDEXEDDATA | particleInfo.InstanceCount);
g_d3d_device->SetStreamSource(1, particleInfo.InstanceDataBuffer, 0, sizeof(InstanceData));
g_d3d_device->SetStreamSourceFreq(1, D3DSTREAMSOURCE_INSTANCEDATA | 1ul);
g_d3d_device->SetVertexDeclaration(vertexDecl);
g_d3d_device->SetIndices(quadIndexBuffer);
g_Shaders[ FluidDepth ].Activate();
g_d3d_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);
g_d3d_device->SetStreamSourceFreq(0, 1);
g_d3d_device->SetStreamSourceFreq(1, 1);
g_d3d_device->SetStreamSource(1, NULL, 0, 0);
}
void FluidContext::Begin(const Fluid& fluid)
{
g_d3d_device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
currentFluid = &fluid;
g_d3d_device->SetPixelShaderConstantF(20, fluid.Settings.Softness, 1);
g_d3d_device->SetPixelShaderConstantF(21, fluid.Settings.LightTransferAmmount, 1);
g_d3d_device->SetPixelShaderConstantF(22, fluid.Settings.SpecularFactor, 1);
g_d3d_device->SetPixelShaderConstantF(23, fluid.Settings.SpecularPower, 1);
g_d3d_device->SetPixelShaderConstantF(24, fluid.Settings.TranslucencyAmmount, 1);
g_d3d_device->SetPixelShaderConstantF(25, fluid.Settings.TextureScale, 1);
g_d3d_device->SetPixelShaderConstantF(26, fluid.Settings.SurfaceTension, 1);
g_d3d_device->SetPixelShaderConstantF(27, fluid.Settings.RefractAmmount, 1);
g_d3d_device->SetPixelShaderConstantF(28, fluid.Settings.DepthDifferenceBlur, 1);
D3DXMATRIX mat;
D3DXMatrixMultiply( &mat, &g_matView, &g_matProjection );
D3DXMatrixTranspose( &mat, &mat );
g_d3d_device->SetVertexShaderConstantF( 31, (float*)&mat, 4 );
g_d3d_device->SetPixelShaderConstantF( 31, (float*)&mat, 4 );
g_d3d_device->SetVertexShaderConstantF( 35, (float*)&g_matView, 4 );
g_d3d_device->SetPixelShaderConstantF( 35, (float*)&g_matView, 4 );
}
void FluidContext::End()
{
g_d3d_device->SetStreamSourceFreq(0, 1);
g_d3d_device->SetStreamSourceFreq(1, 1);
g_d3d_device->SetStreamSource(1, NULL, 0, 0);
g_d3d_device->SetVertexDeclaration(quadVertexDecl);
//quadddx
g_d3d_device->SetVertexShaderConstantF(30, (float*)&currentFluid->renderTargetPingPongDDX, 1);
g_d3d_device->SetDepthStencilSurface(NULL);
// blur
{
g_Shaders[ FluidBlur ].Activate();
for (int i = 0; i < 3; ++i)
{
g_d3d_device->SetSamplerState( i, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( i, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( i, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( i, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
g_d3d_device->SetSamplerState( i, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
}
for (int k = 0; k < *currentFluid->Settings.BlurSteps * 2; ++k)
{
g_d3d_device->SetRenderTarget(0, currentFluid->renderSurfacePingPong[0 + ((k+1)%2)]);
g_d3d_device->SetRenderTarget(1, currentFluid->renderSurfacePingPong[2 + ((k+1)%2)]);
// ddx
g_d3d_device->SetPixelShaderConstantF(29, (float*)&(k == 0 ? renderTargetDDX : currentFluid->renderTargetPingPongDDX), 1);
for (int i = 0; i < renderTextureCount; ++i)
g_d3d_device->SetTexture( i, currentFluid->renderTexturePingPong[i*2 + k%2]);
HRESULT hr = g_d3d_device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, screenQuadVerts, 20);
}
}
currentFluid = NULL;
}
void FluidContext::Display(const Fluid& fluid)
{
g_Shaders[ FluidCompose ].Activate();
g_d3d_device->SetRenderState( D3DRS_ZENABLE, FALSE );
g_d3d_device->SetSamplerState( 3, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
g_d3d_device->SetSamplerState( 3, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
g_d3d_device->SetTexture(0, fluid.renderTexturePingPong[1]); // pos
g_d3d_device->SetTexture(1, fluid.renderTexturePingPong[3]); // normal
g_d3d_device->SetTexture(2, fluid.Settings.DiffuseTexture); // diffuse, herp
g_d3d_device->SetTexture(3, g_pFullScreenRT[ RT_COLOR ] /*backgroundTexture*/); // background, derp
g_d3d_device->SetRenderTarget(1, NULL);
g_d3d_device->SetRenderTarget(2, NULL);
g_d3d_device->DrawPrimitiveUP(D3DPT_TRIANGLELIST, 2, screenQuadVerts, 20);
}
FluidParticleSystem FluidContext::GenerateFluidParticleSystem(unsigned int instanceCount, InstanceData* initialData)
{
FluidParticleSystem result;
result.InstanceDataBuffer = NULL;
result.InstanceCount = instanceCount;
result.IsVisible = false;
if(instanceCount > 0)
{
InstanceData* instanceData;
g_d3d_device->CreateVertexBuffer(sizeof(InstanceData) * instanceCount, D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &result.InstanceDataBuffer, NULL);
if (initialData != NULL)
{
result.InstanceDataBuffer->Lock(0, sizeof(InstanceData) * instanceCount, (void**)&instanceData, 0);
::memcpy(instanceData, initialData, sizeof(InstanceData) * instanceCount);
result.InstanceDataBuffer->Unlock();
}
}
return result;
}
Fluid FluidContext::GenerateFluid(const FluidSettings& settings)
{
Fluid result;
result.Settings = settings;
result.renderTargetPingPongDDX = D3DXVECTOR4( 1.0f / (renderTargetWidth * *settings.RenderTextureSizeScale), 1.0f / (renderTargetHeight * *settings.RenderTextureSizeScale), 0.0f, 0.0f );
for (int i = 0; i < renderTextureCount; ++i)
{
for (int k = 0; k < 2; ++k)
{
g_d3d_device->CreateTexture((UINT)(renderTargetWidth * *settings.RenderTextureSizeScale),
(UINT)(renderTargetHeight * *settings.RenderTextureSizeScale),
1,
D3DUSAGE_RENDERTARGET,
D3DFMT_A16B16G16R16F,
D3DPOOL_DEFAULT,
&result.renderTexturePingPong[i * 2 + k],
NULL);
result.renderTexturePingPong[i * 2 + k]->GetSurfaceLevel(0, &result.renderSurfacePingPong[i * 2 + k]);
}
}
return result;
}
void FluidContext::MeltObject(int objectIndex, int fluidIndex, int pointMapIndex, float time)
{
if (g_FluidParticleSystem[fluidIndex].InstanceCount == 0 || !g_FluidParticleSystem[fluidIndex].IsVisible)
return;
float thickness = 4.0f;
// initial fill the particle system
InstanceData* instanceData;
g_FluidParticleSystem[fluidIndex].InstanceDataBuffer->Lock(0, sizeof(InstanceData) * g_FluidParticleSystem[fluidIndex].InstanceCount, (void**)&instanceData, 0);//D3DLOCK_DISCARD);
g_Random.setSeed(0);
D3DXMATRIX mat = g_Objects[ objectIndex ].GetTransformation();
for (unsigned int k = 0; k < g_FluidParticleSystem[fluidIndex].InstanceCount / 4; ++k)
for (unsigned int m = 0; m < 4; ++m)
{
unsigned int i = k*4+m;
D3DXVECTOR3 pmPos = D3DXVECTOR3(g_FluidPointMap[pointMapIndex][k].x, g_FluidPointMap[pointMapIndex][k].y, g_FluidPointMap[pointMapIndex][k].z);
D3DXVec3TransformCoord(&pmPos, &pmPos, &mat);
float drop = time - g_StartMeltTime;
drop -= (1.0f - g_FluidPointMap[pointMapIndex][k].w) * (g_EndMeltTime - g_StartMeltTime);
drop *= max(0.5f, 1.0f - (1.0f - g_FluidPointMap[pointMapIndex][k].w));
drop = max(0.0f, drop);
drop = mypow(drop, 2.0f);
if (drop > 1.0f)
drop += mypow(drop - 1.0f, 4.0f);
instanceData[i].pos[0] = (pmPos.x + g_PointMapDistance[pointMapIndex] * thickness * g_Random.genFloat(-0.25f, 0.25f) );
instanceData[i].pos[1] = (pmPos.y + g_PointMapDistance[pointMapIndex] * thickness * g_Random.genFloat(-0.25f, 0.25f) ) - drop;
instanceData[i].pos[2] = (pmPos.z + g_PointMapDistance[pointMapIndex] * thickness * g_Random.genFloat(-0.25f, 0.25f) );
instanceData[i].size = g_FluidParticleSize[fluidIndex];
instanceData[i].intensity = min(5.0f, drop) / 5.0f;
}
g_FluidParticleSystem[fluidIndex].InstanceDataBuffer->Unlock();
}

View File

@@ -0,0 +1,117 @@
#pragma once
#include <d3dx9.h>
extern IDirect3DDevice9* g_d3d_device;
struct InstanceData
{
float pos[3];
float size;
float intensity;
};
struct FluidSettings
{
float* Softness;
float* LightTransferAmmount;
float* SpecularFactor;
float* SpecularPower;
float* TextureScale;
float* TranslucencyAmmount;
float* SurfaceTension;
float* RefractAmmount;
float* DepthDifferenceBlur;
int* BlurSteps;
float* RenderTextureSizeScale;
IDirect3DBaseTexture9* DiffuseTexture;
};
struct Fluid
{
FluidSettings Settings;
IDirect3DTexture9* renderTexturePingPong[4];
IDirect3DSurface9* renderSurfacePingPong[4];
D3DXVECTOR4 renderTargetPingPongDDX;
};
struct FluidParticleSystem
{
bool IsVisible;
unsigned int InstanceCount;
IDirect3DVertexBuffer9* InstanceDataBuffer;
};
class FluidContext
{
public:
void BuildUp(int screenX, int screenY, D3DMULTISAMPLE_TYPE multiSampleType);
void RenderParticles(const FluidParticleSystem& particleInfo);
void RenderParticleDepth(const FluidParticleSystem& particleInfo);
void Begin(const Fluid& fluid);
void End();
void Display(const Fluid& fluid);
FluidParticleSystem GenerateFluidParticleSystem(unsigned int instanceCount, InstanceData* initialData = NULL);
Fluid GenerateFluid(const FluidSettings& settings);
static void MeltObject(int objectIndex, int fluidIndex, int pointMapIndex, float time);
private:
IDirect3DVertexDeclaration9* quadVertexDecl;
IDirect3DVertexDeclaration9* vertexDecl;
IDirect3DIndexBuffer9* quadIndexBuffer;
IDirect3DVertexBuffer9* quadVertexBuffer;
IDirect3DSurface9* renderSurface;
static const int renderTextureCount = 2; // pos, normal
int renderTargetWidth;
int renderTargetHeight;
D3DXVECTOR4 renderTargetDDX;
const Fluid* currentFluid;
};
static const float particleQuadVerts[20] =
{
-1.0f,-1.0f, 0.0f,
0.0f, 1.0f,
-1.0f, 1.0f, 0.0f,
0.0f, 0.0f,
1.0f, 1.0f, 0.0f,
1.0f, 0.0f,
1.0f, -1.0f, 0.0f,
1.0f, 1.0f
};
static const float screenQuadVerts[30] =
{
-1.0f,-1.0f, 1.0f,
0.0f, 1.0f,
-1.0f, 1.0f, 1.0f,
0.0f, 0.0f,
1.0f, 1.0f, 1.0f,
1.0f, 0.0f,
1.0f, -1.0f, 1.0f,
1.0f, 1.0f,
-1.0f,-1.0f, 1.0f,
0.0f, 1.0f,
1.0f, 1.0f, 1.0f,
1.0f, 0.0f
};

View File

@@ -0,0 +1,843 @@
#pragma once
#include "Greeble.h"
#include "intrin.h"
#ifdef EXTRACODE
#include "greebledata.h"
#else
#include "greeblearrays.h"
#endif
#include "globals.h"
Greeble g_Greeble;
float Greeble::GetFloatParam( int iBank, int iOffset )
{
return g_GreebleParam[ iBank * 4 + iOffset ];
}
void Greeble::AddToScene( float fCurTime, int iObject, int iObjDesc )
{
iObjID= iObject;
pObj= g_GreebleObj + iObjDesc;
fTime= fCurTime;
PrepMesh();
}
void Greeble::CreateFloatFieldPlasma( int ParamBank, float* pFloat, float fStepX, int iStepsX, float fStepY, int iStepsY, float fTime )
{
const float fAmplifyX= GetFloatParam( ParamBank, 0 );
const float fAmplifyY= GetFloatParam( ParamBank, 1 );
const float fBaseValue= GetFloatParam( ParamBank, 2 );
const float fStretchAmplify= GetFloatParam( ParamBank, 3 );
const float fStretchX= GetFloatParam( ParamBank + 1, 0 );
const float fStretchX2= GetFloatParam( ParamBank + 1, 1 );
const float fSpeedX= GetFloatParam( ParamBank + 1, 2 );
const float fSpeedX2= GetFloatParam( ParamBank + 1, 3 );
const float fStretchY= GetFloatParam( ParamBank + 2, 0 );
const float fStretchY2= GetFloatParam( ParamBank + 2, 1 );
const float fSpeedY= GetFloatParam( ParamBank + 2, 2 );
const float fSpeedY2= GetFloatParam( ParamBank + 2, 3 );
const float fStartX= 0.0f;
const float fStartY= 0.0f;
float fY= fStartY;
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
{
float fX= fStartX;
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
{
float fVal= fBaseValue +
fAmplifyX * sin( fX * fStretchX +
fSpeedX * fTime +
fStretchAmplify * sin( fStretchX2 * fY + fTime * fSpeedX2 ) ) +
fAmplifyY * sin( fY * fStretchY +
fSpeedY * fTime +
fStretchAmplify * sin( fStretchY2 * fX + fTime * fSpeedY2 ) );
int iOffset= iY * iStepsX + iX;
pFloat[ iOffset ]= fVal;
}
}
}
void Greeble::CreateTwistedBow( int ParamBank, float* pFloat, float fStepX, int iStepsX, float fStepY, int iStepsY, float fTime )
{
const float fStrength= GetFloatParam( ParamBank, 0 );
const float fAmpliHorz= GetFloatParam( ParamBank, 1 );
const float fRepHorz= GetFloatParam( ParamBank, 2 );
const float fSpeedHorz= GetFloatParam( ParamBank, 3 );
const float fTwistVert= GetFloatParam( ParamBank + 1, 0 );
const float fAmpliVert= GetFloatParam( ParamBank + 1, 1 );
const float fRepVert= GetFloatParam( ParamBank + 1, 2 );
const float fSpeedVert= GetFloatParam( ParamBank + 1, 3 );
const float fStartX= 0.0f;
const float fStartY= 0.0f;
float fY= fStartY;
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
{
float fX= fStartX;
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
{
float fBow= sin( 0.5f * fY );
float fVal= fStrength +
fAmpliHorz * sin( fSpeedHorz * fTime + fRepHorz * fY ) +
fAmpliVert * sin( fSpeedVert * fTime + fRepVert * fX + fTwistVert * fY );
fVal*= fBow;
int iOffset= iY * iStepsX + iX;
pFloat[ iOffset ]= fVal;
}
}
}
void Greeble::Create3DMeshPlane( float* pFloat, float fStartX, float fStepX, int iStepsX, float fStartY, float fStepY, int iStepsY )
{
float fY= fStartY;
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
{
float fX= fStartX;
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
{
int iOffset= iY * iStepsX + iX;
PreMesh[ iOffset ].Pos().x= fX;
PreMesh[ iOffset ].Pos().y= pFloat[ iOffset ];
PreMesh[ iOffset ].Pos().z= fY;
}
}
}
void Greeble::Create3DMeshCylinder( float* pFloat, float fBaseRadiusX, float fBaseRadiusZ, int iStepsX, float fStartY, float fStepY, int iStepsY )
{
const float fStepX= c_2PI / (float)( iStepsX - 1 );
float fY= fStartY;
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
{
float fX= 0.0f;
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
{
int iOffset= iY * iStepsX + iX;
float fR= pFloat[ iOffset ];
PreMesh[ iOffset ].Pos().x= sin( fX ) * ( fR + fBaseRadiusX );
PreMesh[ iOffset ].Pos().y= fY;
PreMesh[ iOffset ].Pos().z= cos( fX ) * ( fR + fBaseRadiusZ );
}
}
}
void Greeble::Create3DMeshSphere( float* pFloat, float fBaseRadiusX, float fBaseRadiusY, float fBaseRadiusZ, int iStepsX, int iStepsY )
{
const float fStepX= c_2PI / (float)( iStepsX - 1 );
const float Length= c_PI - 0.01f;
const float fStepY= Length / (float)( iStepsY - 1 );
float fY= ( c_PI - Length )* 0.5f;
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
{
float SinY= sin( fY );
float CosY= cos( fY );
float fX= 0.0f;
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
{
int iOffset= iY * iStepsX + iX;
float fR= pFloat[ iOffset ] * SinY;
PreMesh[ iOffset ].Pos().x= SinY * sin( fX ) * ( fR + fBaseRadiusX );
PreMesh[ iOffset ].Pos().y= CosY * ( fR + fBaseRadiusY );
PreMesh[ iOffset ].Pos().z= SinY * cos( fX ) * ( fR + fBaseRadiusZ );
}
}
}
void Greeble::Create3DMeshTorus( float* pFloat, float fBaseRadiusX, float fBaseRadiusZ, float fInnerRadiusXZ, float fInnerRadiusY, int iStepsX, int iStepsY )
{
const float fStepX= c_2PI / (float)( iStepsX - 1 );
const float fStepY= c_2PI / (float)( iStepsY - 1 );
float fY= 0.0f;
for( int iY= 0; iY < iStepsY; ++iY, fY+= fStepY )
{
float SinY= sin( fY );
float CosY= cos( fY );
float fX= 0.0f;
for( int iX= 0; iX < iStepsX; ++iX, fX+= fStepX )
{
int iOffset= iY * iStepsX + iX;
float fR= pFloat[ iOffset ];
float SinX= sin( fX );
float CosX= cos( fX );
PreMesh[ iOffset ].Pos().x= SinY * ( fBaseRadiusX + CosX * fInnerRadiusXZ + fR);
PreMesh[ iOffset ].Pos().y= SinX * ( fInnerRadiusY + fR );
PreMesh[ iOffset ].Pos().z= CosY * ( fBaseRadiusZ + CosX * fInnerRadiusXZ + fR );
}
}
}
void Greeble::CreateNormals( int iStepsX, int iStepsY )
{
for( int iY= 0; iY < iStepsY; ++iY )
{
for( int iX= 0; iX < iStepsX; ++iX )
{
int iOffset= iY * iStepsX + iX;
int iOffsetLeft= iY * iStepsX + ( iX + 1 ) % iStepsX;
int iOffsetRight= iY * iStepsX + ( iX + iStepsX - 1 ) % iStepsX;
int iOffsetBottom= ( ( iY + 1 ) % iStepsY ) * iStepsX + iX;
int iOffsetTop= ( ( iY + iStepsY - 1 ) % iStepsY ) * iStepsX + iX;
D3DXVECTOR3 vec3V(
PreMesh[ iOffsetLeft ].Pos() - PreMesh[ iOffsetRight ].Pos() );
D3DXVECTOR3 vec3H(
PreMesh[ iOffsetTop ].Pos() - PreMesh[ iOffsetBottom ].Pos() );
D3DXVec3Cross( &PreMesh[ iOffset ].Normal(), &vec3V, &vec3H );
D3DXVec3Normalize( &PreMesh[ iOffset ].Normal(), &PreMesh[ iOffset ].Normal() );
}
}
}
void Greeble::CreateNormalsBreakXY( int iStepsX, int iStepsY )
{
for( int iY= 0; iY < iStepsY; ++iY )
{
for( int iX= 0; iX < iStepsX; ++iX )
{
int iOffset= iY * iStepsX + iX;
int iOffsetLeft= iY * iStepsX + ( iX + 1 ) % iStepsX;
int iOffsetRight= iY * iStepsX + ( iX + iStepsX - 1 ) % iStepsX;
int iOffsetBottom= ( ( iY + 1 ) % iStepsY ) * iStepsX + iX;
int iOffsetTop= ( ( iY + iStepsY - 1 ) % iStepsY ) * iStepsX + iX;
if( iX == 0 )
{
iOffsetRight= iOffset;
}
if( iX == iStepsX - 1 )
{
iOffsetLeft= iOffset;
}
if( iY == 0 )
{
iOffsetTop= iOffset;
}
if( iY == iStepsY - 1 )
{
iOffsetBottom= iOffset;
}
D3DXVECTOR3 vec3V(
PreMesh[ iOffsetLeft ].Pos() - PreMesh[ iOffsetRight ].Pos() );
D3DXVECTOR3 vec3H(
PreMesh[ iOffsetTop ].Pos() - PreMesh[ iOffsetBottom ].Pos() );
D3DXVec3Cross( &PreMesh[ iOffset ].Normal(), &vec3V, &vec3H );
D3DXVec3Normalize( &PreMesh[ iOffset ].Normal(), &PreMesh[ iOffset ].Normal() );
}
}
}
void Greeble::CreateNormalsBreakX( int iStepsX, int iStepsY )
{
for( int iY= 0; iY < iStepsY; ++iY )
{
for( int iX= 0; iX < iStepsX; ++iX )
{
int iOffset= iY * iStepsX + iX;
int iOffsetLeft= iY * iStepsX + ( iX + 1 ) % iStepsX;
int iOffsetRight= iY * iStepsX + ( iX + iStepsX - 1 ) % iStepsX;
int iOffsetBottom= ( ( iY + 1 ) % iStepsY ) * iStepsX + iX;
int iOffsetTop= ( ( iY + iStepsY - 1 ) % iStepsY ) * iStepsX + iX;
if( iX == 0 )
{
iOffsetRight= iOffset;
}
if( iX == iStepsX - 1 )
{
iOffsetLeft= iOffset;
}
D3DXVECTOR3 vec3V(
PreMesh[ iOffsetLeft ].Pos() - PreMesh[ iOffsetRight ].Pos() );
D3DXVECTOR3 vec3H(
PreMesh[ iOffsetTop ].Pos() - PreMesh[ iOffsetBottom ].Pos() );
D3DXVec3Cross( &PreMesh[ iOffset ].Normal(), &vec3V, &vec3H );
D3DXVec3Normalize( &PreMesh[ iOffset ].Normal(), &PreMesh[ iOffset ].Normal() );
}
}
}
void Greeble::CreateNormalsBreakY( int iStepsX, int iStepsY )
{
for( int iY= 0; iY < iStepsY; ++iY )
{
for( int iX= 0; iX < iStepsX; ++iX )
{
int iOffset= iY * iStepsX + iX;
int iOffsetLeft= iY * iStepsX + ( iX + 1 ) % iStepsX;
int iOffsetRight= iY * iStepsX + ( iX + iStepsX - 1 ) % iStepsX;
int iOffsetBottom= ( ( iY + 1 ) % iStepsY ) * iStepsX + iX;
int iOffsetTop= ( ( iY + iStepsY - 1 ) % iStepsY ) * iStepsX + iX;
if( iY == 0 )
{
iOffsetTop= iOffset;
}
if( iY == iStepsY - 1 )
{
iOffsetBottom= iOffset;
}
D3DXVECTOR3 vec3V(
PreMesh[ iOffsetLeft ].Pos() - PreMesh[ iOffsetRight ].Pos() );
D3DXVECTOR3 vec3H(
PreMesh[ iOffsetTop ].Pos() - PreMesh[ iOffsetBottom ].Pos() );
D3DXVec3Cross( &PreMesh[ iOffset ].Normal(), &vec3V, &vec3H );
D3DXVec3Normalize( &PreMesh[ iOffset ].Normal(), &PreMesh[ iOffset ].Normal() );
}
}
}
void Greeble::PrepAO( int iStepsX, int iStepsY, float* pFloatHeight, float* pFloatCenterMix, float* pFloatAOVert, float* pFloatAOVHorz, float* pFloatAOIntermediate )
{
const float fBase= 1.0f / 2.0f;
for( int iY= 0; iY < iStepsY; ++iY )
{
for( int iX= 0; iX < iStepsX; ++iX )
{
int iOffset= iY * iStepsX + iX;
float fHeight= pFloatHeight[ iOffset ];
float fMix= pFloatCenterMix[ iOffset ];
if( fHeight > 0.01f )
{
pFloatAOIntermediate[ iOffset ]= minimum( ( fMix ) * sqrt( fBase / fHeight ), 0.5f );
}
else
{
pFloatAOIntermediate[ iOffset ]= 0.5f;
}
}
}
for( int iY= 0; iY < iStepsY; ++iY )
{
for( int iX= 0; iX < iStepsX; ++iX )
{
int iOffset= iY * iStepsX + iX;
int iOffsetRight= iY * iStepsX + ( iX + iStepsX - 1 ) % iStepsX;
int iOffsetTop= ( ( iY + iStepsY - 1 ) % iStepsY ) * iStepsX + iX;
pFloatAOVHorz[ iOffset ]= pFloatAOIntermediate[ iOffset ] + pFloatAOIntermediate[ iOffsetRight ];
pFloatAOVert[ iOffset ]= pFloatAOIntermediate[ iOffset ] + pFloatAOIntermediate[ iOffsetTop ];
}
}
}
DWORD ShadeColor( DWORD dwBaseColor, float fShade )
{
DWORD dwRGB[3]=
{
( dwBaseColor & 0xff0000 ) >> 16,
( dwBaseColor & 0xff00 ) >> 8,
( dwBaseColor & 0xff )
};
dwRGB[0]= (int)( (float)dwRGB[0] * fShade );
dwRGB[1]= (int)( (float)dwRGB[1] * fShade );
dwRGB[2]= (int)( (float)dwRGB[2] * fShade );
return dwRGB[0] << 16 | dwRGB[1] << 8 | dwRGB[2] | ( 0xff000000 & dwBaseColor );
}
void Greeble::CreateFinal3DMesh( int iStepsX, int iStepsY, float* pFloatHeight, float* pFloatCenterMix, float* pFloatAOVert, float* pFloatAOVHorz, DWORD dwBaseColor )
{
g_Objects[ iObjID ].Lock();
const int QuadsPerStep= 5;
for( int iY= 0; iY < iStepsY - 1; ++iY )
{
for( int iX= 0; iX < iStepsX - 1; ++iX )
{
int iOffsetVert[ 4 ]=
{
iY * iStepsX + iX,
iY * iStepsX + iX + 1,
iY * iStepsX + iX + iStepsX + 1,
iY * iStepsX + iX + iStepsX
};
float fHeight= pFloatHeight[ iOffsetVert[ 0 ] ];
float fMix= pFloatCenterMix[ iOffsetVert[ 0 ] ];
D3DXVECTOR3 v[ 8 ]=
{
PreMesh[ iOffsetVert[ 0 ] ].Pos(),
PreMesh[ iOffsetVert[ 1 ] ].Pos(),
PreMesh[ iOffsetVert[ 2 ] ].Pos(),
PreMesh[ iOffsetVert[ 3 ] ].Pos(),
PreMesh[ iOffsetVert[ 0 ] ].Pos() + PreMesh[ iOffsetVert[ 0 ] ].Normal() * fHeight,
PreMesh[ iOffsetVert[ 1 ] ].Pos() + PreMesh[ iOffsetVert[ 1 ] ].Normal() * fHeight,
PreMesh[ iOffsetVert[ 2 ] ].Pos() + PreMesh[ iOffsetVert[ 2 ] ].Normal() * fHeight,
PreMesh[ iOffsetVert[ 3 ] ].Pos() + PreMesh[ iOffsetVert[ 3 ] ].Normal() * fHeight,
};
D3DXVECTOR3 vCenter= 0.25f * ( v[4] + v[5] + v[6] + v[7] );
D3DXVec3Lerp( &v[4], &v[4], &vCenter, fMix );
D3DXVec3Lerp( &v[5], &v[5], &vCenter, fMix );
D3DXVec3Lerp( &v[6], &v[6], &vCenter, fMix );
D3DXVec3Lerp( &v[7], &v[7], &vCenter, fMix );
D3DXVECTOR3 n[8]=
{
PreMesh[ iOffsetVert[ 0 ] ].Normal(),
PreMesh[ iOffsetVert[ 1 ] ].Normal(),
PreMesh[ iOffsetVert[ 2 ] ].Normal(),
PreMesh[ iOffsetVert[ 3 ] ].Normal(),
};
{
D3DXVECTOR3 v1= PreMesh[ iOffsetVert[ 1 ] ].Pos() - PreMesh[ iOffsetVert[ 0 ] ].Pos();
D3DXVECTOR3 v2= v[4] - PreMesh[ iOffsetVert[ 0 ] ].Pos();
D3DXVec3Cross( &n[4], &v2, &v1 );
D3DXVec3Normalize( &n[4], &n[4] );
}
{
D3DXVECTOR3 v1= PreMesh[ iOffsetVert[ 2 ] ].Pos() - PreMesh[ iOffsetVert[ 1 ] ].Pos();
D3DXVECTOR3 v2= v[5] - PreMesh[ iOffsetVert[ 1 ] ].Pos();
D3DXVec3Cross( &n[5], &v2, &v1 );
D3DXVec3Normalize( &n[5], &n[5] );
}
{
D3DXVECTOR3 v1= PreMesh[ iOffsetVert[ 3 ] ].Pos() - PreMesh[ iOffsetVert[ 2 ] ].Pos();
D3DXVECTOR3 v2= v[6] - PreMesh[ iOffsetVert[ 2 ] ].Pos();
D3DXVec3Cross( &n[6], &v2, &v1 );
D3DXVec3Normalize( &n[6], &n[6] );
}
{
D3DXVECTOR3 v1= PreMesh[ iOffsetVert[ 0 ] ].Pos() - PreMesh[ iOffsetVert[ 3 ] ].Pos();
D3DXVECTOR3 v2= v[7] - PreMesh[ iOffsetVert[ 3 ] ].Pos();
D3DXVec3Cross( &n[7], &v2, &v1 );
D3DXVec3Normalize( &n[7], &n[7] );
}
/*int iFinalOffset= iY * ( iStepsX - 1 )+ iX;
iFinalOffset*= VertsPerStep;*/
float AOLeft= pFloatAOVHorz[ iOffsetVert[ 0 ] ];
float AORight= pFloatAOVHorz[ iOffsetVert[ 1 ] ];
float AOTop= pFloatAOVert[ iOffsetVert[ 0 ] ];
float AOBottom= pFloatAOVert[ iOffsetVert[ 3 ] ];
DWORD dwColor[ 5 ]=
{
ShadeColor( dwBaseColor, 1.0f ),
ShadeColor( dwBaseColor, AOTop ),
ShadeColor( dwBaseColor, AORight ),
ShadeColor( dwBaseColor, AOBottom ),
ShadeColor( dwBaseColor, AOLeft ),
};
/*dwColor[ 1 ]= (int)( 255.4f * AOTop );
dwColor[ 2 ]= (int)( 255.4f * AORight );
dwColor[ 3 ]= (int)( 255.4f * AOBottom );
dwColor[ 4 ]= (int)( 255.4f * AOLeft );
dwColor[ 1 ]= dwColor[ 1 ] << 16 | dwColor[ 1 ] << 8 | dwColor[ 1 ] | 0xff000000;
dwColor[ 2 ]= dwColor[ 2 ] << 16 | dwColor[ 2 ] << 8 | dwColor[ 2 ] | 0xff000000;
dwColor[ 3 ]= dwColor[ 3 ] << 16 | dwColor[ 3 ] << 8 | dwColor[ 3 ] | 0xff000000;
dwColor[ 4 ]= dwColor[ 4 ] << 16 | dwColor[ 4 ] << 8 | dwColor[ 4 ] | 0xff000000;*/
int iQuadOffsets[]=
{
4, 0, 0, // Deckel
5, 1, 0,
7, 3, 0,
6, 2, 0,
0, 4, 1, // Flanke oben
1, 4, 1,
4, 4, 0,
5, 4, 0,
1, 5, 2, // Flanke rechts
2, 5, 2,
5, 5, 0,
6, 5, 0,
2, 6, 3, // Flanke unten
3, 6, 3,
6, 6, 0,
7, 6, 0,
3, 7, 4, // Flanke links
0, 7, 4,
7, 7, 0,
4, 7, 0,
};
for( int i= 0; i < QuadsPerStep * 4; ++i )
{
Renderjob::SVertex V;
V.Pos()= v[ iQuadOffsets[ i * 3 ] ];
V.Normal()= n[ iQuadOffsets[ i * 3 + 1 ] ];
V.dwColor= dwColor[ iQuadOffsets[ i * 3 + 2 ] ];
V.tu= 0.0f;
V.tv= 0.0f;
g_Objects[ iObjID ].AddVertex( V );
}
}
}
int iV= 0;
for( int i= 0; i < QuadsPerStep * ( iStepsX - 1 ) * ( iStepsY - 1 ); ++i )
{
g_Objects[ iObjID ].AddIndex( iV + 2);
g_Objects[ iObjID ].AddIndex( iV + 1);
g_Objects[ iObjID ].AddIndex( iV + 0);
g_Objects[ iObjID ].AddIndex( iV + 3);
g_Objects[ iObjID ].AddIndex( iV + 1);
g_Objects[ iObjID ].AddIndex( iV + 2);
iV+= 4;
assert( iV <= g_Objects[ iObjID ].GetVertCount() );
}
g_Objects[ iObjID ].Unlock();
}
void Greeble::Create2DFunc( int FuncType, int iParamBank, float* pFloat, int iSizeX, int iSizeY, float fTime )
{
switch( FuncType )
{
case -1:
{
for( int i= 0; i < iSizeX * iSizeY; ++i )
{
pFloat[ i ]= 0.0f;
}
}
break;
case 0:
case 1:
case 2:
case 3:
{
for( int i= 0; i < iSizeX * iSizeY; ++i )
{
pFloat[ i ]= GetFloatParam( iParamBank, FuncType );
}
}
break;
case 4:
{
const float fPiX= c_2PI / (float)( iSizeX - 1 );
const float fPiY= c_2PI / (float)( iSizeY - 1 );
CreateFloatFieldPlasma(
iParamBank, // ParamBank,
pFloat, // pFloat,
fPiX, // fStepX
iSizeX, // iStepsX,
fPiY, // fStepY
iSizeY, // iStepsY
fTime );
}
break;
case 5:
{
const float fPiX= c_2PI / (float)( iSizeX - 1 );
const float fPiY= c_2PI / (float)( iSizeY - 1 );
CreateTwistedBow(
iParamBank, // ParamBank,
pFloat, // pFloat,
fPiX, // fStepX
iSizeX, // iStepsX,
fPiY, // fStepY
iSizeY, // iStepsY
fTime );
}
break;
}
}
void Greeble::PrepMesh()
{
const int iSizeX= pObj->m_iSizeX;
const int iSizeY= pObj->m_iSizeY;
Create2DFunc(
pObj->m_iOffsetFunc,
pObj->m_iOffsetBank,
PreFloats,
iSizeX,
iSizeY,
fTime);
/*const float fPiX= c_2PI / (float)( iSizeX - 1 );
const float fPiY= c_2PI / (float)( iSizeY - 1 );
CreateFloatFieldPlasma(
pObj->m_iOffsetBank, // ParamBank,
PreFloats, // pFloat,
fPiX, // fStepX
iSizeX, // iStepsX,
fPiY, // fStepY
iSizeY // iStepsY
);*/
switch( pObj->m_iBaseMeshType )
{
case 0:
{
const float fPlaneSizeX= GetFloatParam( pObj->m_iBaseBank, 0 );
const float fPlaneSizeY= GetFloatParam( pObj->m_iBaseBank, 1 );
float fPlaneStepX= 2.0f * fPlaneSizeX / (float)( iSizeX - 1 );
float fPlaneStepY= 2.0f * fPlaneSizeY / (float)( iSizeY - 1 );
Create3DMeshPlane(
PreFloats, // pFloat,
-fPlaneSizeX, // fStartX
fPlaneStepX, // fStepX
iSizeX, // iStepsX,
-fPlaneSizeY, // fStartY
fPlaneStepY, // fStepY
iSizeY // iStepsY
);
CreateNormalsBreakXY(
iSizeX,
iSizeY
);
}
break;
case 1:
{
const float fBaseRadiusX= GetFloatParam( pObj->m_iBaseBank, 0 );
const float fBaseRadiusZ= GetFloatParam( pObj->m_iBaseBank, 1 );
const float fCylinderSizeY= GetFloatParam( pObj->m_iBaseBank, 2 );
float fCylinderStepY= 2.0f * fCylinderSizeY / (float)( iSizeY - 1 );
Create3DMeshCylinder(
PreFloats, // float* pFloat,
fBaseRadiusX, // float fBaseRadiusX,
fBaseRadiusZ, // float fBaseRadiusZ,
iSizeX, // int iStepsX,
-fCylinderSizeY, // float fStartY,
fCylinderStepY, // float fStepY,
iSizeY // int iStepsY
);
CreateNormalsBreakY(
iSizeX,
iSizeY
);
}
break;
case 2:
{
const float fBaseRadiusX= GetFloatParam( pObj->m_iBaseBank, 0 );
const float fBaseRadiusY= GetFloatParam( pObj->m_iBaseBank, 1 );
const float fBaseRadiusZ= GetFloatParam( pObj->m_iBaseBank, 2 );
Create3DMeshSphere(
PreFloats, // float* pFloat,
fBaseRadiusX, // fBaseRadiusX
fBaseRadiusY, // fBaseRadiusY
fBaseRadiusZ, // fBaseRadiusZ
iSizeX, // int iStepsX,
iSizeY // int iStepsY,
);
CreateNormalsBreakY(
iSizeX,
iSizeY
);
}
break;
case 3:
{
Create3DMeshTorus(
PreFloats, // float* pFloat,
GetFloatParam( pObj->m_iBaseBank, 0 ),
GetFloatParam( pObj->m_iBaseBank, 1 ),
GetFloatParam( pObj->m_iBaseBank, 2 ),
GetFloatParam( pObj->m_iBaseBank, 3 ),
iSizeX, // int iStepsX,
iSizeY // int iStepsY,
);
CreateNormals(
iSizeX,
iSizeY
);
}
break;
}
Create2DFunc(
pObj->m_iHeightFunc,
pObj->m_iHeightBank,
PreFloat(1),
iSizeX,
iSizeY,
fTime );
Create2DFunc(
pObj->m_iMixFunc,
pObj->m_iMixBank,
PreFloat(2),
iSizeX,
iSizeY,
fTime );
/*W
CreateFloatFieldPlasma(
pObj->m_iHeightBank, // ParamBank,
PreFloat(1), // pFloat,
fPiX, // fStepX
iSizeX, // iStepsX,
fPiY, // fStepY
iSizeY // iStepsY
);
CreateFloatFieldPlasma(
pObj->m_iMixBank, // ParamBank,
PreFloat(2), // pFloat,
fPiX, // fStepX
iSizeX, // iStepsX,
fPiY, // fStepY
iSizeY // iStepsY
);
*/
PrepAO(
iSizeX,
iSizeY ,
PreFloat(1), // pFloatHeight,
PreFloat(2), // pFloatCenterMix,
PreFloat(3), // pFloatAOVert,
PreFloat(4), // pFloatAOVHorz
PreFloat(5) // Intermediate
);
CreateFinal3DMesh(
iSizeX,
iSizeY ,
PreFloat(1), // pFloatHeight,
PreFloat(2), // pFloatCenterMix,
PreFloat(3), // pFloatAOVert,
PreFloat(4), // pFloatAOVHorz
pObj->m_dwColor
);
}
/*void Greeble::CreateInterpolationMatrix( D3DXMATRIX* pMat, int iBank, float fTime )
{
D3DXVECTOR3 vecPos(
GetFloatParam( iBank, 0 ),
GetFloatParam( iBank, 1 ),
GetFloatParam( iBank, 2 ) );
D3DXVECTOR3 vecPos2(
GetFloatParam( iBank + 1, 0 ),
GetFloatParam( iBank + 1, 1 ),
GetFloatParam( iBank + 1, 2 ) );
D3DXVECTOR3 vecRot(
GetFloatParam( iBank + 2, 0 ),
GetFloatParam( iBank + 2, 1 ),
GetFloatParam( iBank + 2, 2 ) );
D3DXVECTOR3 vecRot2(
GetFloatParam( iBank + 3, 0 ),
GetFloatParam( iBank + 3, 1 ),
GetFloatParam( iBank + 3, 2 ) );
vecPos+= vecPos2 * fTime * GetFloatParam( iBank + 1, 3 );
vecRot+= vecRot2 * fTime * GetFloatParam( iBank + 3, 3 );
vecRot*= c_2PI;
D3DXMATRIX matPos;
D3DXMatrixTranslation( &matPos, vecPos.x, vecPos.y, vecPos.z );
D3DXMATRIX matRot;
D3DXMatrixRotationYawPitchRoll( &matRot, vecRot.x, vecRot.y, vecRot.z );
*pMat= matRot * matPos;
}
void Greeble::RenderMesh( SObjectDescription* pObj, float fTime )
{
g_d3d_device->SetRenderState( D3DRS_LIGHTING, TRUE );
g_d3d_device->SetLight( 0, &d3dLight[ 0 ] );
g_d3d_device->LightEnable( 0, TRUE );
g_d3d_device->SetLight( 1, &d3dLight[ 1 ] );
g_d3d_device->LightEnable( 1, TRUE );
g_d3d_device->SetLight( 2, &d3dLight[ 2 ] );
g_d3d_device->LightEnable( 2, TRUE );
g_d3d_device->SetRenderState( D3DRS_ZENABLE, TRUE );
g_d3d_device->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
g_d3d_device->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
g_d3d_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_CW );
g_d3d_device->SetRenderState( D3DRS_TEXTUREFACTOR, pObj->m_dwColor );
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_MODULATE );
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
//g_d3d_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
//g_d3d_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE );
D3DXMATRIX mat;
float zf= 400.0f;
float zn= 0.125f;
float xScale = 1.0f;
float yScale= xScale / (float)c_iScreenSizeY * (float)c_iScreenSizeX;
mat._11= xScale; mat._12= 0; mat._13= 0; mat._14= 0;
mat._21= 0; mat._22= yScale; mat._23= 0; mat._24= 0;
mat._31= 0; mat._32= 0; mat._33= zf/(zf-zn); mat._34= 1;
mat._41= 0; mat._42= 0; mat._43= -zn*zf/(zf-zn);mat._44= 0;
g_d3d_device->SetTransform( D3DTS_PROJECTION, &mat );
D3DXMatrixIdentity( &mat );
g_d3d_device->SetTransform( D3DTS_WORLD, &mat );
SetTransformation( pObj, fTime );
{
g_d3d_device->SetFVF( c_dwFVFMesh );
int iPrimCount= PrepMesh( pObj, fTime );
SVertexMesh* pVertices= FinalMesh;
while( iPrimCount > 0 )
{
int iActPrimCount= iPrimCount;
if( iActPrimCount > 16384 )
{
iActPrimCount= 16384;
}
g_d3d_device->DrawPrimitiveUP(
D3DPT_TRIANGLELIST,
iActPrimCount,
pVertices,
sizeof( SVertexMesh )
);
pVertices+= iActPrimCount * 3;
iPrimCount-= iActPrimCount;
}
}
}*/

View File

@@ -0,0 +1,146 @@
#pragma once
#include <d3dx9.h>
#include "renderjob.h"
struct Greeble
{
struct SObjectDescription
{
int m_iSizeX;
int m_iSizeY;
int m_iBaseMeshType;
int m_iBaseBank;
int m_iOffsetFunc;
int m_iOffsetBank;
int m_iHeightFunc;
int m_iHeightBank;
int m_iMixFunc;
int m_iMixBank;
DWORD m_dwColor;
};
void AddToScene( float fTime, int iObject, int iObjDesc );
Renderjob::SVertex PreMesh[ 128 * 128 ];
float PreFloats[ 128 * 128 * 16 ];
static const int PreFloatBlock= 128 * 128;
int iObjID;
SObjectDescription* pObj;
float fTime;
float GetFloatParam( int iBank, int iOffset );
float* PreFloat( int i )
{
return PreFloats + i * PreFloatBlock;
}
Renderjob::SVertex FinalMesh[ 128 * 128 * 32 ];
void CreateFloatFieldPlasma(
int ParamBank, float* pFloat,
float fStepX, int iStepsX,
float fStepY, int iStepsY,
float fTime);
void CreateTwistedBow(
int ParamBank, float* pFloat,
float fStepX, int iStepsX,
float fStepY, int iStepsY,
float fTime );
void Create3DMeshPlane(
float* pFloat,
float fStartX, float fStepX, int iStepsX,
float fStartY, float fStepY, int iStepsY
);
void Create3DMeshCylinder(
float* pFloat,
float fBaseRadiusX, float fBaseRadiusZ, int iStepsX,
float fStartY, float fStepY, int iStepsY
);
void Create3DMeshSphere(
float* pFloat,
float fBaseRadiusX, float fBaseRadiusY, float fBaseRadiusZ,
int iStepsX, int iStepsY
);
void Create3DMeshTorus(
float* pFloat,
float fBaseRadiusX, float fBaseRadiusZ,
float fInnerRadiusXZ, float fInnerRadiusY,
int iStepsX, int iStepsY
);
void CreateNormals(
int iStepsX,
int iStepsY
);
void CreateNormalsBreakXY(
int iStepsX,
int iStepsY
);
void CreateNormalsBreakX(
int iStepsX,
int iStepsY
);
void CreateNormalsBreakY(
int iStepsX,
int iStepsY
);
void PrepAO(
int iStepsX,
int iStepsY,
float* pFloatHeight,
float* pFloatCenterMix,
float* pFloatAOVert,
float* pFloatAOVHorz,
float* pFloatAOIntermediate
);
void CreateFinal3DMesh(
int iStepsX,
int iStepsY,
float* pFloatHeight,
float* pFloatCenterMix,
float* pFloatAOVert,
float* pFloatAOVHorz,
DWORD dwBaseColor
);
void Create2DFunc(
int FuncType,
int iParamBank,
float* pFloat,
int iSizeX,
int iSizeY,
float fTime );
void PrepMesh();
/*void CreateInterpolationMatrix(
D3DXMATRIX* pMat,
int iBank,
float fTime);
void SetTransformation( SObjectDescription* pObj, float fTime );
void RenderMesh( SObjectDescription* pObj, float fTime );*/
};
extern Greeble g_Greeble;

View File

@@ -0,0 +1,646 @@
#include "intrin.h"
#include "OBJMesh.h"
#include "BinMeshData.h"
#ifdef EXTRACODE
#include "StringHelper.h"
#include "TextFileReader.h"
#include <sstream>
#include <map>
#include <vector>
#include <cmath>
#endif
ObjMesh g_objMesh;
#ifdef EXTRACODE
float ObjMesh::m_fMaxRoundError= 0.0f;
float ObjMesh::RoundFloat( float f, int iBits )
{
DWORD dw= *((DWORD*)&f);
int e= ( ( dw >> 23 ) & 0xff ) - 127;
if( e == - 127)
{
m_fMaxRoundError= max( fabs( f ), m_fMaxRoundError );
return 0.0f;
}
DWORD dwMask= 0xffffffff << ( 32 - iBits );
float Add= powf( 2.0f, (float)( e - iBits + 8 ) );
const int iTests= 7;
float fValues[ iTests ];
for( int i= 0; i < iTests; ++i )
{
fValues[ i ]= f + Add * (float)( i - iTests / 2 ) ;
((DWORD*)(fValues))[ i ]&= dwMask;
}
int iNearest= 0;
for( int i= 1; i < iTests; ++i )
{
if( fabs( f - fValues[ iNearest ] ) > fabs( f - fValues[ i ] ) )
{
iNearest= i;
}
}
m_fMaxRoundError= max( fabs( f - fValues[ iNearest ] ), m_fMaxRoundError );
return fValues[ iNearest ];
}
std::vector< unsigned char > TopologyRaw;
std::vector<BinVertex> VertexRaw;
bool ObjMesh::LoadMesh(
const char* pcFileName,
int FloatBits,
bool bFlatten,
BinMesh& bm,
int& IndexBytes,
int& VertexBytes )
{
std::map< VertexInfo, int > mapVertexData;
std::vector< Vertex > VertexData;
std::vector< int > Topology;
std::vector< Vertex > PrePos;
std::vector< Vertex > PreNormal;
Topology.reserve( 1000 );
PrePos.reserve( 1000 );
PreNormal.reserve( 1000 );
FrameWork::TextFileReader tfrData;
if( !tfrData.read( pcFileName ) )
{
return false;
}
m_FaceCount= 0;
for( int i= 0; i < (int)tfrData.getFileLines().size(); ++i )
{
std::string strAct= tfrData.getFileLines()[ i ];
std::string strCommand;
if( FrameWork::StringHelper::splitAt( strAct, " ", strCommand ) )
{
FrameWork::StringHelper::trim(
strCommand,
FrameWork::StringHelper::getSpaceTab() );
FrameWork::StringHelper::toUpper( strCommand );
}
if( strCommand == "V" )
{
std::stringstream ss;
ss << strAct;
Vertex vxPos;
vxPos.position.x= 0;
vxPos.position.y= 0;
vxPos.position.z= 0;
ss >> vxPos.position.x;
ss >> vxPos.position.y;
ss >> vxPos.position.z;
PrePos.push_back( vxPos );
}
else if( strCommand == "VN" )
{
std::stringstream ss;
ss << strAct;
Vertex vxNorm;
vxNorm.normal.x= 0;
vxNorm.normal.y= 0;
vxNorm.normal.z= 0;
ss >> vxNorm.normal.x;
ss >> vxNorm.normal.y;
ss >> vxNorm.normal.z;
PreNormal.push_back( vxNorm );
}
else if( strCommand == "F" )
{
FrameWork::StringHelper::trim(
strAct,
FrameWork::StringHelper::getSpaceTab() );
std::vector< std::string > strVerts;
FrameWork::StringHelper::tokenize(
strAct, " ", strVerts );
std::vector< int > Read;
for( size_t j= 0; j < strVerts.size(); ++j )
{
std::vector< std::string > vecIndex;
std::string strIndex= strVerts[ j ];
FrameWork::StringHelper::trim(
strIndex,
FrameWork::StringHelper::getSpaceTab() );
FrameWork::StringHelper::tokenize(
strIndex, "/", vecIndex );
for( int jj= 0; jj < 3; ++jj )
{
std::stringstream ss;
if( jj < (int)vecIndex.size() )
{
ss << vecIndex[ jj ];
}
int iValue= -1;
ss >> iValue;
Read.push_back( iValue );
}
}
m_FaceCount++;
Topology.push_back( Read.size() / 3 );
for( int i=0; i < (int)Read.size(); i+= 3 )
{
int iIndex= i;
VertexInfo vInfo;
vInfo.m_iPos= Read[ iIndex ];
vInfo.m_iUV= Read[ iIndex + 1];
vInfo.m_iNormal= Read[ iIndex + 2];
int iMapIndex;
std::map< VertexInfo, int >::iterator it=
mapVertexData.find( vInfo );
if( it != mapVertexData.end() )
{
iMapIndex= it->second;
}
else
{
iMapIndex= (int)VertexData.size();
mapVertexData[ vInfo ]= iMapIndex;
Vertex vNew;
vNew.position= PrePos[ vInfo.m_iPos - 1 ].position;
if( (size_t)vInfo.m_iNormal - 1 >= PreNormal.size() )
{
// Normalen werden sowieso generiert
vNew.normal= D3DXVECTOR3(0, 0, 0 );
}
else
{
vNew.normal= PreNormal[ vInfo.m_iNormal - 1 ].normal;
}
VertexData.push_back( vNew );
}
Topology.push_back( iMapIndex );
}
}
}
//neuordnen der Topology koennte Speicherplatz sparen bei der Kompression
D3DXVECTOR3 PosPredictor( 0.0f, 0.0f, 0.0f );
int IndexPredictor= 0;
TopologyRaw.resize( 0 );
VertexRaw.resize( 0 );
std::map< int, int > IndexMapping;
bm.m_PrimitiveCount= 0;
for(size_t i= 0; i < Topology.size(); ++i )
{
int iCount= Topology[ i ];
for( int j= 0; j < iCount; ++j )
{
int iIndex= Topology[ i + 1 + j ];
//Index schon gespeichert?
std::map< int, int >::iterator it= IndexMapping.find( iIndex );
if( it == IndexMapping.end() )
{
//Vertex ist neu
D3DXVECTOR3 PosData= VertexData[ iIndex ].position - PosPredictor;
IndexMapping[ iIndex ]= VertexRaw.size();
BinVertex v;
v.m_Pos[ 0 ]= PosData.x;
v.m_Pos[ 1 ]= PosData.y;
v.m_Pos[ 2 ]= PosData.z;
if( bFlatten )
{
v.m_Pos[ 2 ]= 0.0f;
}
//Positionswert hier runden macht Kompression besser
v.m_Pos[ 0 ]= RoundFloat( v.m_Pos[ 0 ], FloatBits );
v.m_Pos[ 1 ]= RoundFloat( v.m_Pos[ 1 ], FloatBits );
v.m_Pos[ 2 ]= RoundFloat( v.m_Pos[ 2 ], FloatBits );
VertexRaw.push_back( v );
//PosPredictor+= D3DXVECTOR3( v.m_Pos[ 0 ], v.m_Pos[ 1 ], v.m_Pos[ 2 ] );
TopologyRaw.push_back( 0 );
IndexPredictor++;
}
else
{
//Vertex schon vorhanden
int iIndexTransformed= IndexPredictor - it->second;
while( iIndexTransformed >= BinMesh::c_FarVertex )
{
iIndexTransformed-= BinMesh::c_FarVertex;
TopologyRaw.push_back( BinMesh::c_FarVertex );
}
TopologyRaw.push_back( iIndexTransformed );
}
}
TopologyRaw.push_back( BinMesh::c_FinishPoly );
bm.m_PrimitiveCount++;
i+= iCount;
}
bm.m_pTopology= &(TopologyRaw[ 0 ]);
bm.m_pVertex= &(VertexRaw[ 0 ]);
IndexBytes= TopologyRaw.size();
VertexBytes= VertexRaw.size() * sizeof(BinVertex);
return LoadMesh( &bm );
m_VertexCount= (unsigned int)VertexData.size();
m_IndexCount= (unsigned int)Topology.size();
for(size_t i= 0; i < VertexData.size(); ++i )
{
m_VertexBuffer[ i ]= VertexData[ i ];
}
for(size_t i= 0; i < Topology.size(); ++i )
{
m_IndexBuffer[ i ]= Topology[ i ];
}
}
#endif
bool ObjMesh::LoadMesh( BinMesh* pBinMesh )
{
m_IndexCount= 0;
m_FaceCount= 0;
m_VertexCount= 0;
int IndexPredictor= 0;
unsigned char* pData= pBinMesh->m_pTopology;
int iFaceType= 0;
int iVertex= IndexPredictor;
int New= 1;
while( m_FaceCount < pBinMesh->m_PrimitiveCount )
{
unsigned char c= *pData++;
switch( c )
{
case BinMesh::c_FinishPoly:
m_IndexBuffer[ m_IndexCount ]= iFaceType;
m_IndexCount+= iFaceType + 1;
m_FaceCount++;
iFaceType= 0;
break;
case BinMesh::c_FarVertex:
iVertex-= BinMesh::c_FarVertex;
New= 0;
break;
case 0:
IndexPredictor+= New;
m_VertexCount+= New;
default:
iFaceType++;
m_IndexBuffer[ m_IndexCount + iFaceType ]= iVertex - c;
iVertex= IndexPredictor;
New= 1;
break;
}
}
D3DXVECTOR3 PosPredictor( 0.0f, 0.0f, 0.0f );
for( int i= 0; i < m_VertexCount; ++i )
{
D3DXVECTOR3 p(
pBinMesh->m_pVertex[ i ].m_Pos[ 0 ],
pBinMesh->m_pVertex[ i ].m_Pos[ 1 ],
pBinMesh->m_pVertex[ i ].m_Pos[ 2 ] );
PosPredictor= p;
m_VertexBuffer[ i ].position= PosPredictor;
}
return true;
}
void ObjMesh::GenerateNormals()
{
for( int i= 0; i < m_VertexCount; ++i )
{
m_VertexBuffer[ i ].normal= D3DXVECTOR3( 0, 0, 0);
}
for(int i= 0; i < m_IndexCount; )
{
int iCount= m_IndexBuffer[ i ];
++i;
for( int j= 0; j < iCount; ++j )
{
int iIndex= m_IndexBuffer[ i + j ];
int iIndexPrev= m_IndexBuffer[ i + ( ( j + iCount - 1 ) % iCount ) ];
int iIndexNext= m_IndexBuffer[ i + ( ( j + 1 ) % iCount ) ];
D3DXVECTOR3 p1( m_VertexBuffer[ iIndexPrev ].position - m_VertexBuffer[ iIndex ].position );
D3DXVECTOR3 p2( m_VertexBuffer[ iIndexNext ].position - m_VertexBuffer[ iIndex ].position );
D3DXVec3Cross( &p1, &p2, &p1 );
m_VertexBuffer[ iIndex ].normal+= p1;
}
i+= iCount;
}
for( int i= 0; i < m_VertexCount; ++i )
{
D3DXVec3Normalize( &( m_VertexBuffer[ i ].normal ), &( m_VertexBuffer[ i ].normal ) );
}
}
void ObjMesh::UnIndex()
{
m_OP.Reset();
m_OP.m_NextVertexCount= 0;
for(int i= 0; i < m_IndexCount; )
{
int iCount= m_IndexBuffer[ i ];
++i;
for( int j= 0; j < iCount; ++j )
{
int iIndex= m_IndexBuffer[ i + j ];
m_OP.m_NextVB[ m_OP.m_NextVertexCount ]= m_VertexBuffer[ iIndex ];
m_IndexBuffer[ i + j ]= m_OP.m_NextVertexCount;
m_OP.m_NextVertexCount++;
}
i+= iCount;
}
//Klatteratatsch ins Mesh kopieren...
mymemcpy( m_VertexBuffer, m_OP.m_NextVB, sizeof( m_VertexBuffer ) );
m_VertexCount= m_OP.m_NextVertexCount;
}
void ObjMesh::CatmullClarkSubdivide()
{
if( m_IndexCount >= MaxIndexBuffer / 4 )
{
return;
}
if( m_VertexCount >= MaxVertexBuffer * 9 / 4 )
{
return;
}
// neuer VB ist so:
// alter VB bzw. verschobene Originalpunkte
// ein Vertex pro Face (FacePunkte)
// ein Vertex pro Edge (EdgePunkte)
//neuer IB ist so:
// 4 / alte Ecke0 / EdgePunkt / FaceFacePunkt / EdgePunkt
// 4 / alte Ecke1 / EdgePunkt / FaceFacePunkt / EdgePunkt
//...
// 4 / alte EckeN / EdgePunkt / FaceFacePunkt / EdgePunkt ( N== Vertexcount )
//beim kopieren dann ueberall noch 4
m_OP.Reset();
m_OP.m_NextVertexCount= m_VertexCount + m_FaceCount; //Basis Vertices sind die alte Ecken und die neuen FacePunkte
int iFace= 0;
for(int i= 0; i < m_IndexCount; )
{
int iCount= m_IndexBuffer[ i ];
++i;
D3DXVECTOR3& fp= m_OP.m_NextVB[ m_VertexCount + iFace ].position;
unsigned short int* pIB= m_OP.m_NextIB + m_OP.m_NextIndexCount;
for( int j= 0; j < iCount; ++j )
{
int iIndex= m_IndexBuffer[ i + j ];
fp+= m_VertexBuffer[ iIndex ].position;
pIB[ j * 5 ]= 4;
pIB[ j * 5 + 1]= iIndex;
pIB[ j * 5 + 3 ]= m_VertexCount + iFace; // erste Haelfte IB fertig
}
fp/= (float)iCount; // jetzt ist der FacePunkt fertig
for( int j= 0; j < iCount; ++j )
{
int iIndex= m_IndexBuffer[ i + j ];
int iIndexNext= m_IndexBuffer[ i + ( ( j + 1 ) % iCount ) ];
int Edge= m_OP.MakeEdgeID( iIndex, iIndexNext );
m_OP.m_NextVB[ m_OP.m_EdgeID[ Edge ] ].position+= fp; // Summe aller FacePunkte zu dieser Ecke sind hier
pIB[ j * 5 + 2 ]= m_OP.m_EdgeID[ Edge ];
pIB[ ( j * 5 + 9 ) % ( iCount * 5 ) ]= m_OP.m_EdgeID[ Edge ]; // IB fertig!
m_OP.m_NextVB[ iIndex ].position+= fp; //Summe aller FacePunkte die an diesen Originalpunkt grenzen
}
i+= iCount;
iFace++;
m_OP.m_NextIndexCount+= iCount * 5;
m_OP.m_NextFaceCount+= iCount;
}
// Originalpunkte verschieben
for( int i= 0; i < m_VertexCount; ++i )
{
bool bOpenEdges= false; // gab es offene Kanten (d.h. einseitig benutze?)
D3DXVECTOR3 vEdges(0,0,0);
D3DXVECTOR3 vOpenEdges(0,0,0);
int iEdgeCount= 0;
int iOpenEdgeCount= 0;
for( int j=0; j < m_OP.m_iEdgeCount; ++j )
{
int V1= ( m_OP.m_EdgeConfiguration[ j ] & 0x0000ffff );
int V2= ( m_OP.m_EdgeConfiguration[ j ] & 0xffff0000 ) >> 16;
if( V1 == i || V2 == i )
{
D3DXVECTOR3 vMid= m_VertexBuffer[ V1 ].position + m_VertexBuffer[ V2 ].position;
if( m_OP.m_EdgeUsage[ j ] == 1 )
{
bOpenEdges= true;
iOpenEdgeCount++;
vOpenEdges+= vMid;
}
iEdgeCount++;
vEdges+= vMid;
}
}
if( bOpenEdges )
{
m_OP.m_NextVB[ i ].position= vOpenEdges / (float)( iOpenEdgeCount * 4 ) +
m_VertexBuffer[ i ].position * 0.5f;
}
else
{
m_OP.m_NextVB[ i ].position=
m_OP.m_NextVB[ i ].position / (float)iEdgeCount +
vEdges / (float)iEdgeCount +
m_VertexBuffer[ i ].position * (float)( iEdgeCount - 3 );
m_OP.m_NextVB[ i ].position/= (float)iEdgeCount;
}
}
//EdgePunkte anpassen
for( int j=0; j < m_OP.m_iEdgeCount; ++j )
{
int V1= ( m_OP.m_EdgeConfiguration[ j ] & 0x0000ffff );
int V2= ( m_OP.m_EdgeConfiguration[ j ] & 0xffff0000 ) >> 16;
if( m_OP.m_EdgeUsage[ j ] < 2 )
{
m_OP.m_NextVB[ m_OP.m_EdgeID[ j ] ].position= D3DXVECTOR3( 0,0,0 );
m_OP.m_EdgeUsage[ j ]= 0;
}
m_OP.m_NextVB[ m_OP.m_EdgeID[ j ] ].position+= m_VertexBuffer[ V1 ].position;
m_OP.m_NextVB[ m_OP.m_EdgeID[ j ] ].position+= m_VertexBuffer[ V2 ].position;
m_OP.m_NextVB[ m_OP.m_EdgeID[ j ] ].position/= (float)(m_OP.m_EdgeUsage[ j ] + 2 );
}
//Klatteratatsch ins Mesh kopieren...
mymemcpy( m_VertexBuffer, m_OP.m_NextVB, sizeof( m_VertexBuffer ) );
mymemcpy( m_IndexBuffer, m_OP.m_NextIB, sizeof( m_IndexBuffer ) );
m_VertexCount= m_OP.m_NextVertexCount;
m_IndexCount= m_OP.m_NextIndexCount;
m_FaceCount= m_OP.m_NextFaceCount;
}
void ObjMesh::Extrude( float fExtend )
{
m_OP.Reset();
for(int i= 0; i < m_IndexCount; )
{
int iCount= m_IndexBuffer[ i ];
m_IndexBuffer[ i + m_IndexCount ]= iCount;
++i;
for( int j= 0; j < iCount; ++j )
{
int iIndex= m_IndexBuffer[ i + j ];
int iIndexNext= m_IndexBuffer[ i + ( ( j + 1 ) % iCount ) ];
int ID= m_OP.MakeEdgeID( iIndex, iIndexNext );
if( iIndex > iIndexNext )
{
m_OP.m_EdgeUsage[ ID ]+= 0x80;
}
m_IndexBuffer[ i + m_IndexCount + iCount - j - 1 ]= iIndex + m_VertexCount;
}
i+= iCount;
}
for( int i= 0; i < m_VertexCount; ++i )
{
m_VertexBuffer[ i + m_VertexCount].position= m_VertexBuffer[ i ].position;
m_VertexBuffer[ i ].position.z-= fExtend;
m_VertexBuffer[ i + m_VertexCount].position.z+= fExtend;
}
m_IndexCount*= 2;
m_FaceCount*= 2;
for( int i= 0; i < m_OP.m_iEdgeCount; ++i )
{
if( (m_OP.m_EdgeUsage[ i ] & 0x7f ) == 1 )
{
int iAdd= m_OP.m_EdgeUsage[ i ] == 1 ? 0 : m_VertexCount;
int V1= ( m_OP.m_EdgeConfiguration[ i ] & 0x0000ffff );
int V2= ( m_OP.m_EdgeConfiguration[ i ] & 0xffff0000 ) >> 16;
m_IndexBuffer[ m_IndexCount++ ]= 4;
m_IndexBuffer[ m_IndexCount++ ]= V1+ iAdd;
iAdd= m_VertexCount - iAdd;
m_IndexBuffer[ m_IndexCount++ ]= V1+ iAdd;
m_IndexBuffer[ m_IndexCount++ ]= V2+ iAdd;
iAdd= m_VertexCount - iAdd;
m_IndexBuffer[ m_IndexCount++ ]= V2+ iAdd;
m_FaceCount+= 1;
}
}
m_VertexCount*= 2;
}
void ObjMesh::SuperEllip( float fStrength )
{
if( m_VertexCount == 0 )
{
return;
}
float fMax= m_VertexBuffer[ 0 ].position.z;
float fMin= m_VertexBuffer[ 0 ].position.z;
for( int i= 1; i < m_VertexCount; ++i )
{
fMax= maximum( m_VertexBuffer[ i ].position.z, fMax );
fMin= minimum( m_VertexBuffer[ i ].position.z, fMin );
}
float fMid= ( fMax + fMin ) * 0.5f;
float fExt= ( fMax - fMin ) * 0.5f;
for( int i= 0; i < m_VertexCount; ++i )
{
float Pos= ( m_VertexBuffer[ i ].position.z - fMid ) / fExt;
Pos= signpow( Pos, fStrength );
m_VertexBuffer[ i ].position.z= fMid + Pos * fExt;
}
}
void ObjMesh::OpInfo::Reset()
{
mymemset( m_NextVB, 0, sizeof( m_NextVB ) );
mymemset( m_NextIB, 0, sizeof( m_NextIB ) );
mymemset( m_EdgeConfiguration, 0, sizeof( m_EdgeConfiguration ) );
mymemset( m_EdgeUsage, 0, sizeof( m_EdgeUsage ) );
mymemset( m_EdgeID, 0, sizeof( m_EdgeID ) );
m_NextVertexCount= 0;
m_NextIndexCount= 0;
m_NextFaceCount= 0;
m_iEdgeCount= 0;
}
int ObjMesh::OpInfo::MakeEdgeID( unsigned short VertexA, unsigned short VertexB )
{
unsigned int EdgeConfiguration= VertexA > VertexB ? ( VertexA << 16 | VertexB ) : ( VertexB << 16 | VertexA );
for( int i=0; i < m_iEdgeCount; ++i )
{
if( m_EdgeConfiguration[ i ] == EdgeConfiguration )
{
m_EdgeUsage[ i ]++;
return i;
}
}
m_EdgeConfiguration[ m_iEdgeCount ]= EdgeConfiguration;
m_EdgeUsage[ m_iEdgeCount ]++;
m_EdgeID[ m_iEdgeCount ]= m_NextVertexCount;
m_NextVertexCount++;
return m_iEdgeCount++;
}
/* Vertex m_NextVB[ ObjMesh::MaxVertexBuffer ];
unsigned short int m_NextIB[ ObjMesh::MaxIndexBuffer ];
int m_NextVertexCount;
int m_NextIndexCount;
int m_NextFaceCount;
int m_iEdgeCount;
unsigned int m_EdgeConfiguration[ ObjMesh::MaxIndexBuffer ];
unsigned char m_EdgeUsage[ ObjMesh::MaxIndexBuffer ];
unsigned short int m_EdgeID[ ObjMesh::MaxIndexBuffer ];
}*/

View File

@@ -0,0 +1,105 @@
#pragma once
#include "d3dx9.h"
#ifndef OBJMESH_HEADER
#define OBJMESH_HEADER
struct BinMesh;
class ObjMesh
{
private:
struct Vertex
{
D3DXVECTOR3 position;
D3DXVECTOR3 normal;
};
struct VertexInfo
{
int m_iPos;
int m_iNormal;
int m_iUV;
bool operator<( const VertexInfo& v )const
{
if( m_iPos == v.m_iPos )
{
if( m_iNormal == v.m_iNormal )
{
return m_iUV < v.m_iUV;
}
return m_iNormal < v.m_iNormal;
}
return m_iPos < v.m_iPos;
}
};
int m_VertexCount;
int m_IndexCount;
int m_FaceCount;
static const int MaxVertexBuffer= 65536;
static const int MaxIndexBuffer= 65536 * 9 / 2;
Vertex m_VertexBuffer[ MaxVertexBuffer ];
unsigned short int m_IndexBuffer[ MaxIndexBuffer ];
struct OpInfo
{
void Reset();
Vertex m_NextVB[ ObjMesh::MaxVertexBuffer ];
unsigned short int m_NextIB[ ObjMesh::MaxIndexBuffer ];
int m_NextVertexCount;
int m_NextIndexCount;
int m_NextFaceCount;
int m_iEdgeCount;
unsigned int m_EdgeConfiguration[ ObjMesh::MaxIndexBuffer ];
unsigned char m_EdgeUsage[ ObjMesh::MaxIndexBuffer ];
int MakeEdgeID( unsigned short VertexA, unsigned short VertexB );
unsigned short int m_EdgeID[ ObjMesh::MaxIndexBuffer ];
};
OpInfo m_OP;
public:
#ifdef EXTRACODE
bool LoadMesh(
const char* pcFileName,
int FloatBits,
bool bFlatten,
BinMesh& BM,
int& IndexBytes,
int& VertexBytes );
static float ObjMesh::RoundFloat( float f, int iBits );
static float m_fMaxRoundError;
#endif
bool LoadMesh( BinMesh* pBinMesh );
void GenerateNormals();
void CatmullClarkSubdivide();
void Extrude( float fExtend );
void SuperEllip( float fStrength );
void Bevel( float fExtend, float fMinAngle );
void UnIndex();
inline unsigned int GetVertexCount() const { return m_VertexCount; };
inline unsigned int GetIndexCount() const { return m_IndexCount; };
inline unsigned int GetFaceCount() const { return m_FaceCount; };
Vertex* GetVertexBuffer()
{
return m_VertexBuffer;
}
unsigned short int* GetIndexBuffer()
{
return m_IndexBuffer;
}
};
extern ObjMesh g_objMesh;
#endif

View File

@@ -0,0 +1,156 @@
#include "defines.h"
#include "PSSM.h"
#include "shader.h"
#include "globals.h"
#include "intrin.h"
void PSSM::Init()
{
m_iSplitCount = -1;
m_fRange = 0.0f;
}
void PSSM::UpdateSplits(const D3DXVECTOR3 &vLightDir, const D3DXMATRIX &mView, const D3DXMATRIX &mProj)
{
assert( m_iSplitCount >= 0 && m_iSplitCount <= MaxSplitCount );
assert( m_fRange >= 0.0f );
// Extract cam data
D3DXVECTOR3 vCamPos(
-(mView._11 * mView._41 + mView._12 * mView._42 + mView._13 * mView._43),
-(mView._21 * mView._41 + mView._22 * mView._42 + mView._23 * mView._43),
-(mView._31 * mView._41 + mView._32 * mView._42 + mView._33 * mView._43) );
D3DXVECTOR3 vCamRight(mView._11, mView._21, mView._31);
D3DXVECTOR3 vCamUp(mView._12, mView._22, mView._32);
D3DXVECTOR3 vCamLook(mView._13, mView._23, mView._33);
// Extract plane distances
float fNearPlane = mProj._43 / -mProj._33;
float fFarPlane = mProj._43 / (1.0f - mProj._33);
// Extract FOV
float fTanHalfFOVX = 1.0f / mProj._11;
float fTanHalfFOVY = 1.0f / mProj._22;
// Compute maximum shadow split clip plane
float fMaxClipPlane = max( fFarPlane,
max(2.0f * fTanHalfFOVX * fFarPlane, 2.0f * fTanHalfFOVY * fFarPlane) );
// Adjust range
if(fFarPlane - fNearPlane > m_fRange)
fFarPlane = fNearPlane + m_fRange;
// Compute frustum depth
float fFrustumDepth = fFarPlane - fNearPlane;
// Complete light vector set
D3DXVECTOR3 vLightUp(0.0f, 1.0f, 0.0f), vLightRight;
if(abs(D3DXVec3Dot(&vLightUp, &vLightDir)) > 0.95f)
vLightUp = D3DXVECTOR3(0.0f, 0.0f, 1.0f);
D3DXVec3Cross(&vLightRight, &vLightUp, &vLightDir);
D3DXVec3Normalize(&vLightRight, &vLightRight);
D3DXVec3Cross(&vLightUp, &vLightDir, &vLightRight);
D3DXVec3Normalize(&vLightUp, &vLightUp);
// Loop over splits
for(int iSplit = 0; iSplit < m_iSplitCount; iSplit++)
{
// Compute both uniform and logarithmic split distribution
float fUniformSplitNear = fNearPlane + fFrustumDepth * ((float)iSplit / m_iSplitCount);
float fUniformSplitFar = fNearPlane + fFrustumDepth * ((float)(iSplit + 1) / m_iSplitCount);
float fLogSplitNear = fNearPlane * mypow(fFarPlane / fNearPlane, (float)iSplit / m_iSplitCount);
float fLogSplitFar = fNearPlane * mypow(fFarPlane / fNearPlane, (float)(iSplit + 1) / m_iSplitCount);
// Take average of both distributions
float fSplitNear = (fUniformSplitNear + fLogSplitNear) / 2.0f;
float fSplitFar = (fUniformSplitFar + fLogSplitFar) / 2.0f;
// Center
D3DXVECTOR3 vSplitCenter = vCamPos + (fSplitNear + fSplitFar) / 2.0f * vCamLook;
// Compute split view matrix
D3DXMatrixIdentity(&m_ViewMatrices[iSplit]);
memcpy(&m_ViewMatrices[iSplit]._11, &vLightRight, sizeof(float) * 3);
memcpy(&m_ViewMatrices[iSplit]._21, &vLightUp, sizeof(float) * 3);
memcpy(&m_ViewMatrices[iSplit]._31, &vLightDir, sizeof(float) * 3);
D3DXMatrixTranspose(&m_ViewMatrices[iSplit], &m_ViewMatrices[iSplit]);
m_ViewMatrices[iSplit]._41 = -D3DXVec3Dot(&vSplitCenter, &vLightRight);
m_ViewMatrices[iSplit]._42 = -D3DXVec3Dot(&vSplitCenter, &vLightUp);
m_ViewMatrices[iSplit]._43 = -D3DXVec3Dot(&vSplitCenter, &vLightDir);
// Update split view
m_ViewPos[iSplit] = vSplitCenter;
m_ViewDir[iSplit] = vLightDir;
D3DXVECTOR3 splitCorners[8];
// Compute all eight frustum split corner points
ComputeCornerPoints(splitCorners, fSplitNear, fSplitFar, fTanHalfFOVX, fTanHalfFOVY,
vCamPos, vCamRight, vCamUp, vCamLook, 0.1f);
float fMinX = FLT_MAX, fMaxX = FLT_MIN;
float fMinY = FLT_MAX, fMaxY = FLT_MIN;
float fMinZ = FLT_MAX, fMaxZ = FLT_MIN;
// Loop over corner points
for(int i = 0; i < 8; i++)
{
// Transform corner to view space
D3DXVECTOR4 vViewSpaceCorner;
D3DXVec3Transform(&vViewSpaceCorner, &splitCorners[i], &m_ViewMatrices[iSplit]);
// Find min and max values
if(vViewSpaceCorner.x > fMaxX) fMaxX = vViewSpaceCorner.x;
if(vViewSpaceCorner.x < fMinX) fMinX = vViewSpaceCorner.x;
if(vViewSpaceCorner.y > fMaxY) fMaxY = vViewSpaceCorner.y;
if(vViewSpaceCorner.y < fMinY) fMinY = vViewSpaceCorner.y;
if(vViewSpaceCorner.z > fMaxZ) fMaxZ = vViewSpaceCorner.z;
if(vViewSpaceCorner.z < fMinZ) fMinZ = vViewSpaceCorner.z;
}
// Bias
fMinX -= 2.0f; fMinY -= 2.0f; fMinZ -= 2.0f;
fMaxX += 2.0f; fMaxY += 2.0f; fMaxZ += 2.0f;
// Compute split projection matrix
D3DXMatrixOrthoOffCenterLH(&m_ProjMatrices[iSplit],
fMinX, fMaxX,
fMinY, fMaxY,
fMinZ - fMaxClipPlane, fMaxZ + fMaxClipPlane);
}
}
void PSSM::ComputeCornerPoints(D3DXVECTOR3 *pCorners,
float fNear, float fFar, float fTanHalfFOVX, float fTanHalfFOVY,
const D3DXVECTOR3 &vCamPos, const D3DXVECTOR3 &vCamRight,
const D3DXVECTOR3 &vCamUp, const D3DXVECTOR3 &vCamLook,
float fOverlap)
{
float fNearHalfWidth = fTanHalfFOVX * fNear;
float fNearHalfHeight = fTanHalfFOVY * fNear;
float fFarHalfWidth = fTanHalfFOVX * fFar;
float fFarHalfHeight = fTanHalfFOVY * fFar;
D3DXVECTOR3 vNearCenter = vCamPos + fNear * vCamLook;
D3DXVECTOR3 vFarCenter = vCamPos + fFar * vCamLook;
// Compute eight frustum split corner points
pCorners[0] = vNearCenter + fNearHalfWidth * vCamRight + fNearHalfHeight * vCamUp;
pCorners[1] = vNearCenter + fNearHalfWidth * vCamRight - fNearHalfHeight * vCamUp;
pCorners[2] = vNearCenter - fNearHalfWidth * vCamRight + fNearHalfHeight * vCamUp;
pCorners[3] = vNearCenter - fNearHalfWidth * vCamRight - fNearHalfHeight * vCamUp;
pCorners[4] = vFarCenter + fFarHalfWidth * vCamRight + fFarHalfHeight * vCamUp;
pCorners[5] = vFarCenter + fFarHalfWidth * vCamRight - fFarHalfHeight * vCamUp;
pCorners[6] = vFarCenter - fFarHalfWidth * vCamRight + fFarHalfHeight * vCamUp;
pCorners[7] = vFarCenter - fFarHalfWidth * vCamRight - fFarHalfHeight * vCamUp;
D3DXVECTOR3 vCenter = (vNearCenter + vFarCenter) / 2.0f;
// Apply split overlap scaling
for(int i = 0; i < 8; i++)
pCorners[i] += (pCorners[i] - vCenter) * fOverlap;
}

View File

@@ -0,0 +1,63 @@
#pragma once
/***********************************************************************************/
/** \file PSSM.h
** \brief Header File zur Klasse PSSM
*************************************************************************************
** Autor: Christian Roesch
*************************************************************************************
** _tut nichts_
**
*//*********************************************************************************/
#ifndef _PSSM_H
#define _PSSM_H
// includes
#include <d3dx9.h>
#include <cassert>
// Klassen-Deklaration
extern IDirect3DDevice9* g_d3d_device;
/***********************************************************************************/
/** \brief PSSM _tut nichts_
*************************************************************************************
** Genau genommen _tut dies nichts_
**
*//*********************************************************************************/
class PSSM
{
public:
static const int MaxSplitCount = 16;
void Init();
void UpdateSplits(const D3DXVECTOR3 &vLightDir, const D3DXMATRIX &mView, const D3DXMATRIX &mProj);
int m_iSplitCount;
float m_fRange;
D3DXMATRIX m_ViewMatrices[MaxSplitCount];
D3DXMATRIX m_ProjMatrices[MaxSplitCount];
D3DXVECTOR3 m_ViewPos[MaxSplitCount];
D3DXVECTOR3 m_ViewDir[MaxSplitCount];
private:
void ComputeCornerPoints(D3DXVECTOR3 *pCorners,
float fNear, float fFar, float fFTanHalfFOVX, float fTanHalfFOVY,
const D3DXVECTOR3 &vCamPos, const D3DXVECTOR3 &vCamRight,
const D3DXVECTOR3 &vCamUp, const D3DXVECTOR3 &vCamLook,
float fOverlap);
};
#endif//_PSSM_H
class PSSM;
/************************************************************************************
** Ende der Datei: PSSM.h
************************************************************************************/

View File

@@ -0,0 +1,84 @@
#include "PointMapGenerator.h"
#include "globals.h"
int PointMapGenerator::GeneratePointMap(IDirect3DVertexBuffer9* vertexBuffer, IDirect3DIndexBuffer9* indexBuffer, int vertexCount, int indexCount, int vertexStride, int positionOffset, int normalOffset, float distanceFromVertex, D3DXVECTOR4* outPointMap, int takeEveryNtVertex)
{
char* vertexData;
PMG_INDEX_FORMAT* indexData;
vertexBuffer->Lock(0, 0, (void**)&vertexData, D3DLOCK_READONLY);
indexBuffer->Lock(0, 0, (void**)&indexData, D3DLOCK_READONLY);
int pointCount = GeneratePointMap(vertexData, indexData, vertexCount, indexCount, vertexStride, positionOffset, normalOffset, distanceFromVertex, outPointMap, takeEveryNtVertex);
vertexBuffer->Unlock();
indexBuffer->Unlock();
return pointCount;
}
int PointMapGenerator::GeneratePointMap(char* vertexData, PMG_INDEX_FORMAT* indexData, int vertexCount, int indexCount, int vertexStride, int positionOffset, int normalOffset, float distanceFromVertex, D3DXVECTOR4* outPointMap, int takeEveryNtVertex)
{
int pointCount = 0;
float maxY = 0;
float minY = 0;
for (int i = 0; i < indexCount; ++i)
{
// Assertion does not hold, so what?
if ( indexData[i] >= vertexCount )
continue;
assert ( indexData[i] < vertexCount );
D3DXVECTOR3* v = (D3DXVECTOR3*)&vertexData[indexData[i] * vertexStride + positionOffset];
if (i == 0 || maxY < v->y)
{
maxY = v->y;
}
if (i == 0 || minY > v->y)
{
minY = v->y;
}
}
for (int i = 0; i < indexCount; i += takeEveryNtVertex)
{
// Assertion does not hold, so what?
if ( indexData[i] >= vertexCount )
continue;
assert ( indexData[i] < vertexCount );
D3DXVECTOR3* v = (D3DXVECTOR3*)&vertexData[indexData[i] * vertexStride + positionOffset];
D3DXVECTOR3* n = (D3DXVECTOR3*)&vertexData[indexData[i] * vertexStride + normalOffset];
D3DXVECTOR3 result = (*v) + (*n) * distanceFromVertex * g_Random.genFloat();
outPointMap[pointCount++] = D3DXVECTOR4(
result.x,
result.y,
result.z,
((v->y - minY) / (maxY - minY)) * 0.2 + g_Random.genFloat(0.0f, 0.8f));
}
return pointCount;
}
void PointMapGenerator::FillPointMap(int pointMapIndex, int objectIndex, int fluidIndex, int takeEveryNtVertex)
{
int pointCount = GeneratePointMap(
g_Objects[ objectIndex ].GetVB(),
g_Objects[ objectIndex ].GetIB(),
g_Objects[ objectIndex ].GetVertCount(),
g_Objects[ objectIndex ].GetIndexCount(),
sizeof(Renderjob::SVertex),
0,
3 * sizeof(FLOAT),
g_PointMapDistance[pointMapIndex],
g_FluidPointMap[pointMapIndex],
takeEveryNtVertex);
assert( pointCount <= 100000 );
g_FluidParticleSystem[fluidIndex] = g_FluidContext.GenerateFluidParticleSystem(pointCount * 4);
}

View File

@@ -0,0 +1,15 @@
#pragma once
#include <d3d9.h>
#include <d3dx9.h>
#define PMG_INDEX_FORMAT short
class PointMapGenerator
{
public:
static int GeneratePointMap(IDirect3DVertexBuffer9* vertexBuffer, IDirect3DIndexBuffer9* indexBuffer, int vertexCount, int indexCount, int vertexStride, int positionOffset, int normalOffset, float distanceFromVertex, D3DXVECTOR4* outPointMap, int takeEveryNtVertex);
static int GeneratePointMap(char* vertexData, PMG_INDEX_FORMAT* indexData, int vertexCount, int indexCount, int vertexStride, int positionOffset, int normalOffset, float distanceFromVertex, D3DXVECTOR4* outPointMap, int takeEveryNtVertex);
static void FillPointMap(int pointMapIndex, int objectIndex, int fluidIndex, int takeEveryNtVertex );
};

View File

@@ -0,0 +1,70 @@
#pragma once
/***********************************************************************************/
/** \file Renderpipe.h
** \brief Header File zur Klasse Renderpipe
*************************************************************************************
** Autor: Christian Roesch
*************************************************************************************
** _tut nichts_
**
*//*********************************************************************************/
#ifndef _Renderpipe_H
#define _Renderpipe_H
// includes
#include <d3dx9.h>
#include <cassert>
// Klassen-Deklaration
extern IDirect3DDevice9* g_d3d_device;
/***********************************************************************************/
/** \brief Renderpipe _tut nichts_
*************************************************************************************
** Genau genommen _tut dies nichts_
**
*//*********************************************************************************/
class Renderpipe
{
public:
static void PrepareRenderTargets(UINT nScreenX, UINT nScreenY, UINT nShadowXY, UINT nEnvXY, UINT nEnvBlurXY,
D3DMULTISAMPLE_TYPE multiSampleType);
static void PrepareDefaultRenderStates(RenderTargetSurfaceIndices colorSurface = RTS_COLOR_MS,
RenderTargetSurfaceIndices depthSurface = RTS_DEFAULT_DS,
RenderTargetIndices linearDepthTexture = RT_DEPTH);
static void PrepareShadowRenderStates();
static void PreparePreRenderStates(RenderTargetSurfaceIndices colorSurface = RTS_DEPTH_MS,
RenderTargetSurfaceIndices depthSurface = RTS_DEFAULT_DS);
static void PrepareFullScreenQuadRenderStates(RenderTargetIndices linearDepthTexture = RT_DEPTH,
RenderTargetIndices colorTexture = RT_COLOR);
static void PrepareWithoutPostProcessing(RenderTargetSurfaceIndices colorSurface = RTS_COLOR_MS,
RenderTargetSurfaceIndices depthSurface = RTS_DEFAULT_DS);
static void SimpleRenderPass();
static void FullRenderPass();
static void CubeRenderPass();
static void CubeBlurPass();
static void RenderScene(const D3DXMATRIX &mView, const D3DXMATRIX &mProj,
const D3DXVECTOR3 &vCamPos, const D3DXVECTOR3 &vCamDir,
RenderTargetSurfaceIndices colorSurfaceMS, RenderTargetSurfaceIndices colorSurface,
RenderTargetSurfaceIndices linearDepthSurfaceMS, RenderTargetSurfaceIndices linearDepthSurface,
RenderTargetSurfaceIndices depthSurface, RenderTargetIndices linearDepthTexture);
static void RenderPostProcessing(bool bSubmerged, bool bOcean, bool bSSAO);
static void RenderReflection();
};
#endif//_Renderpipe_H
class Renderpipe;
/************************************************************************************
** Ende der Datei: Renderpipe.h
************************************************************************************/

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,310 @@
#include "defines.h"
#include "shader.h"
#include "globals.h"
D3DXMATRIX Shader::s_matVP;
void RenderLoading( int iPercent );
void Shader::Init()
{
m_pVSShader= NULL;
m_pPSShader= NULL;
#ifdef EXTRACODE
m_iRevision= 0;
#endif
// per default Texturen einfach lassen wie sie sind
m_iUsedTextureStageCount= -1;
for( int i= 0; i < m_iMaxTextureStageCount; ++i )
{
m_iTextureIndices[ i ]= TI_IgnoreSetting;
m_iTextureSettings[ i ]= TI_IgnoreSetting;
}
}
void Shader::DeInit()
{
Release();
}
void Shader::Release()
{
if( m_pVSShader != NULL )
{
m_pVSShader->Release();
m_pVSShader= NULL;
}
if( m_pPSShader != NULL )
{
m_pPSShader->Release();
m_pPSShader= NULL;
}
}
void Shader::CompileVS(const char* pShaderCode, const char* pEntryPoint, IDirect3DVertexShader9 **ppCachedShader )
{
#ifdef EXTRACODE
std::string strCurrentCode( pShaderCode );
if( strCurrentCode == m_strVSCode )
{
return;
}
m_strVSCode= strCurrentCode;
#endif
if(ppCachedShader && *ppCachedShader)
{
m_pVSShader = *ppCachedShader;
return;
}
ID3DXBuffer* tmp= NULL;
#if LAPTOPMODE == 1
Compile( pShaderCode, pEntryPoint, "vs_2_0", &tmp );
#else
Compile( pShaderCode, pEntryPoint, "vs_3_0", &tmp );
#endif
if( tmp == NULL )
{
return;
}
g_d3d_device->CreateVertexShader( (DWORD*)tmp->GetBufferPointer(), &m_pVSShader );
tmp->Release();
#ifdef EXTRACODE
m_iRevision++;
#endif
if(ppCachedShader)
*ppCachedShader = m_pVSShader;
RenderLoading( 1 );
}
void Shader::CompilePS(const char* pShaderCode, const char* pEntryPoint )
{
#ifdef EXTRACODE
std::string strCurrentCode( pShaderCode );
if( strCurrentCode == m_strPSCode )
{
return;
}
m_strPSCode= strCurrentCode;
#endif
ID3DXBuffer* tmp= NULL;
#if LAPTOPMODE == 1
Compile( pShaderCode, pEntryPoint, "ps_2_0", &tmp );
#else
Compile( pShaderCode, pEntryPoint, "ps_3_0", &tmp );
#endif
if( tmp == NULL )
{
return;
}
g_d3d_device->CreatePixelShader( (DWORD*)tmp->GetBufferPointer(), &m_pPSShader );
tmp->Release();
#ifdef EXTRACODE
m_iRevision++;
#endif
RenderLoading( 1 );
}
void Shader::Compile( const char* pShaderCode, const char* pEntryPoint, const char* ShaderModel, ID3DXBuffer** tmp )
{
int iLength= 0;
while(pShaderCode[ iLength ] != 0 )
{
iLength++;
}
#ifndef _DEBUG
D3DXCompileShader( pShaderCode, iLength, 0, 0, pEntryPoint, ShaderModel, D3DXSHADER_OPTIMIZATION_LEVEL3|D3DXSHADER_PREFER_FLOW_CONTROL, tmp, 0, 0 );
#else
ID3DXBuffer *errors;
if( D3DXCompileShader( pShaderCode, iLength, 0, 0, pEntryPoint, ShaderModel, D3DXSHADER_DEBUG*0+1*(D3DXSHADER_OPTIMIZATION_LEVEL3|D3DXSHADER_PREFER_FLOW_CONTROL), tmp, &errors, 0 ) <0 )
{
OutputDebugString( "Error in D3DXCompileShader:\n" );
OutputDebugString( pShaderCode );
OutputDebugString( "\n" );
OutputDebugString( (char*)errors->GetBufferPointer() );
errors->Release();
//assert( false );
return;
}
OutputDebugString( "Shader compiled.\n" );
#endif
}
void Shader::Activate()
{
g_d3d_device->SetPixelShader( m_pPSShader );
g_d3d_device->SetVertexShader( m_pVSShader );
for( int i= 0; i <= m_iUsedTextureStageCount; ++i )
{
if( m_iTextureIndices[ i ] != TI_IgnoreSetting )
{
g_d3d_device->SetTexture(
i,
g_pTextures[ m_iTextureIndices[ i ] ].GetPointer() );
g_d3d_device->SetSamplerState( i, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
g_d3d_device->SetSamplerState( i, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
g_d3d_device->SetSamplerState( i, D3DSAMP_ADDRESSW, D3DTADDRESS_WRAP );
if( m_iTextureSettings[ i ] == TI_CLAMP )
{
g_d3d_device->SetSamplerState( i, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP );
g_d3d_device->SetSamplerState( i, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP );
g_d3d_device->SetSamplerState( i, D3DSAMP_ADDRESSW, D3DTADDRESS_CLAMP );
}
}
}
}
void Shader::Deactivate()
{
g_d3d_device->SetPixelShader( NULL );
g_d3d_device->SetVertexShader( NULL );
}
void Shader::SetTransform(const D3DXMATRIX &mWorld, const D3DXMATRIX &mWorldInverse)
{
/***********************************************************************************/
// Konstanten fuer Shader setzen
D3DXMATRIX float4x4Mat;
//[VS] float4x4 matWVP : register(c0);
D3DXMatrixMultiply( &float4x4Mat, &mWorld, &s_matVP );
D3DXMatrixTranspose( &float4x4Mat, &float4x4Mat );
g_d3d_device->SetVertexShaderConstantF( 0, (float*)&float4x4Mat, 4 );
//[VS] float4x4 matWorld : register(c12);
D3DXMatrixTranspose( &float4x4Mat, &mWorld );
g_d3d_device->SetVertexShaderConstantF( 12, (float*)&float4x4Mat, 4 );
//[VS] float4x4 matWorldI : register(c16);
D3DXMatrixTranspose( &float4x4Mat, &mWorldInverse );
g_d3d_device->SetVertexShaderConstantF( 16, (float*)&float4x4Mat, 4 );
}
void Shader::SetCamera(const D3DXMATRIX &mView, const D3DXMATRIX &mProj,
const D3DXVECTOR3 &vCamPos, const D3DXVECTOR3 &vCamDir,
D3DXMATRIX *pMatVP)
{
/***********************************************************************************/
// Konstanten fuer Shader setzen
D3DXMATRIX float4x4Mat;
float float4Vec[4];
//[VS] float4x4 matWVP : register(c0);
D3DXMatrixMultiply( &s_matVP, &mView, &mProj );
D3DXMatrixTranspose( &float4x4Mat, &s_matVP );
g_d3d_device->SetVertexShaderConstantF( 0, (float*)&float4x4Mat, 4 );
// Output view projection matrix, if requested
if(pMatVP)
memcpy(pMatVP, &s_matVP, sizeof(D3DXMATRIX));
//[VS] float3x3 viewMatrixRotInv : register(c7);
g_d3d_device->SetVertexShaderConstantF( 7, (float*)&mView, 3 );
//[VS] float4 projScaleOffsetInv : register(c11);
float4Vec[0] = 1.0f / mProj._11;
float4Vec[1] = 1.0f / mProj._22;
float4Vec[2] = -(mProj._31 + mProj._41) * float4Vec[0];
float4Vec[3] = -(mProj._32 + mProj._42) * float4Vec[1];
g_d3d_device->SetVertexShaderConstantF( 11, float4Vec, 1 );
//[VS] float3 viewPos : register(c4);
//[PS] float3 viewPos : register(c2);
memcpy(float4Vec, &vCamPos, sizeof(float)*3);
g_d3d_device->SetVertexShaderConstantF( 4, float4Vec, 1 );
g_d3d_device->SetPixelShaderConstantF( 2, float4Vec, 1 );
//[VS] float3 viewDir : register(c10);
//[PS] float3 viewDir : register(c4);
memcpy(float4Vec, &vCamDir, sizeof(float)*3);
g_d3d_device->SetVertexShaderConstantF( 10, float4Vec, 1 );
g_d3d_device->SetPixelShaderConstantF( 4, float4Vec, 1 );
}
void Shader::SetResolution(int iResX, int iResY)
{
/***********************************************************************************/
// Konstanten fuer Shader setzen
float float4Vec[4];
//[VS] float2 res : register(c5);
//[PS] float2 res : register(c0);
float4Vec[0] = (float)iResX;
float4Vec[1] = (float)iResY;
float4Vec[2] = 1.f / float4Vec[0];
float4Vec[3] = 1.f / float4Vec[1];
g_d3d_device->SetVertexShaderConstantF( 5, float4Vec, 1 );
g_d3d_device->SetPixelShaderConstantF( 0, float4Vec, 1 );
}
void Shader::SetConstants(bool bHDR)
{
/***********************************************************************************/
// Konstanten fuer Shader setzen
float float4Vec[4];
// Set screen resoluton
SetResolution(d3dpp.BackBufferWidth,
d3dpp.BackBufferHeight);
//[VS] float3 lightDir : register(c6);
//[PS] float3 lightDir : register(c1);
memcpy(float4Vec, &g_LightDir, sizeof(float)*3);
g_d3d_device->SetVertexShaderConstantF( 6, float4Vec, 1 );
g_d3d_device->SetPixelShaderConstantF( 1, float4Vec, 1 );
//[PS] float demoTime : register(c3);
float4Vec[0]= 64.0f * (float)g_Camera.m_iDemoTime / (float)g_iCamTickFactor;
float4Vec[1]= g_Camera.m_fDOF * g_Camera.m_fDOF;
float4Vec[2]= g_fCamTime;//g_fClouds;
float4Vec[3]= g_fShaderBeat;//g_fPlasmaGrid;
g_d3d_device->SetPixelShaderConstantF( 3, float4Vec, 1 );
//[PS] float4 glow : register(c61);
{
float4Vec[0] = g_fGlow;
float4Vec[1] = g_fGlow;
float4Vec[2] = (g_Camera.m_iScene == g_CubeMapCamera.m_iScene) ? 1.0f : 0.0f;
float4Vec[3] = bHDR ? 1.0f : 0.0f;
g_d3d_device->SetPixelShaderConstantF( 61, float4Vec, 1 );
}
}
void Shader::SetTextureStageSettings(
int iTextureStage,
int iTextureIndex,
int iTextureSettings )
{
assert( iTextureStage < m_iMaxTextureStageCount );
if( iTextureStage > m_iUsedTextureStageCount )
{
m_iUsedTextureStageCount= iTextureStage;
}
m_iTextureIndices[ iTextureStage ]= iTextureIndex;
m_iTextureSettings[ iTextureStage ]= iTextureSettings;
}

View File

View File

@@ -0,0 +1,161 @@
#pragma once
#include "globals.h"
#include "shader.h"
// --> Neuen Shader hinzufuegen:
//
// in globals.h und globals.cpp ein neues Char Array fuer den Quellcode des Shader anlegen
// in globals.h das Enum ShaderIndices erweitern
// eine Datei im cfg Verzeichnis anlegen, die diesen Shader enthaelt
// in ConfigFiles.cpp die Funktion ReadShaders() erweitern, damit die Datei in das Array eingelesen wird
// den Shader in PrepareShaders compilieren
void RenderLoading( int iPercent );
void PrepareShaders()
{
IDirect3DVertexShader9* pVSGeneral = NULL;
IDirect3DVertexShader9* pVSFSQuad = NULL;
#ifdef EXTRACODE
OutputDebugString( "Creating shaders: \n" );
DWORD dwTicks = GetTickCount();
#endif
//Postprocessing Zeug
g_Shaders[ PreDepth ].CompileVS(g_ShaderVSGeneral, "vs_main", &pVSGeneral );
g_Shaders[ PreDepth ].CompilePS(g_ShaderPSDepth, "ps_main" );
g_Shaders[ PSSM_Proj ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ PSSM_Proj ].CompilePS(g_ShaderPSPSSM, "ps_main" );
g_Shaders[ SSAO ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ SSAO ].CompilePS(g_ShaderPSAmbOcc, "ps_main" );
g_Shaders[ SSAO_BlurH ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ SSAO_BlurH ].CompilePS(g_ShaderPSAmbOcc, "ps_blur_hor" );
g_Shaders[ SSAO_BlurV ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ SSAO_BlurV ].CompilePS(g_ShaderPSAmbOcc, "ps_blur_ver" );
g_Shaders[ DOF_Intensity ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ DOF_Intensity ].CompilePS(g_ShaderPSDOF, "ps_blur_intensity" );
g_Shaders[ DOF ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ DOF ].CompilePS(g_ShaderPSDOF, "ps_main" );
g_Shaders[ BlurBilH ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ BlurBilH ].CompilePS(g_ShaderPSBlur, "ps_blur_bil_hor" );
g_Shaders[ BlurBilV ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ BlurBilV ].CompilePS(g_ShaderPSBlur, "ps_blur_bil_ver" );
g_Shaders[ Underwater ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ Underwater ].CompilePS(g_ShaderPSRay, "ps_underwater" );
g_Shaders[ Underwater ].SetTextureStageSettings( 3, TI_Wave );
g_Shaders[ Underwater_Filter ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ Underwater_Filter ].CompilePS(g_ShaderPSRay, "ps_underwater_filter" );
g_Shaders[ Underwater_Filter ].SetTextureStageSettings( 3, TI_Wave );
g_Shaders[ Ray_Mask ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ Ray_Mask ].CompilePS(g_ShaderPSRay, "ps_ray_mask" );
g_Shaders[ Ray_Extrude ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ Ray_Extrude ].CompilePS(g_ShaderPSRay, "ps_ray_extrude" );
g_Shaders[ Extract_InvAlpha ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ Extract_InvAlpha ].CompilePS(g_ShaderPSBlur, "ps_extract_inv_alpha" );
g_Shaders[ BlurH ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ BlurH ].CompilePS(g_ShaderPSBlur, "ps_blur_hor" );
g_Shaders[ BlurV ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ BlurV ].CompilePS(g_ShaderPSBlur, "ps_blur_ver" );
g_Shaders[ Crystal ].CompileVS(g_ShaderVSGeneral, "vs_main", &pVSGeneral );
g_Shaders[ Crystal ].CompilePS(g_ShaderPSCrystal, "ps_main" );
g_Shaders[ Phong ].CompileVS(g_ShaderVSGeneral, "vs_main", &pVSGeneral );
g_Shaders[ Phong ].CompilePS(g_ShaderPSPhong, "ps_main" );
g_Shaders[ Sky ].CompileVS(g_ShaderVSSky, "vs_main" );
g_Shaders[ Sky ].CompilePS(g_ShaderPSSky, "ps_sky" );
g_Shaders[ Sky ].SetTextureStageSettings( 0, TI_RandomCube );
g_Shaders[ CaveSky ].CompileVS(g_ShaderVSSky, "vs_main" );
g_Shaders[ CaveSky ].CompilePS(g_ShaderPSSky, "ps_cave_sky" );
g_Shaders[ CaveSky ].SetTextureStageSettings( 0, TI_RandomCube );
g_Shaders[ EnvSky ].CompileVS(g_ShaderVSSky, "vs_main" );
g_Shaders[ EnvSky ].CompilePS(g_ShaderPSSky, "ps_env" );
g_Shaders[ Ocean ].CompileVS(g_ShaderVSOcean, "vs_main" );
g_Shaders[ Ocean ].CompilePS(g_ShaderPSOcean, "ps_main" );
g_Shaders[ Ocean ].SetTextureStageSettings( 0, TI_Wave );
g_Shaders[ Terrain ].CompileVS(g_ShaderVSGeneral, "vs_main", &pVSGeneral );
g_Shaders[ Terrain ].CompilePS(g_ShaderPSTerrain, "ps_terrain" );
g_Shaders[ Terrain ].SetTextureStageSettings( 0, TI_Wave );
g_Shaders[ Terrain ].SetTextureStageSettings( 1, TI_RandomCube );
g_Shaders[ Cave ].CompileVS(g_ShaderVSGeneral, "vs_main", &pVSGeneral );
g_Shaders[ Cave ].CompilePS(g_ShaderPSTerrain, "ps_cave" );
g_Shaders[ Cave ].SetTextureStageSettings( 0, TI_Wave );
g_Shaders[ Cave ].SetTextureStageSettings( 1, TI_RandomCube );
g_Shaders[ CaveGround ].CompileVS(g_ShaderVSGeneral, "vs_main", &pVSGeneral );
g_Shaders[ CaveGround ].CompilePS(g_ShaderPSTerrain, "ps_cave_ground" );
g_Shaders[ CaveGround ].SetTextureStageSettings( 0, TI_Wave );
g_Shaders[ CaveGround ].SetTextureStageSettings( 1, TI_RandomCube );
g_Shaders[ FluidDepth ].CompileVS(g_ShaderVSFluid, "vsDepth" );
g_Shaders[ FluidDepth ].CompilePS(g_ShaderPSFluid, "psDepth" );
g_Shaders[ FluidPosition ].CompileVS(g_ShaderVSFluid, "vsDeferred" );
g_Shaders[ FluidPosition ].CompilePS(g_ShaderPSFluid, "psPosition" );
g_Shaders[ FluidNormal ].CompileVS(g_ShaderVSFluid, "vsDeferred" );
g_Shaders[ FluidNormal ].CompilePS(g_ShaderPSFluid, "psNormal" );
g_Shaders[ FluidBlur ].CompileVS(g_ShaderVSFluid, "vsCompose" );
g_Shaders[ FluidBlur ].CompilePS(g_ShaderPSFluid, "psBlur" );
g_Shaders[ FluidCompose ].CompileVS(g_ShaderVSFluid, "vsCompose" );
g_Shaders[ FluidCompose ].CompilePS(g_ShaderPSFluid, "psCompose" );
g_Shaders[ TerrainDepth ].CompileVS(g_ShaderVSGeneral, "vs_main", &pVSGeneral );
g_Shaders[ TerrainDepth ].CompilePS(g_ShaderPSDepth, "ps_main" );
g_Shaders[ TexGen_Perlin ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ TexGen_Perlin ].CompilePS(g_ShaderPSTexGen, "ps_perlin" );
g_Shaders[ TexGen_Wave ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ TexGen_Wave ].CompilePS(g_ShaderPSTexGen, "ps_wave" );
g_Shaders[ TexGen_Normal ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ TexGen_Normal ].CompilePS(g_ShaderPSTexGen, "ps_normal" );
g_Shaders[ TexGen_CubeBlur ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ TexGen_CubeBlur ].CompilePS(g_ShaderPSTexGen, "ps_cube_blur" );
g_Shaders[ Overlay_Logo ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ Overlay_Logo ].CompilePS(g_ShaderPSTexGen, "ps_logo" );
g_Shaders[ Overlay_Fade ].CompileVS(g_ShaderVSFSQuad, "vs_main", &pVSFSQuad );
g_Shaders[ Overlay_Fade ].CompilePS(g_ShaderPSTexGen, "ps_fade" );
g_Shaders[ SkyDepth ].CompileVS(g_ShaderVSSky, "vs_main" );
g_Shaders[ SkyDepth ].CompilePS(g_ShaderPSDepth, "ps_main" );
g_Shaders[ Text ].CompileVS(g_ShaderVSGeneral, "vs_main", &pVSGeneral );
g_Shaders[ Text ].CompilePS(g_ShaderPSText, "ps_main" );
g_Shaders[ Text ].SetTextureStageSettings( 0, TI_Wave );
g_Shaders[ Text ].SetTextureStageSettings( 1, TI_RandomCube );
g_Shaders[ EnvLit ].CompileVS(g_ShaderVSGeneral, "vs_main", &pVSGeneral );
g_Shaders[ EnvLit ].CompilePS(g_ShaderPSEnvLit, "ps_main" );
#ifdef EXTRACODE
char cTime[256];
dwTicks = GetTickCount() - dwTicks;
sprintf_s( cTime, "Shader Compilation Time: %d \n", dwTicks );
OutputDebugString( cTime );
#endif
}

View File

@@ -0,0 +1,213 @@
/***********************************************************************************/
/** \file StringHelper.cpp
** \brief Implementation zur Klasse StringHelper
*************************************************************************************
** Autor: Christian Roesch
*************************************************************************************
** -tut nichts-
**
*//*********************************************************************************/
// includes
#include "StringHelper.h"
#include <cstdio>
std::vector< char > FrameWork::StringHelper::m_SpaceTab;
FrameWork::StringHelper::StringHelperPreparer FrameWork::StringHelper::m_shpDummy;
// Methoden-Definitionen
namespace FrameWork
{
/***********************************************************************************/
/** Schneidet einen String an den Separatoren auseinander. Der vorderste Teil wird
*** abgeschnitten, falls der Separator gefunden wird. Der Eingabestring wird auf den
*** Teil hinter dem Seperator gestutzt
***
*** \param strInput [in\out] Ursprungsstring
*** \param strSeperator Seperator
*** \param strOutput der vorne abgeschnittene Teil
***
*** \return true, wenn Seperator gefunden
*//*********************************************************************************/
bool StringHelper::splitAt(
std::string& strInput,
const std::string& strSeperator,
std::string& strOutput )
{
size_t tStart= strInput.find( strSeperator );
if( tStart == std::string::npos )
{
strOutput= strInput;
return false;
}
strOutput= strInput.substr( 0, tStart );
strInput= strInput.substr( tStart + strSeperator.size() );
return true;
}
/***********************************************************************************/
/** Schneidet einen String an den Separatoren auseinander. Der vorderste Teil wird
*** abgeschnitten, falls der Separator gefunden wird. Der Eingabestring wird auf den
*** Teil hinter dem Seperator gestutzt
***
*** \param strInput [in\out] Ursprungsstring
*** \param strSeperator Seperator
*** \param strOutput der vorne abgeschnittene Teil
***
*** \return true, strInput nicht leer und strOutput enthaelt Daten
*** false, strInput leer und strOutput keine enthaelt Daten
*//*********************************************************************************/
bool StringHelper::splitLoop(
std::string& strInput,
const std::string& strSeperator,
std::string& strOutput )
{
if( strInput.empty() )
{
return false;
}
size_t tStart= strInput.find( strSeperator );
if( tStart == std::string::npos )
{
strOutput= strInput;
strInput= "";
}
else
{
strOutput= strInput.substr( 0, tStart );
strInput= strInput.substr( tStart + strSeperator.size() );
}
return true;
}
bool StringHelper::tokenize( std::string& strInput,
const std::string& strSeperator,
std::vector< std::string >& vecOutput )
{
std::string strCommand;
while( FrameWork::StringHelper::splitAt( strInput, strSeperator, strCommand ) )
{
vecOutput.push_back( strCommand );
}
vecOutput.push_back( strInput );
return true;
}
bool StringHelper::trimFront( std::string& strData, char cWhiteSpace )
{
int i= 0;
if( (int)strData.size() == 0 )
{
return false;
}
while( strData[ i ] == cWhiteSpace )
{
i++;
}
if( i > 0 )
{
strData= strData.substr( i );
return true;
}
return false;
}
bool StringHelper::trimBack( std::string& strData, char cWhiteSpace )
{
int i= (int)strData.size() - 1;
if( i == -1 )
{
return false;
}
while( strData[ i ] == cWhiteSpace )
{
i--;
}
if( i < (int)strData.size() - 1 )
{
strData= strData.substr( 0, i + 1 );
return true;
}
return false;
}
bool StringHelper::trim( std::string& strData, char cWhiteSpace )
{
bool bTrimmed= trimFront( strData, cWhiteSpace );
bTrimmed|= trimBack( strData, cWhiteSpace );
return bTrimmed;
}
bool StringHelper::trimFront( std::string& strData, std::vector< char >& WhiteSpaces )
{
bool bTrimmed;
do
{
bTrimmed= false;
for( int i= 0; i < (int)WhiteSpaces.size(); ++i )
{
bTrimmed|= trimFront( strData, WhiteSpaces[ i ] );
}
} while( bTrimmed );
return bTrimmed;
}
bool StringHelper::trimBack( std::string& strData, std::vector< char >& WhiteSpaces )
{
bool bTrimmed;
do
{
bTrimmed= false;
for( int i= 0; i < (int)WhiteSpaces.size(); ++i )
{
bTrimmed|= trimBack( strData, WhiteSpaces[ i ] );
}
} while( bTrimmed );
return bTrimmed;
}
bool StringHelper::trim( std::string& strData, std::vector< char >& WhiteSpaces )
{
bool bTrimmed= trimFront( strData, WhiteSpaces );
bTrimmed|= trimBack( strData, WhiteSpaces );
return bTrimmed;
}
std::vector< char >& StringHelper::getSpaceTab()
{
return m_SpaceTab;
}
void StringHelper::toUpper( std::string& strData )
{
for( int i= 0; i < (int)strData.size(); ++i )
{
strData[ i ]= toupper( strData[ i ] );
}
}
void StringHelper::toLower( std::string& strData )
{
for( int i= 0; i < (int)strData.size(); ++i )
{
strData[ i ]= tolower( strData[ i ] );
}
}
}
/************************************************************************************
** Ende der Datei: StringHelper.cpp
************************************************************************************/

View File

@@ -0,0 +1,100 @@
/***********************************************************************************/
/** \file StringHelper.h
** \brief Header File zur Klasse StringHelper
*************************************************************************************
** Autor: Christian Roesch
*************************************************************************************
** _tut nichts_
**
*//*********************************************************************************/
#ifndef _StringHelper_H
#define _StringHelper_H
// includes
#include <string>
#include <vector>
// Klassen-Deklaration
namespace FrameWork
{
/***********************************************************************************/
/** \brief StringHelper _tut nichts_
*************************************************************************************
** Genau genommen _tut dies nichts_
**
*//*********************************************************************************/
class StringHelper
{
public:
static bool splitAt(
std::string& strInput,
const std::string& strSeperator,
std::string& strOutput );
static bool splitLoop(
std::string& strInput,
const std::string& strSeperator,
std::string& strOutput );
static bool tokenize( std::string& strInput,
const std::string& strSeperator,
std::vector< std::string >& vecOutput );
static bool trim(
std::string& strData,
std::vector< char >& WhiteSpaces );
static bool trim(
std::string& strData,
char cWhiteSpace );
static bool trimFront(
std::string& strData,
std::vector< char >& WhiteSpaces );
static bool trimFront(
std::string& strData,
char cWhiteSpace );
static bool trimBack(
std::string& strData,
std::vector< char >& WhiteSpaces );
static bool trimBack(
std::string& strData,
char cWhiteSpace );
static void toUpper( std::string& strData );
static void toLower( std::string& strData );
struct StringHelperPreparer
{
StringHelperPreparer()
{
StringHelper::m_SpaceTab.push_back( ' ' );
StringHelper::m_SpaceTab.push_back( '\t' );
}
};
static std::vector< char >& getSpaceTab();
protected:
private:
static StringHelperPreparer m_shpDummy;
static std::vector< char > m_SpaceTab;
};
}
#endif//_StringHelper_H
class FrameWork::StringHelper;
/************************************************************************************
** Ende der Datei: StringHelper.h
************************************************************************************/

View File

@@ -0,0 +1,32 @@
#pragma once
struct STargetValue
{
float m_fValue;
float m_fTarget;
float m_fSpeed;
float m_fAcceleration;
float m_fFriction;
STargetValue
( float fValue,
float fTarget,
float fSpeed,
float fAcceleration,
float fFriction )
{
m_fValue= fValue;
m_fTarget= fTarget;
m_fSpeed= fSpeed;
m_fAcceleration= fAcceleration;
m_fFriction= fFriction;
}
void timeStep()
{
m_fValue+= m_fSpeed;
float fDist= m_fTarget - m_fValue;
m_fSpeed+= fDist * m_fAcceleration;
m_fSpeed*= m_fFriction;
}
};

View File

@@ -0,0 +1,910 @@
#include "TerrainGrid.h"
#include "tweak/main.txt"
#include "globals.h"
#include <d3dx9.h>
#include <cassert>
#include "intrin.h"
void RenderLoading( int iPercent );
static const unsigned short edgeTable[256] =
{
0x000, 0x109, 0x203, 0x30a, 0x406, 0x50f, 0x605, 0x70c,
0x80c, 0x905, 0xa0f, 0xb06, 0xc0a, 0xd03, 0xe09, 0xf00,
0x190, 0x99 , 0x393, 0x29a, 0x596, 0x49f, 0x795, 0x69c,
0x99c, 0x895, 0xb9f, 0xa96, 0xd9a, 0xc93, 0xf99, 0xe90,
0x230, 0x339, 0x33 , 0x13a, 0x636, 0x73f, 0x435, 0x53c,
0xa3c, 0xb35, 0x83f, 0x936, 0xe3a, 0xf33, 0xc39, 0xd30,
0x3a0, 0x2a9, 0x1a3, 0xaa , 0x7a6, 0x6af, 0x5a5, 0x4ac,
0xbac, 0xaa5, 0x9af, 0x8a6, 0xfaa, 0xea3, 0xda9, 0xca0,
0x460, 0x569, 0x663, 0x76a, 0x66 , 0x16f, 0x265, 0x36c,
0xc6c, 0xd65, 0xe6f, 0xf66, 0x86a, 0x963, 0xa69, 0xb60,
0x5f0, 0x4f9, 0x7f3, 0x6fa, 0x1f6, 0xff , 0x3f5, 0x2fc,
0xdfc, 0xcf5, 0xfff, 0xef6, 0x9fa, 0x8f3, 0xbf9, 0xaf0,
0x650, 0x759, 0x453, 0x55a, 0x256, 0x35f, 0x55 , 0x15c,
0xe5c, 0xf55, 0xc5f, 0xd56, 0xa5a, 0xb53, 0x859, 0x950,
0x7c0, 0x6c9, 0x5c3, 0x4ca, 0x3c6, 0x2cf, 0x1c5, 0xcc ,
0xfcc, 0xec5, 0xdcf, 0xcc6, 0xbca, 0xac3, 0x9c9, 0x8c0,
0x8c0, 0x9c9, 0xac3, 0xbca, 0xcc6, 0xdcf, 0xec5, 0xfcc,
0xcc , 0x1c5, 0x2cf, 0x3c6, 0x4ca, 0x5c3, 0x6c9, 0x7c0,
0x950, 0x859, 0xb53, 0xa5a, 0xd56, 0xc5f, 0xf55, 0xe5c,
0x15c, 0x55 , 0x35f, 0x256, 0x55a, 0x453, 0x759, 0x650,
0xaf0, 0xbf9, 0x8f3, 0x9fa, 0xef6, 0xfff, 0xcf5, 0xdfc,
0x2fc, 0x3f5, 0xff , 0x1f6, 0x6fa, 0x7f3, 0x4f9, 0x5f0,
0xb60, 0xa69, 0x963, 0x86a, 0xf66, 0xe6f, 0xd65, 0xc6c,
0x36c, 0x265, 0x16f, 0x66 , 0x76a, 0x663, 0x569, 0x460,
0xca0, 0xda9, 0xea3, 0xfaa, 0x8a6, 0x9af, 0xaa5, 0xbac,
0x4ac, 0x5a5, 0x6af, 0x7a6, 0xaa , 0x1a3, 0x2a9, 0x3a0,
0xd30, 0xc39, 0xf33, 0xe3a, 0x936, 0x83f, 0xb35, 0xa3c,
0x53c, 0x435, 0x73f, 0x636, 0x13a, 0x33 , 0x339, 0x230,
0xe90, 0xf99, 0xc93, 0xd9a, 0xa96, 0xb9f, 0x895, 0x99c,
0x69c, 0x795, 0x49f, 0x596, 0x29a, 0x393, 0x99 , 0x190,
0xf00, 0xe09, 0xd03, 0xc0a, 0xb06, 0xa0f, 0x905, 0x80c,
0x70c, 0x605, 0x50f, 0x406, 0x30a, 0x203, 0x109, 0x000
};
static const char triTable[256][16] =
{
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 8, 3, 9, 8, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 2, 10, 0, 2, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 8, 3, 2, 10, 8, 10, 9, 8, -1, -1, -1, -1, -1, -1, -1},
{3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 11, 2, 8, 11, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 9, 0, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 11, 2, 1, 9, 11, 9, 8, 11, -1, -1, -1, -1, -1, -1, -1},
{3, 10, 1, 11, 10, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 10, 1, 0, 8, 10, 8, 11, 10, -1, -1, -1, -1, -1, -1, -1},
{3, 9, 0, 3, 11, 9, 11, 10, 9, -1, -1, -1, -1, -1, -1, -1},
{9, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 3, 0, 7, 3, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 1, 9, 4, 7, 1, 7, 3, 1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 4, 7, 3, 0, 4, 1, 2, 10, -1, -1, -1, -1, -1, -1, -1},
{9, 2, 10, 9, 0, 2, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},
{2, 10, 9, 2, 9, 7, 2, 7, 3, 7, 9, 4, -1, -1, -1, -1},
{8, 4, 7, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 4, 7, 11, 2, 4, 2, 0, 4, -1, -1, -1, -1, -1, -1, -1},
{9, 0, 1, 8, 4, 7, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},
{4, 7, 11, 9, 4, 11, 9, 11, 2, 9, 2, 1, -1, -1, -1, -1},
{3, 10, 1, 3, 11, 10, 7, 8, 4, -1, -1, -1, -1, -1, -1, -1},
{1, 11, 10, 1, 4, 11, 1, 0, 4, 7, 11, 4, -1, -1, -1, -1},
{4, 7, 8, 9, 0, 11, 9, 11, 10, 11, 0, 3, -1, -1, -1, -1},
{4, 7, 11, 4, 11, 9, 9, 11, 10, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 4, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 5, 4, 1, 5, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 5, 4, 8, 3, 5, 3, 1, 5, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 8, 1, 2, 10, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},
{5, 2, 10, 5, 4, 2, 4, 0, 2, -1, -1, -1, -1, -1, -1, -1},
{2, 10, 5, 3, 2, 5, 3, 5, 4, 3, 4, 8, -1, -1, -1, -1},
{9, 5, 4, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 11, 2, 0, 8, 11, 4, 9, 5, -1, -1, -1, -1, -1, -1, -1},
{0, 5, 4, 0, 1, 5, 2, 3, 11, -1, -1, -1, -1, -1, -1, -1},
{2, 1, 5, 2, 5, 8, 2, 8, 11, 4, 8, 5, -1, -1, -1, -1},
{10, 3, 11, 10, 1, 3, 9, 5, 4, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 5, 0, 8, 1, 8, 10, 1, 8, 11, 10, -1, -1, -1, -1},
{5, 4, 0, 5, 0, 11, 5, 11, 10, 11, 0, 3, -1, -1, -1, -1},
{5, 4, 8, 5, 8, 10, 10, 8, 11, -1, -1, -1, -1, -1, -1, -1},
{9, 7, 8, 5, 7, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 3, 0, 9, 5, 3, 5, 7, 3, -1, -1, -1, -1, -1, -1, -1},
{0, 7, 8, 0, 1, 7, 1, 5, 7, -1, -1, -1, -1, -1, -1, -1},
{1, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 7, 8, 9, 5, 7, 10, 1, 2, -1, -1, -1, -1, -1, -1, -1},
{10, 1, 2, 9, 5, 0, 5, 3, 0, 5, 7, 3, -1, -1, -1, -1},
{8, 0, 2, 8, 2, 5, 8, 5, 7, 10, 5, 2, -1, -1, -1, -1},
{2, 10, 5, 2, 5, 3, 3, 5, 7, -1, -1, -1, -1, -1, -1, -1},
{7, 9, 5, 7, 8, 9, 3, 11, 2, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 7, 9, 7, 2, 9, 2, 0, 2, 7, 11, -1, -1, -1, -1},
{2, 3, 11, 0, 1, 8, 1, 7, 8, 1, 5, 7, -1, -1, -1, -1},
{11, 2, 1, 11, 1, 7, 7, 1, 5, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 8, 8, 5, 7, 10, 1, 3, 10, 3, 11, -1, -1, -1, -1},
{5, 7, 0, 5, 0, 9, 7, 11, 0, 1, 0, 10, 11, 10, 0, -1},
{11, 10, 0, 11, 0, 3, 10, 5, 0, 8, 0, 7, 5, 7, 0, -1},
{11, 10, 5, 7, 11, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 0, 1, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 8, 3, 1, 9, 8, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},
{1, 6, 5, 2, 6, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 6, 5, 1, 2, 6, 3, 0, 8, -1, -1, -1, -1, -1, -1, -1},
{9, 6, 5, 9, 0, 6, 0, 2, 6, -1, -1, -1, -1, -1, -1, -1},
{5, 9, 8, 5, 8, 2, 5, 2, 6, 3, 2, 8, -1, -1, -1, -1},
{2, 3, 11, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 0, 8, 11, 2, 0, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1, -1, -1, -1},
{5, 10, 6, 1, 9, 2, 9, 11, 2, 9, 8, 11, -1, -1, -1, -1},
{6, 3, 11, 6, 5, 3, 5, 1, 3, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 11, 0, 11, 5, 0, 5, 1, 5, 11, 6, -1, -1, -1, -1},
{3, 11, 6, 0, 3, 6, 0, 6, 5, 0, 5, 9, -1, -1, -1, -1},
{6, 5, 9, 6, 9, 11, 11, 9, 8, -1, -1, -1, -1, -1, -1, -1},
{5, 10, 6, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 3, 0, 4, 7, 3, 6, 5, 10, -1, -1, -1, -1, -1, -1, -1},
{1, 9, 0, 5, 10, 6, 8, 4, 7, -1, -1, -1, -1, -1, -1, -1},
{10, 6, 5, 1, 9, 7, 1, 7, 3, 7, 9, 4, -1, -1, -1, -1},
{6, 1, 2, 6, 5, 1, 4, 7, 8, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 5, 5, 2, 6, 3, 0, 4, 3, 4, 7, -1, -1, -1, -1},
{8, 4, 7, 9, 0, 5, 0, 6, 5, 0, 2, 6, -1, -1, -1, -1},
{7, 3, 9, 7, 9, 4, 3, 2, 9, 5, 9, 6, 2, 6, 9, -1},
{3, 11, 2, 7, 8, 4, 10, 6, 5, -1, -1, -1, -1, -1, -1, -1},
{5, 10, 6, 4, 7, 2, 4, 2, 0, 2, 7, 11, -1, -1, -1, -1},
{0, 1, 9, 4, 7, 8, 2, 3, 11, 5, 10, 6, -1, -1, -1, -1},
{9, 2, 1, 9, 11, 2, 9, 4, 11, 7, 11, 4, 5, 10, 6, -1},
{8, 4, 7, 3, 11, 5, 3, 5, 1, 5, 11, 6, -1, -1, -1, -1},
{5, 1, 11, 5, 11, 6, 1, 0, 11, 7, 11, 4, 0, 4, 11, -1},
{0, 5, 9, 0, 6, 5, 0, 3, 6, 11, 6, 3, 8, 4, 7, -1},
{6, 5, 9, 6, 9, 11, 4, 7, 9, 7, 11, 9, -1, -1, -1, -1},
{10, 4, 9, 6, 4, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 10, 6, 4, 9, 10, 0, 8, 3, -1, -1, -1, -1, -1, -1, -1},
{10, 0, 1, 10, 6, 0, 6, 4, 0, -1, -1, -1, -1, -1, -1, -1},
{8, 3, 1, 8, 1, 6, 8, 6, 4, 6, 1, 10, -1, -1, -1, -1},
{1, 4, 9, 1, 2, 4, 2, 6, 4, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 8, 1, 2, 9, 2, 4, 9, 2, 6, 4, -1, -1, -1, -1},
{0, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 3, 2, 8, 2, 4, 4, 2, 6, -1, -1, -1, -1, -1, -1, -1},
{10, 4, 9, 10, 6, 4, 11, 2, 3, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 2, 2, 8, 11, 4, 9, 10, 4, 10, 6, -1, -1, -1, -1},
{3, 11, 2, 0, 1, 6, 0, 6, 4, 6, 1, 10, -1, -1, -1, -1},
{6, 4, 1, 6, 1, 10, 4, 8, 1, 2, 1, 11, 8, 11, 1, -1},
{9, 6, 4, 9, 3, 6, 9, 1, 3, 11, 6, 3, -1, -1, -1, -1},
{8, 11, 1, 8, 1, 0, 11, 6, 1, 9, 1, 4, 6, 4, 1, -1},
{3, 11, 6, 3, 6, 0, 0, 6, 4, -1, -1, -1, -1, -1, -1, -1},
{6, 4, 8, 11, 6, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 10, 6, 7, 8, 10, 8, 9, 10, -1, -1, -1, -1, -1, -1, -1},
{0, 7, 3, 0, 10, 7, 0, 9, 10, 6, 7, 10, -1, -1, -1, -1},
{10, 6, 7, 1, 10, 7, 1, 7, 8, 1, 8, 0, -1, -1, -1, -1},
{10, 6, 7, 10, 7, 1, 1, 7, 3, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 6, 1, 6, 8, 1, 8, 9, 8, 6, 7, -1, -1, -1, -1},
{2, 6, 9, 2, 9, 1, 6, 7, 9, 0, 9, 3, 7, 3, 9, -1},
{7, 8, 0, 7, 0, 6, 6, 0, 2, -1, -1, -1, -1, -1, -1, -1},
{7, 3, 2, 6, 7, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 3, 11, 10, 6, 8, 10, 8, 9, 8, 6, 7, -1, -1, -1, -1},
{2, 0, 7, 2, 7, 11, 0, 9, 7, 6, 7, 10, 9, 10, 7, -1},
{1, 8, 0, 1, 7, 8, 1, 10, 7, 6, 7, 10, 2, 3, 11, -1},
{11, 2, 1, 11, 1, 7, 10, 6, 1, 6, 7, 1, -1, -1, -1, -1},
{8, 9, 6, 8, 6, 7, 9, 1, 6, 11, 6, 3, 1, 3, 6, -1},
{0, 9, 1, 11, 6, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 8, 0, 7, 0, 6, 3, 11, 0, 11, 6, 0, -1, -1, -1, -1},
{7, 11, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 8, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 9, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 1, 9, 8, 3, 1, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},
{10, 1, 2, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 3, 0, 8, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},
{2, 9, 0, 2, 10, 9, 6, 11, 7, -1, -1, -1, -1, -1, -1, -1},
{6, 11, 7, 2, 10, 3, 10, 8, 3, 10, 9, 8, -1, -1, -1, -1},
{7, 2, 3, 6, 2, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{7, 0, 8, 7, 6, 0, 6, 2, 0, -1, -1, -1, -1, -1, -1, -1},
{2, 7, 6, 2, 3, 7, 0, 1, 9, -1, -1, -1, -1, -1, -1, -1},
{1, 6, 2, 1, 8, 6, 1, 9, 8, 8, 7, 6, -1, -1, -1, -1},
{10, 7, 6, 10, 1, 7, 1, 3, 7, -1, -1, -1, -1, -1, -1, -1},
{10, 7, 6, 1, 7, 10, 1, 8, 7, 1, 0, 8, -1, -1, -1, -1},
{0, 3, 7, 0, 7, 10, 0, 10, 9, 6, 10, 7, -1, -1, -1, -1},
{7, 6, 10, 7, 10, 8, 8, 10, 9, -1, -1, -1, -1, -1, -1, -1},
{6, 8, 4, 11, 8, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 6, 11, 3, 0, 6, 0, 4, 6, -1, -1, -1, -1, -1, -1, -1},
{8, 6, 11, 8, 4, 6, 9, 0, 1, -1, -1, -1, -1, -1, -1, -1},
{9, 4, 6, 9, 6, 3, 9, 3, 1, 11, 3, 6, -1, -1, -1, -1},
{6, 8, 4, 6, 11, 8, 2, 10, 1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 3, 0, 11, 0, 6, 11, 0, 4, 6, -1, -1, -1, -1},
{4, 11, 8, 4, 6, 11, 0, 2, 9, 2, 10, 9, -1, -1, -1, -1},
{10, 9, 3, 10, 3, 2, 9, 4, 3, 11, 3, 6, 4, 6, 3, -1},
{8, 2, 3, 8, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1},
{0, 4, 2, 4, 6, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 9, 0, 2, 3, 4, 2, 4, 6, 4, 3, 8, -1, -1, -1, -1},
{1, 9, 4, 1, 4, 2, 2, 4, 6, -1, -1, -1, -1, -1, -1, -1},
{8, 1, 3, 8, 6, 1, 8, 4, 6, 6, 10, 1, -1, -1, -1, -1},
{10, 1, 0, 10, 0, 6, 6, 0, 4, -1, -1, -1, -1, -1, -1, -1},
{4, 6, 3, 4, 3, 8, 6, 10, 3, 0, 3, 9, 10, 9, 3, -1},
{10, 9, 4, 6, 10, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 5, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 4, 9, 5, 11, 7, 6, -1, -1, -1, -1, -1, -1, -1},
{5, 0, 1, 5, 4, 0, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},
{11, 7, 6, 8, 3, 4, 3, 5, 4, 3, 1, 5, -1, -1, -1, -1},
{9, 5, 4, 10, 1, 2, 7, 6, 11, -1, -1, -1, -1, -1, -1, -1},
{6, 11, 7, 1, 2, 10, 0, 8, 3, 4, 9, 5, -1, -1, -1, -1},
{7, 6, 11, 5, 4, 10, 4, 2, 10, 4, 0, 2, -1, -1, -1, -1},
{3, 4, 8, 3, 5, 4, 3, 2, 5, 10, 5, 2, 11, 7, 6, -1},
{7, 2, 3, 7, 6, 2, 5, 4, 9, -1, -1, -1, -1, -1, -1, -1},
{9, 5, 4, 0, 8, 6, 0, 6, 2, 6, 8, 7, -1, -1, -1, -1},
{3, 6, 2, 3, 7, 6, 1, 5, 0, 5, 4, 0, -1, -1, -1, -1},
{6, 2, 8, 6, 8, 7, 2, 1, 8, 4, 8, 5, 1, 5, 8, -1},
{9, 5, 4, 10, 1, 6, 1, 7, 6, 1, 3, 7, -1, -1, -1, -1},
{1, 6, 10, 1, 7, 6, 1, 0, 7, 8, 7, 0, 9, 5, 4, -1},
{4, 0, 10, 4, 10, 5, 0, 3, 10, 6, 10, 7, 3, 7, 10, -1},
{7, 6, 10, 7, 10, 8, 5, 4, 10, 4, 8, 10, -1, -1, -1, -1},
{6, 9, 5, 6, 11, 9, 11, 8, 9, -1, -1, -1, -1, -1, -1, -1},
{3, 6, 11, 0, 6, 3, 0, 5, 6, 0, 9, 5, -1, -1, -1, -1},
{0, 11, 8, 0, 5, 11, 0, 1, 5, 5, 6, 11, -1, -1, -1, -1},
{6, 11, 3, 6, 3, 5, 5, 3, 1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 10, 9, 5, 11, 9, 11, 8, 11, 5, 6, -1, -1, -1, -1},
{0, 11, 3, 0, 6, 11, 0, 9, 6, 5, 6, 9, 1, 2, 10, -1},
{11, 8, 5, 11, 5, 6, 8, 0, 5, 10, 5, 2, 0, 2, 5, -1},
{6, 11, 3, 6, 3, 5, 2, 10, 3, 10, 5, 3, -1, -1, -1, -1},
{5, 8, 9, 5, 2, 8, 5, 6, 2, 3, 8, 2, -1, -1, -1, -1},
{9, 5, 6, 9, 6, 0, 0, 6, 2, -1, -1, -1, -1, -1, -1, -1},
{1, 5, 8, 1, 8, 0, 5, 6, 8, 3, 8, 2, 6, 2, 8, -1},
{1, 5, 6, 2, 1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 3, 6, 1, 6, 10, 3, 8, 6, 5, 6, 9, 8, 9, 6, -1},
{10, 1, 0, 10, 0, 6, 9, 5, 0, 5, 6, 0, -1, -1, -1, -1},
{0, 3, 8, 5, 6, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{10, 5, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 5, 10, 7, 5, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{11, 5, 10, 11, 7, 5, 8, 3, 0, -1, -1, -1, -1, -1, -1, -1},
{5, 11, 7, 5, 10, 11, 1, 9, 0, -1, -1, -1, -1, -1, -1, -1},
{10, 7, 5, 10, 11, 7, 9, 8, 1, 8, 3, 1, -1, -1, -1, -1},
{11, 1, 2, 11, 7, 1, 7, 5, 1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 1, 2, 7, 1, 7, 5, 7, 2, 11, -1, -1, -1, -1},
{9, 7, 5, 9, 2, 7, 9, 0, 2, 2, 11, 7, -1, -1, -1, -1},
{7, 5, 2, 7, 2, 11, 5, 9, 2, 3, 2, 8, 9, 8, 2, -1},
{2, 5, 10, 2, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1},
{8, 2, 0, 8, 5, 2, 8, 7, 5, 10, 2, 5, -1, -1, -1, -1},
{9, 0, 1, 5, 10, 3, 5, 3, 7, 3, 10, 2, -1, -1, -1, -1},
{9, 8, 2, 9, 2, 1, 8, 7, 2, 10, 2, 5, 7, 5, 2, -1},
{1, 3, 5, 3, 7, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 7, 0, 7, 1, 1, 7, 5, -1, -1, -1, -1, -1, -1, -1},
{9, 0, 3, 9, 3, 5, 5, 3, 7, -1, -1, -1, -1, -1, -1, -1},
{9, 8, 7, 5, 9, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{5, 8, 4, 5, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1},
{5, 0, 4, 5, 11, 0, 5, 10, 11, 11, 3, 0, -1, -1, -1, -1},
{0, 1, 9, 8, 4, 10, 8, 10, 11, 10, 4, 5, -1, -1, -1, -1},
{10, 11, 4, 10, 4, 5, 11, 3, 4, 9, 4, 1, 3, 1, 4, -1},
{2, 5, 1, 2, 8, 5, 2, 11, 8, 4, 5, 8, -1, -1, -1, -1},
{0, 4, 11, 0, 11, 3, 4, 5, 11, 2, 11, 1, 5, 1, 11, -1},
{0, 2, 5, 0, 5, 9, 2, 11, 5, 4, 5, 8, 11, 8, 5, -1},
{9, 4, 5, 2, 11, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 5, 10, 3, 5, 2, 3, 4, 5, 3, 8, 4, -1, -1, -1, -1},
{5, 10, 2, 5, 2, 4, 4, 2, 0, -1, -1, -1, -1, -1, -1, -1},
{3, 10, 2, 3, 5, 10, 3, 8, 5, 4, 5, 8, 0, 1, 9, -1},
{5, 10, 2, 5, 2, 4, 1, 9, 2, 9, 4, 2, -1, -1, -1, -1},
{8, 4, 5, 8, 5, 3, 3, 5, 1, -1, -1, -1, -1, -1, -1, -1},
{0, 4, 5, 1, 0, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{8, 4, 5, 8, 5, 3, 9, 0, 5, 0, 3, 5, -1, -1, -1, -1},
{9, 4, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 11, 7, 4, 9, 11, 9, 10, 11, -1, -1, -1, -1, -1, -1, -1},
{0, 8, 3, 4, 9, 7, 9, 11, 7, 9, 10, 11, -1, -1, -1, -1},
{1, 10, 11, 1, 11, 4, 1, 4, 0, 7, 4, 11, -1, -1, -1, -1},
{3, 1, 4, 3, 4, 8, 1, 10, 4, 7, 4, 11, 10, 11, 4, -1},
{4, 11, 7, 9, 11, 4, 9, 2, 11, 9, 1, 2, -1, -1, -1, -1},
{9, 7, 4, 9, 11, 7, 9, 1, 11, 2, 11, 1, 0, 8, 3, -1},
{11, 7, 4, 11, 4, 2, 2, 4, 0, -1, -1, -1, -1, -1, -1, -1},
{11, 7, 4, 11, 4, 2, 8, 3, 4, 3, 2, 4, -1, -1, -1, -1},
{2, 9, 10, 2, 7, 9, 2, 3, 7, 7, 4, 9, -1, -1, -1, -1},
{9, 10, 7, 9, 7, 4, 10, 2, 7, 8, 7, 0, 2, 0, 7, -1},
{3, 7, 10, 3, 10, 2, 7, 4, 10, 1, 10, 0, 4, 0, 10, -1},
{1, 10, 2, 8, 7, 4, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 1, 4, 1, 7, 7, 1, 3, -1, -1, -1, -1, -1, -1, -1},
{4, 9, 1, 4, 1, 7, 0, 8, 1, 8, 7, 1, -1, -1, -1, -1},
{4, 0, 3, 7, 4, 3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{4, 8, 7, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{9, 10, 8, 10, 11, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 9, 3, 9, 11, 11, 9, 10, -1, -1, -1, -1, -1, -1, -1},
{0, 1, 10, 0, 10, 8, 8, 10, 11, -1, -1, -1, -1, -1, -1, -1},
{3, 1, 10, 11, 3, 10, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 2, 11, 1, 11, 9, 9, 11, 8, -1, -1, -1, -1, -1, -1, -1},
{3, 0, 9, 3, 9, 11, 1, 2, 9, 2, 11, 9, -1, -1, -1, -1},
{0, 2, 11, 8, 0, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{3, 2, 11, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 3, 8, 2, 8, 10, 10, 8, 9, -1, -1, -1, -1, -1, -1, -1},
{9, 10, 2, 0, 9, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{2, 3, 8, 2, 8, 10, 0, 1, 8, 1, 10, 8, -1, -1, -1, -1},
{1, 10, 2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{1, 3, 8, 9, 1, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 9, 1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{0, 3, 8, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1},
{-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1}
};
static const unsigned char edgeConnection[12][2] =
{
{0,1}, {1,2}, {2,3}, {3,0},
{4,5}, {5,6}, {6,7}, {7,4},
{0,4}, {1,5}, {2,6}, {3,7}
};
static const D3DVECTOR gridVertices[8] =
{
{0,0,1}, {1,0,1}, {1,0,0}, {0,0,0},
{0,1,1}, {1,1,1}, {1,1,0}, {0,1,0}
};
const int c_iMaxTerrainVertices= 1 << 19;
static D3DXVECTOR3 vertices[c_iMaxTerrainVertices];
const int c_iMaxTerrainIndices = 1 << 21;
static int indices[c_iMaxTerrainIndices];
const int c_iMaxTerrainStepsXZ = 512;
const int c_iMaxTerrainStepsY = 256;
static float isoValues[c_iMaxTerrainStepsXZ * c_iMaxTerrainStepsY * 2];
static int indexValues[c_iMaxTerrainStepsXZ * c_iMaxTerrainStepsY * 5];
float IsoSphere(const D3DXVECTOR3& pos, const D3DXVECTOR3& center, const D3DXVECTOR3& scale, float r)
{
D3DXVECTOR3 v = pos - center;
v.x *= scale.x;
v.y *= scale.y;
v.z *= scale.z;
return sqrtf(v.x * v.x + v.y * v.y + v.z * v.z) - r;
}
float IsoPlane(const D3DXVECTOR3& pos, const D3DXVECTOR3& center, const D3DXVECTOR3& normal)
{
D3DXVECTOR3 v = pos - center;
return D3DXVec3Dot(&v, &normal);
}
/*
__forceinline D3DXVECTOR3 D3DXOOV3(float x, float y, float z)
{
return D3DXVECTOR3(1.0f / x, 1.0f / y, 1.0f / z);
}
*/
#define D3DXOOV3(x, y, z) D3DXVECTOR3(1.0f / x, 1.0f / y, 1.0f / z)
__forceinline float IsoDifference(float iso1, float iso2)
{
return max(iso1, -iso2);
}
__forceinline float IsoMerge(float iso1, float iso2)
{
return min(iso1, iso2);
}
__forceinline int mod(int x, int a)
{
int r = x % a;
if (r < 0) r += a;
return r;
}
__forceinline int int_floor(float x)
{
int i = (int) x;
return i > x ? i - 1 : i;
}
__forceinline float lerp(float a, float b, float t)
{
return (1 - t) * a + t * b;
}
float TerrainGrid::IsoSurfaceCave(const D3DXVECTOR3& pos)
{
float iso = IsoSphere(pos, D3DXVECTOR3(0.5f, 0.5f, 0.5f), D3DXOOV3(1, 1, 1), 0.4f);
iso = IsoMerge(
iso,
IsoSphere(pos, D3DXVECTOR3(0.125f, 0.65f, 0.75f), D3DXOOV3(1, 1.0f, 1), 0.25f) );
iso = IsoMerge(
iso,
IsoSphere(pos, D3DXVECTOR3(0.0f, 0.625f, 0.625f), D3DXOOV3(1, 1.0f, 1), 0.2f) );
iso = IsoMerge(
iso,
IsoSphere(pos, D3DXVECTOR3(0.0f, 0.875f, 0.625f), D3DXOOV3(1, 1.0f, 1), 0.1875f) );
iso = IsoMerge(
iso,
IsoSphere(pos, D3DXVECTOR3(0.0625f, 0.59f, 0.5f), D3DXOOV3(1, 0.75f, 1), 0.125f) );
iso = IsoMerge(
iso,
IsoSphere(pos, D3DXVECTOR3(0.25f, 0.57f, 0.25f), D3DXOOV3(2, 1.0f, 1), 0.125f) );
iso = IsoDifference(
iso,
IsoSphere(pos, D3DXVECTOR3(0.125f, 0.375f, 0.5f), D3DXOOV3(0.125f, 1.0f, 0.125f), 0.25f) );
iso = IsoDifference(
iso,
IsoSphere(pos, D3DXVECTOR3(0.1875f, 0.275f, 0.56f), D3DXOOV3(0.0625f, 1.0f, 0.0625f), 0.25f) );
iso-= PerlinNoise_2D(pos.x, pos.z, 128) * 6.0f / 32.0f;
iso-= PerlinNoise_2D(pos.x, pos.y, 192) / 16.0f;
iso-= PerlinNoise_2D(pos.y, pos.z, 192) / 16.0f;
iso = IsoDifference(
IsoSphere(pos, D3DXVECTOR3(0.9f, 0.5f, 0.5f), D3DXOOV3(1, 1, 1), 0.85f),
iso );
iso = IsoDifference(
iso,
IsoPlane(pos, D3DXVECTOR3(0.0f, 0.97f, 0.0f), D3DXVECTOR3(0.0f, -1.0f, 0.0f)) );
// iso = IsoDifference(
// iso,
// IsoPlane(pos, D3DXVECTOR3(0.97f, 0.0f, 0.0f), D3DXVECTOR3(-1.0f, 0.0f, 0.0f)) );
iso = IsoDifference(
iso,
IsoPlane(pos, D3DXVECTOR3(0.0f, 0.0f, 0.97f), D3DXVECTOR3(0.0f, 0.0f, -1.0f)) );
// iso = IsoDifference(
// iso,
// IsoPlane(pos, D3DXVECTOR3(0.0f, 0.0f, 0.03f), D3DXVECTOR3(0.0f, 0.0f, 1.0f)) );
return iso;
}
float TerrainGrid::IsoSurfaceCaveGround(const D3DXVECTOR3& pos)
{
float iso1 = IsoMerge(
IsoSphere(pos, D3DXVECTOR3(0.5f, 0.4f, 0.5f), D3DXOOV3(1, 1, 1), 0.25f),
IsoSphere(pos, D3DXVECTOR3(0.5f, 0.1f, 0.5f), D3DXOOV3(1, 1, 1), 0.37f) );
float iso2 = IsoMerge(
IsoSphere(pos, D3DXVECTOR3(0.5f, 0.5f, 0.42f), D3DXOOV3(1, 1, 1), 0.17f),
IsoSphere(pos, D3DXVECTOR3(0.57f, 0.38f, 0.6f), D3DXOOV3(1, 1, 1), 0.11f) );
float iso= IsoMerge( iso1, iso2 );
iso-= PerlinNoise_2D(pos.x, pos.z, 128) * 12.0f / 32.0f;
iso-= PerlinNoise_2D(pos.x, pos.y, 192) / 8.0f;
iso-= PerlinNoise_2D(pos.y, pos.z, 192) / 8.0f;
return iso;
}
int index = 0;
static const float random[] = {
0.016096199,
-0.041969635,
-0.054145098,
0.021143436,
-0.0094251214,
0.088897280,
0.36951837,
-0.16126564,
0.010747797,
0.094805837,
-0.19188920,
0.25969765,
0.022508329,
0.023705304,
-0.0098044397,
0.066074423,
0.024152935,
-0.089513578,
-0.38613912,
0.075401597,
0.0086482586,
-0.090612829,
-0.032468367,
-0.031355500,
-0.010738159,
0.026182247,
-0.15096381,
0.17182341,
-0.035797309,
-0.029005880,
-0.27913427,
-0.22096422,
0.031160533,
0.016560698,
-0.25966603,
-0.16343403,
-0.011228019,
0.050174236,
0.012509584,
-0.28846321,
0.0097525716,
-0.030592179,
0.15790334,
0.16756034,
0.048684187,
-0.069313243,
0.35656410,
-0.0073550940,
0.018086834,
0.035755921,
-0.13925140,
0.20644069,
-0.016748196,
-0.033889730,
0.12365069,
0.34854794,
0.0099919019,
0.023382772,
-0.11413296,
0.096547559,
-0.019580711,
-0.056822035,
0.036674835,
-0.33782470};
float IsoMountain(const D3DXVECTOR3& pos)
{
return IsoSphere(pos, D3DXVECTOR3(0.5f + random[index++], 0.05f, 0.5f + random[index++]), D3DXOOV3(0.25f, 0.7f + random[index++], 0.15f), 0.25f + random[index++]);
}
float TerrainGrid::IsoSurfaceIsle(const D3DXVECTOR3& pos1)
{
// Koordinaten entsprechen nicht altem System "halber Unitcube"
D3DXVECTOR3 pos= pos1;
pos.y*= 0.5f;
float island = IsoMerge(
IsoSphere(pos, D3DXVECTOR3(0.5f, 0.10f, 0.5f), D3DXOOV3(1, 1, 1), 0.25f),
IsoSphere(pos, D3DXVECTOR3(0.5f, 0.01f, 0.5f), D3DXOOV3(1, 0.5f, 1), 0.4f));
// Small Mountains
index = 0;
float mountains = IsoSphere(pos, D3DXVECTOR3(0.5f, 0.1f, 0.84f), D3DXOOV3(0.15f, 0.8f, 0.2f), 0.3f);
for (int i = 0; i < 16; ++i)
{
mountains = IsoMerge(mountains, IsoMountain(pos));
}
mountains += PerlinNoise_2D(pos.x, pos.z, 256) * 0.2f;
mountains += PerlinNoise_2D(pos.y, pos.z, 256) * 0.1f;
// Big mountains
float hill = IsoSphere(pos, D3DXVECTOR3(0.5f, 0.18f, 0.5f), D3DXOOV3(0.3f, 0.8f, 0.3f), 0.4f);
hill += PerlinNoise_2D(pos.x, pos.y, 480) * 0.05f;
hill += PerlinNoise_2D(pos.y, pos.z, 480) * 0.05f;
hill += PerlinNoise_2D(pos.z, pos.x, 480) * 0.05f;
// Canal for the arc
float canal = IsoSphere(pos, D3DXVECTOR3(0.5f, 0.1f, 0.74f), D3DXOOV3(1.0f, 0.5f, 0.12f), 0.2f);
canal += PerlinNoise_2D(pos.x, pos.y, 512) * 0.2f;
canal += PerlinNoise_2D(pos.y, pos.z, 512) * 0.2f;
// Bridge for the arc
float bridge = IsoDifference(
IsoSphere(pos, D3DXVECTOR3(0.5f, 0.25f, 0.75f), D3DXOOV3(0.1f, 0.4f, 0.68f), 0.2f),
canal);
bridge += PerlinNoise_2D(pos.x, pos.y, 384) * 0.1f;
bridge -= PerlinNoise_2D(pos.y, pos.z, 384) * 0.1f;
bridge += PerlinNoise_2D(pos.z, pos.x, 384) * 0.1f;
bridge = IsoDifference(bridge, IsoPlane(pos, D3DXVECTOR3(0.5, 0.35f, 0.75f), D3DXVECTOR3(0, -1, 0)));
// Merge everything together
float iso = IsoMerge(IsoMerge(IsoMerge(island, mountains), bridge), hill);
// Globale verwirbelungen
iso -= PerlinNoise_2D(pos.x, pos.z, 192) * 0.2f;
iso += PerlinNoise_2D(pos.y, pos.x, 192) * 0.1f;
return iso;
}
const float M_PI = 3.141592768f;
const int textureSize = 1024;
float TerrainGrid::PerlinNoise_2D(float x, float y, float scale)
{
const D3DCOLOR* color = (const D3DCOLOR*)noiseLock.pBits;
int ix1, ix2, iy1, iy2;
float t1, t2;
float c1, c2, c3, c4;
x *= scale; y *= scale;
ix1 = int_floor(x);
t1 = x - ix1;
ix2 = ix1 + 1;
iy1 = int_floor(y);
t2 = y - iy1;
iy2 = iy1 + 1;
ix1 = mod(ix1, textureSize);
ix2 = mod(ix2, textureSize);
iy1 = mod(iy1, textureSize);
iy2 = mod(iy2, textureSize);
t1 = (1-cos(t1 * M_PI))/2;
t2 = (1-cos(t2 * M_PI))/2;
c1 = (float)(color[iy1 * textureSize + ix1] >> 24);
c2 = (float)(color[iy1 * textureSize + ix2] >> 24);
c3 = (float)(color[iy2 * textureSize + ix1] >> 24);
c4 = (float)(color[iy2 * textureSize + ix2] >> 24);
return lerp(lerp(c1, c2, t1), lerp(c3, c4, t1), t2) / 128.0f - 1.0f;
}
D3DXVECTOR3 TerrainGrid::VertexInterp(float isolevel, D3DXVECTOR3 p1, D3DXVECTOR3 p2, float valp1, float valp2)
{
D3DXVECTOR3 p;
float mu = (isolevel - valp1) / (valp2 - valp1);
p.x = p1.x + mu * (p2.x - p1.x);
p.y = p1.y + mu * (p2.y - p1.y);
p.z = p1.z + mu * (p2.z - p1.z);
return(p);
}
int TerrainGrid::Polygonise(GRIDCELL grid, float isolevel, TRIANGLE* triangles)
{
unsigned short i, flag;
D3DXVECTOR3 vertlist[12];
int cubeindex = 0;
flag = 1;
for (i = 0; i < 8; ++i, flag <<= 1)
if (grid.val[i] <= isolevel) cubeindex |= flag;
if (edgeTable[cubeindex] == 0)
return 0;
flag = 1;
for (i = 0; i < 12; ++i, flag <<= 1)
if (edgeTable[cubeindex] & flag)
vertlist[i] = VertexInterp(isolevel,
grid.p[edgeConnection[i][0]],
grid.p[edgeConnection[i][1]],
grid.val[edgeConnection[i][0]],
grid.val[edgeConnection[i][1]]);
for (i = 0; triTable[cubeindex][i] != -1; ++i)
triangles[i / 3].p[i % 3] = vertlist[triTable[cubeindex][i]];
return i / 3;
}
D3DXVECTOR3 TerrainGrid::GetNormal(D3DXVECTOR3 input, iso_surface_function pIsoSurface)
{
float fEps= 0.01f;
return D3DXVECTOR3(
(this->*pIsoSurface)(input + D3DXVECTOR3(fEps, 0, 0)) - (this->*pIsoSurface)(input - D3DXVECTOR3(fEps, 0, 0)),
(this->*pIsoSurface)(input + D3DXVECTOR3(0, fEps, 0)) - (this->*pIsoSurface)(input - D3DXVECTOR3(0, fEps, 0)),
(this->*pIsoSurface)(input + D3DXVECTOR3(0, 0, fEps)) - (this->*pIsoSurface)(input - D3DXVECTOR3(0, 0, fEps)));
}
void TerrainGrid::Init( int StepsXZ, int StepsY, iso_surface_function pIsoSurface )
{
assert( StepsXZ < c_iMaxTerrainStepsXZ );
assert( StepsY < c_iMaxTerrainStepsY );
const float xres = 1.0f / StepsXZ;
const float yres = 1.0f / StepsY;
const float zres = 1.0f / StepsXZ;
g_pTextures[TI_Wave].Lock();
noiseLock = g_pTextures[TI_Wave].GetData();
vertexCount = 0;
indexCount = 0;
// Clear
mymemset(indexValues, -1, sizeof(indexValues));
int StepsXZPP = StepsXZ + 1;
int StepsYPP = StepsY + 1;
int StepsXYZPP = StepsXZPP * StepsYPP;
int iIndexCacheSmallLayerSize = StepsXYZPP;
int iIndexCacheBigLayerSize = iIndexCacheSmallLayerSize * 2;
int iNextCacheLayer = 0;
int iNextIndexCacheLayer = 0;
int iPrevIndexCacheLayerBaseValue = 0;
bool bFirstRun = true;
for (int x = 0; x < StepsXZ; ++x)
{
// Old layer, new layer
int iCacheLayers[2] = { (iNextCacheLayer + 1) % 2, iNextCacheLayer };
// Overwrite oldest layer next time
iNextCacheLayer = iCacheLayers[0];
for (int r = 0; r < 1 + bFirstRun; r++)
{
// New layer first, old layer afterwards on first run
int iCacheBase = iCacheLayers[1 - r] * StepsXYZPP;
int xpp = x + 1 - r;
for (int y = 0; y < StepsYPP; ++y)
{
int iCacheBaseY = iCacheBase + y * StepsXZPP;
for (int z = 0; z < StepsXZPP; ++z)
{
D3DXVECTOR3 gridP = D3DXVECTOR3((float)xpp, (float)y, (float)z);
gridP.x *= xres;
gridP.y *= yres;
gridP.z *= zres;
isoValues[ iCacheBaseY + z ] = (this->*pIsoSurface)( gridP );
}
}
}
bFirstRun = false;
// Old layer, new layer
int iIndexOuterCacheLayers[2] = { (iNextIndexCacheLayer + 1) % 2, iNextIndexCacheLayer };
// Overwrite oldest layer next time
iNextIndexCacheLayer = iIndexOuterCacheLayers[0];
// Layer bases
int *pIndexValueLayers[3] = {
indexValues + iIndexOuterCacheLayers[0] * iIndexCacheBigLayerSize,
indexValues + 2 * iIndexCacheBigLayerSize,
indexValues + iIndexOuterCacheLayers[1] * iIndexCacheBigLayerSize };
// Layer value bases
int iIndexValueLayerBaseValues[3] = {
iPrevIndexCacheLayerBaseValue,
vertexCount,
vertexCount };
// Current vertex count is base for next time
iPrevIndexCacheLayerBaseValue = iIndexValueLayerBaseValues[2];
for (int y = 0; y < StepsY; ++y)
{
for (int z = 0; z < StepsXZ; ++z)
{
TRIANGLE triangles[5];
GRIDCELL grid;
for (int i = 0; i < 8; ++i)
{
D3DXVECTOR3 &gridP = grid.p[i];
gridP = gridVertices[i];
gridP += D3DXVECTOR3((float)x, (float)y, (float)z);
int iCacheBase = iCacheLayers[ (int)gridVertices[i].x ] * StepsXYZPP;
int iCacheBaseY = iCacheBase + (int)gridP.y * StepsXZPP;
grid.val[i] = isoValues[ iCacheBaseY + (int)gridP.z ];
gridP.x *= xres;
gridP.y *= yres;
gridP.z *= zres;
// assert( grid.val[i] == IsoSurface(gridP) );
}
int nTriangles = Polygonise(grid, 0, triangles);
float fCellXL = x * xres, fCellXU = fCellXL + xres;
float fCellYL = y * yres, fCellYU = fCellYL + yres;
float fCellZL = z * zres, fCellZU = fCellZL + zres;
for (int i = 0; i < nTriangles; ++i)
{
const TRIANGLE &tri = triangles[i];
for (int j = 3; j-- > 0; )
{
const D3DXVECTOR3 &pos = tri.p[j];
// Compute edge deviations
float fEdgeXL = pos.x - fCellXL, fEdgeXU = fCellXU - pos.x;
float fEdgeYL = pos.y - fCellYL, fEdgeYU = fCellYU - pos.y;
float fEdgeZL = pos.z - fCellZL, fEdgeZU = fCellZU - pos.z;
int iEdgeX = (fEdgeXL > fEdgeXU);
int iEdgeY = (fEdgeYL > fEdgeYU);
int iEdgeZ = (fEdgeZL > fEdgeZU);
float fEdgeXD = (iEdgeX) ? fEdgeXU : fEdgeXL;
float fEdgeYD = (iEdgeY) ? fEdgeYU : fEdgeYL;
float fEdgeZD = (iEdgeZ) ? fEdgeZU : fEdgeZL;
// Compute layer
int iEdgeLayer = (fEdgeXD > fEdgeYD && fEdgeXD > fEdgeZD)
? 1 // Center layer
: 2 * iEdgeX; // Top / bottom layer
int *pLayerIndexValues = pIndexValueLayers[iEdgeLayer];
int iLayerIndexBaseValue = iIndexValueLayerBaseValues[iEdgeLayer];
int *pIndexValue;
// Center layer
if (iEdgeLayer == 1)
{
// Get index value
int iCacheBaseY = (y + iEdgeY) * StepsXZPP;
int iCacheIndex = iCacheBaseY + (z + iEdgeZ);
pIndexValue = &pLayerIndexValues[iCacheIndex];
}
// Top / bottom layer
else
{
int iOnY = (fEdgeYD > fEdgeZD);
int iEdgeZY = (iOnY) ? iEdgeZ : iEdgeY;
// Get index value
int iCacheBaseY = ( (y + (1 - iOnY) * iEdgeZY) * 2 + iOnY ) * StepsXZPP;
int iCacheIndex = iCacheBaseY + ( z + iOnY * iEdgeZY );
pIndexValue = &pLayerIndexValues[iCacheIndex];
}
int &indexValue = *pIndexValue;
bool bIndexValid = (indexValue >= iLayerIndexBaseValue);
// Check index
if(!bIndexValid)
{
// Update index
indexValue = vertexCount;
// Allocate new vertex
vertices[vertexCount++] = tri.p[j];
}
// Allocate new index
indices[indexCount++] = indexValue;
}
}
}
}
if( ( x & 31 ) == 31 )
{
RenderLoading( 4 );
}
}
assert( vertexCount <= c_iMaxTerrainVertices );
assert( indexCount <= c_iMaxTerrainIndices );
D3DVERTEXELEMENT9 decl[] =
{
{0, 0, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_POSITION, 0},
{0, 12, D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0},
{0, 24, D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0},
{0, 32, D3DDECLTYPE_D3DCOLOR, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_COLOR, 0},
D3DDECL_END()
};
assert(vertexCount != 0);
g_d3d_device->CreateVertexDeclaration(decl, &vertexDecl);
g_d3d_device->CreateVertexBuffer(sizeof(TerrainVertex) * vertexCount, D3DUSAGE_WRITEONLY, 0, D3DPOOL_MANAGED, &vertexBuffer, NULL);
g_d3d_device->CreateIndexBuffer(sizeof(int) * indexCount, D3DUSAGE_WRITEONLY, D3DFMT_INDEX32, D3DPOOL_MANAGED, &indexBuffer, NULL);
TerrainVertex* vertex;
int* index;
vertexBuffer->Lock(0, 0, (void**)&vertex, 0);
indexBuffer->Lock(0, 0, (void**)&index, 0);
for (int i = 0; i < vertexCount; ++i)
{
vertex[i].pos = vertices[i];
vertex[i].col = D3DXCOLOR(0xFFFFFFFF);
vertex[i].tex = D3DXVECTOR2(vertices[i].x, vertices[i].z);
vertex[i].normal = GetNormal(vertices[i], pIsoSurface); // D3DXVECTOR3(0, 0, 0); // GetNormal(vertices[i]);
}
mymemcpy(index, indices, sizeof(int) * indexCount);
/* for (int i = 0; i < indexCount; i+=3)
{
int iVertex1 = index[i];
int iVertex2 = index[i + 1];
int iVertex3 = index[i + 2];
D3DXVECTOR3 vNormal;
D3DXVECTOR3 vDelta1 = vertex[iVertex2].pos - vertex[iVertex1].pos;
D3DXVECTOR3 vDelta2 = vertex[iVertex3].pos - vertex[iVertex1].pos;
D3DXVec3Cross(&vNormal, &vDelta1, &vDelta2);
vertex[iVertex1].normal += vNormal;
vertex[iVertex2].normal += vNormal;
vertex[iVertex3].normal += vNormal;
}
for (int i = 0; i < vertexCount; ++i)
D3DXVec3Normalize(&vertex[i].normal, &vertex[i].normal);
*/
indexBuffer->Unlock();
vertexBuffer->Unlock();
g_pTextures[TI_Wave].Unlock();
}
void TerrainGrid::Render()
{
g_d3d_device->SetStreamSource(0, vertexBuffer, 0, sizeof(TerrainVertex));
g_d3d_device->SetFVF(NULL);
g_d3d_device->SetVertexDeclaration(vertexDecl);
g_d3d_device->SetIndices(indexBuffer);
g_d3d_device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, vertexCount, 0, indexCount / 3);
}

View File

@@ -0,0 +1,51 @@
#pragma once
#include <d3dx9.h>
extern IDirect3DDevice9* g_d3d_device;
class TerrainGrid
{
public:
typedef float (TerrainGrid::*iso_surface_function)(const D3DXVECTOR3&);
void Init( int StepsXZ, int StepsY, iso_surface_function pIsoSurface );
void Render();
float IsoSurfaceIsle(const D3DXVECTOR3& pos);
float IsoSurfaceCave(const D3DXVECTOR3& pos);
float IsoSurfaceCaveGround(const D3DXVECTOR3& pos);
private:
typedef struct
{
D3DXVECTOR3 p[3];
} TRIANGLE;
typedef struct
{
D3DXVECTOR3 p[8];
float val[8];
} GRIDCELL;
float PerlinNoise_2D(float x, float y, float scale);
D3DXVECTOR3 VertexInterp(float isolevel, D3DXVECTOR3 p1, D3DXVECTOR3 p2, float valp1, float valp2);
int Polygonise(GRIDCELL grid, float isolevel, TRIANGLE* triangles);
D3DXVECTOR3 GetNormal(D3DXVECTOR3 input, iso_surface_function pIsoSurface);
D3DLOCKED_BOX noiseLock;
int vertexCount;
int indexCount;
IDirect3DVertexDeclaration9* vertexDecl;
IDirect3DIndexBuffer9* indexBuffer;
IDirect3DVertexBuffer9* vertexBuffer;
};
struct TerrainVertex
{
D3DXVECTOR3 pos;
D3DXVECTOR3 normal;
D3DXVECTOR2 tex;
D3DCOLOR col;
};

View File

@@ -0,0 +1,54 @@
/***********************************************************************************/
/** \file TextFileReader.h
** \brief Header File zur Klasse TextFileReader
*************************************************************************************
** Autor: Christian Roesch
*************************************************************************************
** _tut nichts_
**
*//*********************************************************************************/
#ifndef _TextFileReader_H
#define _TextFileReader_H
// includes
#include <vector>
#include <string>
// Klassen-Deklaration
namespace FrameWork
{
/***********************************************************************************/
/** \brief TextFileReader _tut nichts_
*************************************************************************************
** Genau genommen _tut dies nichts_
**
*//*********************************************************************************/
class TextFileReader
{
public:
bool read( std::string strFileName );
bool append( std::string FileName );
std::vector <std::string>& getFileLines();
int getLineCount();
void clear();
protected:
private:
std::vector <std::string> m_vecLines;
};
}
#endif//_TextFileReader_H
class FrameWork::TextFileReader;
/************************************************************************************
** Ende der Datei: TextFileReader.h
************************************************************************************/

View File

@@ -0,0 +1,506 @@
#include "intrin.h"
#include "defines.h"
#include "Texture.h"
#include "Random.h"
#include "globals.h"
#include "rotmat.h"
void Texture::Init()
{
m_iSizeX= -1;
m_iSizeY= -1;
m_iSizeZ= -1;
m_iMipLevel= -1;
m_pTexture= NULL;
m_d3dlb.pBits= NULL;
m_d3dlb.RowPitch= -1;
m_d3dlb.SlicePitch= -1;
}
void Texture::DeInit()
{
Release();
}
void Texture::Create( int iSizeX,
int iSizeY,
int iSizeZ,
int iMipLevel )
{
Release();
m_iSizeX= iSizeX;
m_iSizeY= iSizeY;
m_iSizeZ= iSizeZ;
m_iMipLevel= iMipLevel;
if(m_iSizeZ > 1)
{
g_d3d_device->CreateVolumeTexture(
m_iSizeX,
m_iSizeY,
m_iSizeZ,
m_iMipLevel,
0,
D3DFMT_A8R8G8B8,
D3DPOOL_MANAGED,
(IDirect3DVolumeTexture9**)&m_pTexture,
NULL );
}
else
{
m_iSizeZ = 1;
g_d3d_device->CreateTexture(
m_iSizeX,
m_iSizeY,
m_iMipLevel,
0,
D3DFMT_A8R8G8B8,
D3DPOOL_MANAGED,
(IDirect3DTexture9**)&m_pTexture,
NULL );
}
}
void Texture::Release()
{
Unlock();
if( m_pTexture != NULL )
{
m_pTexture->Release();
m_pTexture= NULL;
}
m_iSizeX= -1;
m_iSizeY= -1;
m_iSizeZ= -1;
m_iMipLevel= -1;
m_d3dlb.pBits= NULL;
m_d3dlb.RowPitch= -1;
m_d3dlb.SlicePitch= -1;
}
void Texture::Lock()
{
if(m_iSizeZ > 1)
{
((IDirect3DVolumeTexture9*)m_pTexture)->LockBox( 0, &m_d3dlb, 0, 0 );
}
else
{
D3DLOCKED_RECT d3dlr;
((IDirect3DTexture9*)m_pTexture)->LockRect( 0, &d3dlr, 0, 0 );
m_d3dlb.pBits = d3dlr.pBits;
m_d3dlb.RowPitch = d3dlr.Pitch;
m_d3dlb.SlicePitch = 0;
}
}
void Texture::Unlock()
{
if( m_d3dlb.pBits == NULL )
{
return;
}
if(m_iSizeZ > 1)
{
((IDirect3DVolumeTexture9*)m_pTexture)->UnlockBox( 0 );
}
else
{
((IDirect3DTexture9*)m_pTexture)->UnlockRect( 0 );
}
m_d3dlb.pBits= NULL;
m_d3dlb.RowPitch= -1;
m_d3dlb.SlicePitch= -1;
}
const D3DLOCKED_BOX& Texture::GetData() const
{
return m_d3dlb;
};
void Texture::PrepareRandomTexture()
{
RandomGenerator rg;
rg.setSeed( 1024 );
for( int i= 0; i < 1024; ++i )
{
rg.genFloat();
}
Lock();
for( int iZ= 0; iZ < m_iSizeZ; ++iZ )
{
for( int iY= 0; iY < m_iSizeY; ++iY )
{
DWORD* pData= (DWORD*)((BYTE*)m_d3dlb.pBits + iY * m_d3dlb.RowPitch + iZ * m_d3dlb.SlicePitch );
for( int iX= 0; iX < m_iSizeX; ++iX )
{
rg.genFloat();
*pData++ = rg.getLastTempValue();
}
}
}
Unlock();
// Generate mip maps
D3DXFilterTexture(m_pTexture, NULL, 0, D3DX_DEFAULT);
}
#ifdef EXTRACODE
#include <fstream>
#endif
void Texture::PrepareRotMatrixFromFile()
{
#ifdef EXTRACODE
Release();
D3DXCreateTextureFromFile(
g_d3d_device,
"64k_pre/rotationalMatrix32.png",
(IDirect3DTexture9**)&m_pTexture );
m_iSizeX= 32;
m_iSizeY= 32;
m_iSizeZ = 1;
m_iMipLevel= 1;
Lock();
std::ofstream ofs( "64k_pre/rotMat.txt" );
for( int iY= 0; iY < m_iSizeY; ++iY )
{
DWORD* pData= (DWORD*)((BYTE*)m_d3dlb.pBits + iY * m_d3dlb.RowPitch );
for( int iX= 0; iX < m_iSizeX; ++iX )
{
//rg.genFloat();
//*pData++ = rg.getLastTempValue();
DWORD dw= *pData++;
ofs << dw << "," << "\n";
}
}
Unlock();
#endif
}
void Texture::PrepareTexGenRenderStates(IDirect3DBaseTexture9 *pInputTexture)
{
g_d3d_device->SetRenderState( D3DRS_LIGHTING, FALSE );
g_d3d_device->SetRenderState( D3DRS_ZENABLE, FALSE );
g_d3d_device->SetRenderState( D3DRS_MULTISAMPLEANTIALIAS, FALSE );
g_d3d_device->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
g_d3d_device->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
g_d3d_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
// sampler2D randomSampler : register(s0);
g_d3d_device->SetSamplerState( 0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( 0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( 0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( 0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
g_d3d_device->SetSamplerState( 0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
g_d3d_device->SetTexture( 0, g_pTextures[ TI_Random ].GetPointer() );
// sampler2D randomCubeSampler : register(s1);
g_d3d_device->SetSamplerState( 1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( 1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( 1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( 1, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
g_d3d_device->SetSamplerState( 1, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
g_d3d_device->SetSamplerState( 1, D3DSAMP_ADDRESSW, D3DTADDRESS_WRAP );
g_d3d_device->SetTexture( 1, g_pTextures[ TI_RandomCube ].GetPointer() );
// sampler2D ditherSampler : register(s2);
g_d3d_device->SetSamplerState( 2, D3DSAMP_MINFILTER, D3DTEXF_POINT );
g_d3d_device->SetSamplerState( 2, D3DSAMP_MAGFILTER, D3DTEXF_POINT );
g_d3d_device->SetSamplerState( 2, D3DSAMP_MIPFILTER, D3DTEXF_POINT );
g_d3d_device->SetSamplerState( 2, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
g_d3d_device->SetSamplerState( 2, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
g_d3d_device->SetTexture( 2, g_pTextures[ TI_RotMatrix ].GetPointer() );
// sampler2D inputSampler : register(s3);
g_d3d_device->SetSamplerState( 3, D3DSAMP_MINFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( 3, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( 3, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR );
g_d3d_device->SetSamplerState( 3, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP );
g_d3d_device->SetSamplerState( 3, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP );
g_d3d_device->SetTexture( 3, pInputTexture );
}
void Texture::PrepareShaderTexture(int iShader1, int iShader2, int iShader3, int iShader4)
{
const int iMaxShaderCount = 4;
int shaders[iMaxShaderCount] = { iShader1, iShader2, iShader3, iShader4 };
IDirect3DTexture9 *pIntermediate = NULL;
IDirect3DSurface9 *pIntermediateSurface = NULL;
IDirect3DSurface9 *pIntermediateData = NULL;
// Create intermediate texture target
g_d3d_device->CreateTexture( m_iSizeX,
m_iSizeY,
1,
D3DUSAGE_RENDERTARGET,
D3DFMT_A8R8G8B8,
D3DPOOL_DEFAULT,
&(pIntermediate),
NULL);
pIntermediate->GetSurfaceLevel(0, &pIntermediateSurface);
// Create system-memory surface
g_d3d_device->CreateOffscreenPlainSurface( m_iSizeX,
m_iSizeY,
D3DFMT_A8R8G8B8,
D3DPOOL_SYSTEMMEM,
&(pIntermediateData),
NULL);
IDirect3DSurface9 *pColorSurface = NULL;
IDirect3DSurface9 *pDepthStencilSurface = NULL;
g_d3d_device->BeginScene();
// Get targets
g_d3d_device->GetRenderTarget(0, &pColorSurface);
g_d3d_device->GetDepthStencilSurface(&pDepthStencilSurface);
for(int i = 0; i < iMaxShaderCount; i++)
{
int iShader = shaders[i];
if(iShader < 0)
continue;
// Set intermediate target & state
g_d3d_device->SetRenderTarget(0, pIntermediateSurface);
g_d3d_device->SetDepthStencilSurface(NULL);
PrepareTexGenRenderStates(m_pTexture);
Shader::SetResolution(m_iSizeX, m_iSizeY);
// Generate texture
g_FullScreenQuad.m_iUsedShader[0] = iShader;
g_FullScreenQuad.Render();
// Copy data
g_d3d_device->GetRenderTargetData(pIntermediateSurface, pIntermediateData);
D3DLOCKED_RECT intermediateRect;
// Lock surfaces
pIntermediateData->LockRect(&intermediateRect, NULL, D3DLOCK_NO_DIRTY_UPDATE | D3DLOCK_READONLY);
Lock();
// Copy data to destination surface
mymemcpy(m_d3dlb.pBits, intermediateRect.pBits, m_d3dlb.RowPitch * m_iSizeY);
// Unlock surfaces
Unlock();
pIntermediateData->UnlockRect();
// Generate mip maps
D3DXFilterTexture(m_pTexture, NULL, 0, D3DX_DEFAULT);
}
// Reset targets
g_d3d_device->SetRenderTarget(0, pColorSurface);
g_d3d_device->SetDepthStencilSurface(pDepthStencilSurface);
g_d3d_device->EndScene();
g_d3d_device->Present(NULL, NULL, NULL, NULL);
// Release
if(pColorSurface)
pColorSurface->Release();
if(pDepthStencilSurface)
pDepthStencilSurface->Release();
pIntermediateSurface->Release();
pIntermediate->Release();
pIntermediateData->Release();
}
void Texture::PrepareRotMatrix()
{
Lock();
int iPos= 0;
for( int iY= 0; iY < m_iSizeY; ++iY )
{
DWORD* pData= (DWORD*)((BYTE*)m_d3dlb.pBits + iY * m_d3dlb.RowPitch );
for( int iX= 0; iX < m_iSizeX; ++iX )
{
*pData++ = dwRotMatData[ iPos++ ];
}
}
Unlock();
}
void Texture::PrepareSpecTexture()
{
g_pTextures[ TI_LightSpec1D ].Create( 256, 1, 1, 1 );
g_pTextures[ TI_LightSpec1D ].Lock();
float fVal= 255.0f;
for( int i= 0; i <= 255; ++i )
{
int iV= (int)fVal;
((DWORD*)(g_pTextures[ TI_LightSpec1D ].m_d3dlb.pBits))[ 255 - i ]=
0xff << 24 |
( iV & 0xff ) << 16 |
( iV & 0xff ) << 8 |
( iV & 0xff );
fVal*= 0.925f;
}
//unlock
g_pTextures[ TI_LightSpec1D ].Unlock();
}
void Texture::Prepare1DTextures()
{
PrepareSpecTexture();
int iTexIndex= TI_First1D;
static const unsigned char pucDataTest[]=
{
1, // Groesse == 8
255, 255, 255,
7,
255, 255, 255,
0,
16, // Groesse == 128
32, 32, 64,
64,
120, 120, 128,
63,
255, 251, 208,
0,
16, // Groesse == 128
255, 255, 255,
4,
192, 192, 192,
4,
145, 145, 145,
4,
108, 108, 108,
4,
81, 81, 81,
8,
45, 45, 45,
16,
14, 14, 14,
16,
4, 4, 4,
71,
0, 0, 0,
0,
16, // Groesse == 128
80, 0, 165,
16,
38, 3, 238,
18,
0, 183, 195,
12,
0, 217, 110,
18,
1, 232,0,
18,
152, 216,0,
12,
229, 200,0 ,
18,
255, 62,0 ,
15,
225, 18,0 ,
0,
0
};
const unsigned char* pData= pucDataTest;
int ColorIn[ 3 ];
int ColorOut[ 3 ];
while( *pData != 0 )
{
//create Texture
int iTexSize= *pData * 8;
pData++;
/*int iMips= 1;
while( 2 << iMips <= iTexSize )
{
iMips++;
}*/
g_pTextures[ iTexIndex ].Create( iTexSize, 1, 1, 1 );
g_pTextures[ iTexIndex ].Lock();
int iX= 0;
ColorIn[ 0 ]= *pData++;
ColorIn[ 1 ]= *pData++;
ColorIn[ 2 ]= *pData++;
//set Texture Data
while( true )
{
int iLength= *pData;
pData++;
if( iLength == 0 )
{
break;
}
ColorOut[ 0 ]= *pData++;
ColorOut[ 1 ]= *pData++;
ColorOut[ 2 ]= *pData++;
//lerp colors
for( int i= 0; i <= iLength; ++i )
{
int iA= iLength - i;
int iR= ( ColorOut[ 0 ] * i + ColorIn[ 0 ] * iA ) / iLength;
int iG= ( ColorOut[ 1 ] * i + ColorIn[ 1 ] * iA ) / iLength;
int iB= ( ColorOut[ 2 ] * i + ColorIn[ 2 ] * iA ) / iLength;
assert( iX < g_pTextures[ iTexIndex ].m_iSizeX );
((DWORD*)(g_pTextures[ iTexIndex ].m_d3dlb.pBits))[ iX ]=
0xff << 24 |
( iR & 0xff ) << 16 |
( iG & 0xff ) << 8 |
( iB & 0xff );
++iX;
}
--iX;
ColorIn[ 0 ]= ColorOut[ 0 ];
ColorIn[ 1 ]= ColorOut[ 1 ];
ColorIn[ 2 ]= ColorOut[ 2 ];
}
//unlock
g_pTextures[ iTexIndex ].Unlock();
iTexIndex++;
}
}

View File

@@ -0,0 +1,83 @@
#pragma once
/***********************************************************************************/
/** \file Texture.h
** \brief Header File zur Klasse Texture
*************************************************************************************
** Autor: Christian Roesch
*************************************************************************************
** _tut nichts_
**
*//*********************************************************************************/
#ifndef _Texture_H
#define _Texture_H
// includes
#include <d3dx9.h>
#include <cassert>
// Klassen-Deklaration
extern IDirect3DDevice9* g_d3d_device;
/***********************************************************************************/
/** \brief Texture _tut nichts_
*************************************************************************************
** Genau genommen _tut dies nichts_
**
*//*********************************************************************************/
class Texture
{
public:
void Init();
void DeInit();
void Create( int m_iSizeX,
int m_iSizeY,
int m_iSizeZ,
int m_iMipLevel );
void Release();
void Lock();
void Unlock();
const D3DLOCKED_BOX& GetData() const;
IDirect3DBaseTexture9* GetPointer()
{
return m_pTexture;
}
void PrepareRandomTexture();
void PrepareRotMatrixFromFile();
void PrepareRotMatrix();
void PrepareShaderTexture(int iShader1, int iShader2 = -1, int iShader3 = -1, int iShader4 = -1);
static void Prepare1DTextures();
private:
static void PrepareSpecTexture();
static void PrepareTexGenRenderStates(IDirect3DBaseTexture9 *pInputTexture);
int m_iSizeX;
int m_iSizeY;
int m_iSizeZ;
int m_iMipLevel;
IDirect3DBaseTexture9* m_pTexture;
D3DLOCKED_BOX m_d3dlb;
};
#endif//_Texture_H
class Texture;
/************************************************************************************
** Ende der Datei: Texture.h
************************************************************************************/

View File

@@ -0,0 +1,43 @@
#pragma once
struct SVUMeter
{
const static int m_iBufferLength= 441;
float m_fVUData[ m_iBufferLength ];
int m_iLastPos;
SVUMeter()
{
m_iLastPos= 0;
for( int i= 0; i < m_iBufferLength; ++i )
{
m_fVUData[ i ]= 0.0f;
}
}
void Set( int iPos,
float fVal )
{
iPos= iPos % m_iBufferLength;
while( true )
{
m_fVUData[ m_iLastPos ]= fVal;
if( m_iLastPos != iPos )
{
m_iLastPos++;
m_iLastPos= m_iLastPos % m_iBufferLength;
}
else
{
break;
}
}
}
float Get( int iPos )
{
iPos= iPos % m_iBufferLength;
return m_fVUData[ iPos ];
}
};

View File

@@ -0,0 +1,84 @@
#include "defines.h"
#include "Water.h"
#include "shader.h"
#include "globals.h"
#include "intrin.h"
void Water::Init()
{
}
void Water::Update(const D3DXMATRIX &mView, const D3DXMATRIX &mProj)
{
// Mirror reflection
D3DXMATRIX mMirror;
D3DXMatrixIdentity(&mMirror);
mMirror._22 = -1.0f;
mMirror._42 = 2.0f * m_fWaterLevel;
m_ViewMatrix = mMirror * mView;
// Extract new view position
m_ViewPos.x = -(m_ViewMatrix._41 * m_ViewMatrix._11 + m_ViewMatrix._42 * m_ViewMatrix._12 + m_ViewMatrix._43 * m_ViewMatrix._13);
m_ViewPos.y = -(m_ViewMatrix._41 * m_ViewMatrix._21 + m_ViewMatrix._42 * m_ViewMatrix._22 + m_ViewMatrix._43 * m_ViewMatrix._23);
m_ViewPos.z = -(m_ViewMatrix._41 * m_ViewMatrix._31 + m_ViewMatrix._42 * m_ViewMatrix._32 + m_ViewMatrix._43 * m_ViewMatrix._33);
// Extract camera direction
m_ViewDir.x = m_ViewMatrix._13;
m_ViewDir.y = m_ViewMatrix._23;
m_ViewDir.z = m_ViewMatrix._33;
float fEyeHeight = -(mView._41 * mView._21 + mView._42 * mView._22 + mView._43 * mView._23);
float fReflectionClipHeight = m_fWaterLevel
- min(max(fEyeHeight - m_fWaterLevel, 0.0f), 64.0f) / 32.0f;
// Clip reflection
m_ProjMatrix = ObliqueProjectionMatrix(m_ViewMatrix, mProj,
D3DXPLANE(0.0f, -1.0f, 0.0f, fReflectionClipHeight));
}
/// Returns the sign of the given value
inline float Sign0(float v)
{
return (v > 0.0f) ? 1.0f : ((v < 0.0f) ? -1.0f : 0.0f);
}
// Computes a projection matrix that contains the given plane as near plane
D3DXMATRIX Water::ObliqueProjectionMatrix(const D3DXMATRIX &mView, const D3DXMATRIX &mProjection, const D3DXPLANE &clipPlane)
{
// Compute inverse transpose (orthogonal matrix)
D3DXMATRIX mViewInverseTranspose = mView;
mViewInverseTranspose._14 = -(mView._41 * mView._11 + mView._42 * mView._12 + mView._43 * mView._13);
mViewInverseTranspose._24 = -(mView._41 * mView._21 + mView._42 * mView._22 + mView._43 * mView._23);
mViewInverseTranspose._34 = -(mView._41 * mView._31 + mView._42 * mView._32 + mView._43 * mView._33);
mViewInverseTranspose._41 = mView._14;
mViewInverseTranspose._42 = mView._24;
mViewInverseTranspose._43 = mView._34;
// Transform plane to view space
D3DXPLANE viewClipPlane = -clipPlane;
D3DXPlaneTransform(&viewClipPlane, &viewClipPlane, &mViewInverseTranspose);
// Check clip plane orientation
if(viewClipPlane.d > -0.001f)
return mProjection;
// Compute view-space corner point
D3DXVECTOR4 vFarCorner = D3DXVECTOR4(
Sign0(viewClipPlane.a + mProjection._31) / mProjection._11,
Sign0(viewClipPlane.b + mProjection._32) / mProjection._22,
-1.0f,
(1.0f + mProjection._33) / mProjection._43 );
// Scale clip plane
D3DXPLANE projClipPlane = viewClipPlane * (1.0f / D3DXPlaneDot(&viewClipPlane, &vFarCorner));
// Modify projection matrix
return D3DXMATRIX(mProjection._11, mProjection._12, projClipPlane.a, mProjection._14,
mProjection._21, mProjection._22, projClipPlane.b, mProjection._24,
mProjection._31, mProjection._32, projClipPlane.c, mProjection._34,
mProjection._41, mProjection._42, projClipPlane.d, mProjection._44);
}

View File

@@ -0,0 +1,60 @@
#pragma once
/***********************************************************************************/
/** \file Water.h
** \brief Header File zur Klasse Water
*************************************************************************************
** Autor: Christian Roesch
*************************************************************************************
** _tut nichts_
**
*//*********************************************************************************/
#ifndef _WATER_H
#define _WATER_H
// includes
#include <d3dx9.h>
#include <cassert>
// Klassen-Deklaration
extern IDirect3DDevice9* g_d3d_device;
/***********************************************************************************/
/** \brief Water _tut nichts_
*************************************************************************************
** Genau genommen _tut dies nichts_
**
*//*********************************************************************************/
class Water
{
public:
float m_fWaterLevel;
static const int MaxSplitCount = 16;
void Init();
void Update(const D3DXMATRIX &mView, const D3DXMATRIX &mProj);
D3DXMATRIX m_ViewMatrix;
D3DXMATRIX m_ProjMatrix;
D3DXVECTOR3 m_ViewPos;
D3DXVECTOR3 m_ViewDir;
private:
/// Computes a projection matrix that contains the given plane as near plane
D3DXMATRIX ObliqueProjectionMatrix(const D3DXMATRIX &mView, const D3DXMATRIX &mProjection,
const D3DXPLANE &clipPlane);
};
#endif//_Water_H
class Water;
/************************************************************************************
** Ende der Datei: Water.h
************************************************************************************/

View File

@@ -0,0 +1,73 @@
#pragma once
struct SVertexBar
{
FLOAT x, y, z;
DWORD dwColor;
};
const DWORD c_dwFVFBar= D3DFVF_XYZ|D3DFVF_DIFFUSE;
SVertexBar g_VertBar[]=
{
{ -1.0f, -1.0f, 5.0f, 0xff000000 },
{ -1.0f, 1.0f, 5.0f, 0xff000000 },
{ 1.0f, -1.0f, 5.0f, 0xff000000 },
{ 1.0f, 1.0f,5.0f, 0xff000000 },
};
void RenderBars()
{
g_d3d_device->SetRenderState( D3DRS_LIGHTING, FALSE );
g_d3d_device->SetRenderState( D3DRS_ZENABLE, FALSE );
g_d3d_device->SetRenderState( D3DRS_ALPHATESTENABLE, FALSE );
g_d3d_device->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE );
g_d3d_device->SetRenderState( D3DRS_CULLMODE, D3DCULL_NONE );
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_DIFFUSE );
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_DIFFUSE );
g_d3d_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1 );
g_d3d_device->SetTextureStageState( 0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE );
D3DXMATRIX mat;
D3DXMatrixOrthoLH(
&mat,
(float)c_iScreenSizeX,
-(float)c_iScreenSizeY,
1.0f,
8.0f );
g_d3d_device->SetTransform( D3DTS_PROJECTION, &mat );
D3DXMatrixIdentity( &mat );
g_d3d_device->SetTransform( D3DTS_VIEW, &mat );
g_d3d_device->SetTransform( D3DTS_WORLD, &mat );
float fBarHeight= (float)( c_iScreenSizeY - c_iRealScreenY ) * 0.5f;
for( int i= -1; i <= 1; i+= 2 )
{
g_VertBar[ 0 ].x= -(float)c_iScreenSizeX * 0.5f - 10.0f;
g_VertBar[ 0 ].y= (float)i * ( (float)c_iScreenSizeY * 0.5f + 10.0f );
g_VertBar[ 1 ].x= -(float)c_iScreenSizeX * 0.5f - 10.0f;
g_VertBar[ 1 ].y= (float)i * ( (float)c_iScreenSizeY * 0.5f - fBarHeight );
g_VertBar[ 2 ].x= (float)c_iScreenSizeX * 0.5f + 10.0f;
g_VertBar[ 2 ].y= (float)i * ( (float)c_iScreenSizeY * 0.5f + 10.0f );
g_VertBar[ 3 ].x= (float)c_iScreenSizeX * 0.5f + 10.0f;
g_VertBar[ 3 ].y= (float)i * ( (float)c_iScreenSizeY * 0.5f - fBarHeight );
g_d3d_device->SetFVF( c_dwFVFBar );
g_d3d_device->DrawPrimitiveUP(
D3DPT_TRIANGLESTRIP,
2,
g_VertBar,
sizeof( SVertexBar )
);
}
}

View File

@@ -0,0 +1,15 @@
1
98304 -1769472 256 535.946 -162.758 -727.05 0.528012 0.518 0 2.5 1 2 -1
229376 -2228224 512 446.024 -50.2737 -568.231 0.387012 0.173 0 2.5 1 2 -1
131072 -1769472 0 392.778 -23.105 -461.411 0.402012 -0.000999899 0 2.5 1 2 -1
131072 -1769472 0 359.845 -18.091 -380.603 0.387012 0.0140001 0 2.5 1 2 -1
131072 -1769472 64 328.781 -15.8439 -300.023 0.366012 -0.0609999 0 2.5 1 2 -1
131072 -1736704 0 305.205 -12.769 -220.326 0.309012 -0.0429999 0 2.5 1 2 -1
98304 -1736704 0 238.041 -11.8258 -200.246 -0.404988 -0.0429999 0 2.5 1 2 -1
65536 -1736704 0 179.447 -2.13206 -196.481 1.71301 -0.0609999 0 2.5 1 2 -1
65536 -1736704 0 130.192 -0.554431 -210.416 1.16401 0.0080001 0 2.5 1 2 -1
65536 -1736704 0 84.5052 -0.707465 -193.233 0.888011 0.0140001 0 2.5 1 2 -1
65536 -1736704 0 60.7442 0.801214 -182.173 0.687011 0.104 0 2.5 1 2 -1
65536 -1736704 0 20.8194 1.91127 -192.842 -0.590989 0.107 0 2.5 1 2 -1
65536 -1736704 0 4.27645 4.2192 -190.699 -1.04099 0.209 0 2.5 1 2 -1
65536 -1736704 0 -2.91621 5.65886 -191.777 -1.06799 0.209 0 2.5 1 2 -1

View File

@@ -0,0 +1,8 @@
2
32768 1673749 256 -619.057 4.12432 1159.72 -15.213 1.497 0 -0.0625 1 2 -1
65536 1687552 0 -610.353 5.47902 1143.59 -15.213 1.497 0 0.125 1 2 -1
65536 1687552 0 -600.624 6.99332 1125.57 -15.213 1.497 0 1.09375 1 2 -1
65536 1687552 0 -591.106 8.47477 1107.94 -15.213 1.497 0 1.8125 1 2 -1
65536 1687552 0 -579.935 9.3357 1092.42 -15.066 0.183 0 4.1875 1 2 -1
65536 1687552 0 -568.014 10.2545 1075.86 -15.066 0.0209998 0 13.8125 1 2 -1
65536 1687552 0 -551.998 11.4889 1053.62 -15.084 -0.0450002 0 13.8125 1 2 -1

View File

@@ -0,0 +1,9 @@
2
32768 -933888 0 -31.5672 7.26193 429.969 1.821 0.0079999 0 4.5 1 2 -1
32768 -933888 0 -27.9271 7.26193 415.726 1.929 -0.0250001 0 4.5625 1 2 -1
32768 -933888 0 -22.9083 7.26193 402.32 2.22 -0.142 0 4.5 1 2 -1
32768 -933888 0 -16.0532 7.26193 391.582 2.41201 -0.193 0 4.5 1 2 -1
32768 -933888 0 2.53725 7.26193 375.651 2.53201 -0.226 0 4.5 1 2 -1
32768 -933888 0 18.0491 7.26193 367.857 2.62201 -0.265 0 4.625 1 2 -1
32768 -933888 0 29.2024 7.26193 362.707 2.76601 -0.319 0 4.5 1 2 -1
32768 -933888 0 40.7302 7.26193 358.162 2.78401 -0.331 0 4.875 1 2 -1

View File

@@ -0,0 +1,9 @@
2
32768 -1152170 256 -388.809 97.9653 57.3876 4.293 0.451999 0 3.3125 1 2 -1
49152 -1152170 128 -332.951 71.5833 38.0275 4.47899 0.371 0 4.3125 1 2 -1
49152 -1127594 256 -298.146 60.2924 33.1761 4.59898 0.296 0 4.0625 1 2 -1
49152 -1078442 256 -254.353 48.0945 -16.025 4.73097 0.212 0 3.9375 1 2 -1
49152 -1029290 256 -209.076 42.4666 -83.6222 5.06696 0.134 0 3.8125 1 2 -1
49152 -980138 256 -155.226 30.4756 -152.27 5.45095 0.0559996 0 3.8125 1 2 -1
49152 -930986 256 -105.829 16.298 -201.189 5.80494 -0.0700004 0 3.5625 1 2 -1
49152 -881834 256 -70.6753 16.298 -216.448 5.90394 -0.0820004 0 3.8125 1 2 -1

View File

@@ -0,0 +1,17 @@
2
32768 -1736704 0 -124.892 57.3811 266.716 -2.676 0.344 0 3.5625 1 2 -1
49152 -1736704 0 -126.368 41.1807 209.292 -2.487 0.242 0 4.9375 1 2 -1
49152 -1736704 0 -93.4319 28.1445 171.427 -2.337 0.23 0 4.4375 1 2 -1
49152 -1736704 0 -41.8932 14.1238 137.163 -1.974 0.155 0 3.5625 1 2 -1
49152 -1736704 0 -1.6593 14.3062 125.151 -2.118 0.00199989 0 3.4375 1 2 -1
49152 -1736704 0 25.5644 17.9652 118.81 -2.922 0.107 0 3.4375 1 2 -1
49152 -1736704 0 48.192 23.0855 103.741 -3.918 -0.043 0 2.8125 1 2 -1
49152 -1736704 0 63.418 26.4446 89.5194 -4.443 -0.226 0 3.5625 1 2 -1
49152 -1736704 0 74.8424 29.3657 81.1522 -4.731 -0.112 0 3.5625 1 2 -1
49152 -1736704 0 90.7341 33.6623 70.0309 -5.06999 0.179 0 5.3125 1 2 -1
49152 -1736704 0 108.009 37.2439 59.4516 -5.10598 0.197 0 5.3125 1 2 -1
49152 -1736704 0 125.296 41.3295 45.3239 -5.27698 0.212 0 5.3125 1 2 -1
49152 -1736704 0 145.309 46.9206 21.5443 -5.31298 0.281 0 5.3125 1 2 -1
49152 -1736704 0 192.396 65.4099 -0.35717 -5.16599 0.371 0 5.4375 1 2 -1
49152 -1736704 0 245.39 101.996 -33.3431 -5.148 0.404 0 5.0625 1 2 -1
49152 -1736704 0 287.133 130.728 -86.5936 -5.304 0.392 0 3.5625 1 2 -1

View File

@@ -0,0 +1,9 @@
10
32768 1177374 256 -36.9555 -0.708456 -43.1076 -0.00599966 0.0560001 0 2.5 1 2 -1
32768 1196032 64 -36.8996 -1.19202 -34.4816 -0.00899966 0.0560001 0 2.5 1 2 -1
32768 1204224 64 -15.9377 -4.54803 -28.388 0.366 -0.000999904 0 2.5 1 2 -1
32768 1212416 64 7.26778 -4.84548 -32.6627 0.588 0.0860001 0 2.5 1 2 -1
32768 1220608 64 16.654 -6.1544 -31.7887 0.639 0.0650001 0 2.5 1 2 -1
32768 1228800 64 26.0385 -5.96161 -25.1148 0.786 0.0500001 0 2.5 1 2 -1
32768 1236992 64 34.2396 -6.66313 -17.5941 1.098 0.0230001 0 2.5 1 2 -1
32768 1245184 64 40.0844 -6.57907 -11.9354 1.335 0.0260001 0 2.5 1 2 -1

View File

@@ -0,0 +1,11 @@
4
32768 -334082 256 -62.3405 21.3713 30.5454 -2.139 0.374 0 2.75 1 2 -1
32768 -301314 256 -34.8814 14.4864 32.8275 -2.385 0.338 0 2.75 1 2 -1
32768 -268546 256 -15.1627 9.78251 30.205 -2.667 0.284 0 2.75 1 2 -1
32768 -235778 256 0.743583 6.44605 22.04 -3.216 0.281 0 2.5 1 2 -1
32768 -203010 256 6.20352 4.44633 13.6809 -3.474 0.269 0 2 1 2 -1
32768 -170242 256 9.33275 3.2248 6.92518 -3.759 0.242 0 2 1 2 -1
32768 -137474 256 11.4483 2.52634 0.692521 -4.101 0.215 0 2 1 2 -1
32768 -104706 256 26.3484 3.22278 -12.7903 -5.082 0.206 0 3.75 1 2 -1
32768 -71938 256 28.0253 5.16693 -25.4061 -5.553 0.263 0 4 1 2 -1
32768 -39170 256 26.6674 6.67626 -32.3962 -5.82 0.29 0 2 1 2 -1

View File

@@ -0,0 +1,6 @@
3
32768 -301314 256 -34.744 -15.5096 -45.0764 -0.561001 -0.145 0 3.875 1 2 -1
65536 -268546 256 -23.4102 -15.5096 -49.5839 -0.279001 -0.151 0 3.875 1 2 -1
65536 -203010 256 0.0122138 -15.5096 -50.4801 0.134999 -0.154 0 3.875 1 2 -1
65536 -137474 256 16.4006 -15.5096 -43.9951 0.497999 -0.148 0 3.875 1 2 -1
65536 -71938 256 25.2775 -15.5096 -36.1988 0.818999 -0.142 0 3.875 1 2 -1

View File

@@ -0,0 +1,6 @@
3
131072 0 256 -11.324 -0.676989 -24.3887 0.12 -0.00100032 0 2.5 1 2 -1
196608 -16384 256 -9.73796 -0.676989 -24.1974 0.12 -0.00100032 0 2.5 1 2 -1
131072 180224 256 12.0735 -0.676989 -21.5674 0.12 -0.00100032 0 2.5 1 2 -1
131072 311296 256 16.1885 -0.676989 -21.0712 0.12 -0.00100032 0 2.5 1 2 -1
131072 442368 256 16.4849 -0.676989 -21.0355 0.12 -0.00100032 0 2.5 1 2 -1

View File

@@ -0,0 +1,14 @@
4
32768 -175172 256 -27.1669 -0.32792 11.8315 -0.522 -0.0310003 0 2.5 1 2 -1
32768 -32768 256 -24.5178 -0.32792 10.3077 -0.522 -0.0310003 0 2.5 1 2 -1
32768 0 256 -13.1381 -0.168028 5.89672 -0.951 -0.0430003 0 2.5 1 2 -1
32768 32768 256 -8.67349 -0.0301818 2.86341 -1.278 -0.0670003 0 2 1 2 -1
32768 65536 256 -12.9436 -0.448843 -5.80051 -1.146 -0.0580003 0 2 1 2 -1
32768 98304 256 -13.7346 -0.528373 -22.9123 -0.663 0.0319997 0 2.5 1 2 -1
32768 131072 256 -11.8763 -0.444457 -31.1712 -0.489 -0.0400003 0 3.125 1 2 -1
32768 163840 256 -10.278 -0.589764 -34.9629 -0.396 -0.0700003 0 3.25 1 2 -1
32768 196608 256 -9.21948 -0.735447 -37.1858 -0.309 -0.0910003 0 3.125 1 2 -1
32768 229376 256 -6.91458 -1.04283 -40.5285 -0.216 -0.124 0 3.5 1 2 -1
32768 262144 256 -4.43393 -1.44347 -44.3588 -0.153 -0.133 0 3.5 1 2 -1
32768 294912 256 -3.22926 -1.57705 -45.5439 -0.114 -0.133 0 3.5 1 2 -1
32768 327680 256 -1.11094 -1.86705 -47.8313 -0.0510002 -0.145 0 2.5 1 2 -1

View File

@@ -0,0 +1,9 @@
4
32768 1568768 256 66.7793 25.6386 -32.5957 0.882 0.515 0 2.5 1 2 -1
49152 1601536 256 40.35 10.8473 -23.4672 0.888 0.5 0 2.5 1 2 -1
49152 1650688 256 7.29761 1.31376 -15.7768 0.375 0.2 0 2.5 1 2 -1
49152 1699840 256 -2.99077 0.240247 -10.0988 -0.249 0.0919998 0 2.5 1 2 -1
49152 1748992 256 -11.7294 0.540545 -7.01281 -1.047 0.0919998 0 2.5 1 2 -1
49152 1798144 256 -21.8017 1.80115 -0.39015 -1.59 0.164 0 2.5 1 2 -1
49152 1847296 256 -23.5392 2.1035 1.32416 -1.701 0.158 0 2.5 1 2 -1
49152 1896448 256 -24.4776 2.28486 2.6441 -1.764 0.158 0 2.5 1 2 -1

View File

@@ -0,0 +1,9 @@
6
32768 519740 256 11.6958 -10.8599 -10.3648 1.104 -0.922001 0 2.11719 1 2 -1
32768 552508 256 9.28745 -9.05161 -11.2906 0.921002 -0.817001 0 2.11719 1 2 -1
32768 585276 256 6.11066 -8.49967 -13.416 0.534002 -0.634001 0 2.11719 1 2 -1
32768 618044 256 1.41372 -7.30899 -16.3092 0.153002 -0.451001 0 2.11719 1 2 -1
32768 650812 256 -5.32336 -5.43312 -14.9772 -0.173998 -0.382001 0 2.11719 1 2 -1
32768 683580 256 -10.5836 -6.83504 -17.9429 -0.503998 -0.280001 0 2.11719 1 2 -1
32768 716348 256 -17.8868 -8.30795 -18.6364 -0.899998 -0.286 0 2.11719 1 2 -1
32768 749116 256 -25.3316 -7.97327 -15.3351 -1.305 -0.0880004 0 2.11719 1 2 -1

View File

@@ -0,0 +1,13 @@
6
32768 1608356 256 -47.7182 2.79546 51.8739 3.465 0.0979998 0 6.625 1 2 -1
32768 1641124 256 -42.8045 1.35655 35.8684 3.672 0.0889998 0 6 1 2 -1
32768 1673892 256 -32.0818 0.156586 24.0479 3.816 0.0439998 0 6.1875 1 2 -1
32768 1706660 256 -16.6732 -1.08024 26.356 3.594 0.0289998 0 2.625 1 2 -1
32768 1739428 256 -6.08733 -2.35409 29.203 3.309 -0.0100002 0 2.625 1 2 -1
32768 1772196 256 9.69548 -2.12579 32.1472 2.742 0.0139998 0 2.625 1 2 -1
32768 1804964 256 23.4781 -1.6868 34.5042 2.538 0.0379998 0 2.875 1 2 -1
32768 1837732 256 40.0204 -2.29572 40.8002 2.466 0.0289998 0 3 1 2 -1
32768 1870500 256 57.8207 -2.26828 37.7179 2.094 0.0859998 0 3.25 1 2 -1
32768 1903268 256 70.1905 -6.13772 23.8911 1.827 -0.00100023 0 3.25 1 2 -1
32768 1936036 256 78.5832 -6.50445 -0.396624 1.512 0.0409998 0 2 1 2 -1
32768 1968804 256 73.8213 -11.31 -25.8539 1.188 0.00499977 0 2 1 2 -1

View File

@@ -0,0 +1,15 @@
5
32768 1608356 256 -6.06053 6.41822 2.87717 -2.106 0.686 0 2.5 1 2 -1
40960 1507328 384 -6.55361 6.41822 2.04557 -2.106 0.686 0 0.375 1 2 -1
40960 1568768 384 -7.0467 6.41822 1.21396 -2.106 0.686 0 1.875 1 2 -1
40960 1630208 384 -7.53978 6.41822 0.382358 -2.106 0.686 0 2.5 1 2 -1
40960 1691648 384 -9.71231 4.85478 -0.911884 -2.04 0.515 0 2.5 1 2 -1
40960 1753088 384 -12.4462 4.28906 -3.47153 -1.809 0.425 0 2.5 1 2 -1
40960 1814528 384 -15.7924 0.872883 -7.17304 -1.554 0.179 0 2.5 1 2 -1
40960 1875968 384 -17.1369 -2.39222 -8.71206 -1.434 -0.0190004 0 2.5 1 2 -1
40960 1937408 384 -20.1308 -5.09483 -11.762 -1.269 -0.13 0 2.5 1 2 -1
40960 1998848 384 -21.1099 -6.7738 -14.049 -1.212 -0.205 0 2.5 1 2 -1
40960 2060288 384 -21.6813 -7.97042 -15.7944 -1.149 -0.244 0 2.5 1 2 -1
40960 2121728 384 -21.6799 -9.01157 -17.3406 -1.095 -0.274 0 2.5 1 2 -1
40960 2183168 384 -21.3403 -9.47694 -17.6984 -1.026 -0.31 0 2.5 1 2 -1
40960 2244608 384 -21.5285 -10.2114 -18.9227 -0.96 -0.337 0 2.5 1 2 -1

View File

@@ -0,0 +1,9 @@
11
32768 824500 256 2.78439 0.500916 1.25343 4.395 0.0289991 0 0.67969 2.01563 2 -1
98304 327680 256 2.70966 0.428948 1.27798 4.395 0.0289991 0 0.36719 2.01563 2 -1
65536 425984 256 1.87129 0.306881 1.63385 4.359 -0.0220009 0 0.96094 1.21875 2 -1
65536 491520 256 -0.194449 -0.840315 2.83662 4.212 -0.334001 0 1.89844 1 2 -1
65536 557056 256 -3.16433 -2.30558 7.42974 3.93 -0.241001 0 3.17969 1 2 -1
65536 622592 256 -0.161348 -4.67301 17.4763 3.231 -0.016001 0 3.11719 1 2 -1
65536 688128 256 -3.92215 -4.55654 28.9598 3.177 0.037999 0 3.17969 1.21875 2 -1
65536 688128 256 -0.543229 -3.75249 40.6929 2.976 0.076999 0 3.17969 1.21875 2 -1

View File

@@ -0,0 +1,8 @@
11
32768 185564 256 -75.4355 32.5022 -20.2291 4.78499 0.535999 0 3.11719 1 2 -1
32768 458752 512 -51.7338 21.3845 -27.6149 5.03999 0.427999 0 3.86719 1 2 -1
32768 524288 256 -30.819 7.12523 -21.9975 5.56799 0.0889988 0 3.11719 1 2 -1
32768 557056 256 -7.25905 -0.114094 3.86062 5.85598 0.0799988 0 2.99219 1 2 -1
32768 589824 256 -0.724621 -3.5005 18.2145 5.85598 0.0799988 0 3.24219 1 2 -1
32768 622592 256 3.73549 -4.36351 28.0118 5.85598 0.0799988 0 2.36719 1 2 -1
32768 655360 256 8.06916 -5.20205 37.5314 5.85598 0.0799988 0 3.11719 1 2 -1

View File

@@ -0,0 +1,9 @@
11
32768 458752 256 -39.7171 -6.99422 -38.7857 5.442 0.0349988 0 3.24219 1 2 -1
65536 1261568 1024 -31.2342 -7.05388 -43.9212 5.72399 0.0169988 0 3.24219 1 2 -1
49152 1523712 1024 3.27187 -6.81398 -40.8278 6.61799 -0.0520012 0 3.24219 1 2 -1
49152 1720320 1024 22.8518 -7.78914 -21.2575 7.07399 -0.0490012 0 3.24219 1 2 -1
49152 1916928 1024 34.6751 -8.37908 -7.42018 7.40698 -0.0850012 0 3.24219 1 2 -1
49152 2113536 1024 42.9226 -7.9546 14.6386 7.92598 -0.154001 0 3.24219 1 2 -1
49152 2310144 1024 54.2219 -9.93917 31.8248 8.29799 -0.193001 0 3.24219 1 2 -1
49152 2506752 1024 57.3591 -13.428 57.0378 8.62199 -0.187001 0 3.24219 1 2 -1

View File

@@ -0,0 +1,7 @@
12
32768 4460838 256 29.3135 1.18206 -27.9545 0.783 0.0259999 0 2.5 1 2 -1
196608 4276224 256 24.196 1.0729 -30.3182 0.489 0.0589999 0 2.5 1 2 -1
196608 4472832 256 2.88322 1.16575 -36.0775 0.00900011 0.143 0 4.125 1 2 -1
196608 4669440 256 -7.16899 1.81084 -37.7193 -0.375 0.137 0 4.125 1 2 -1
196608 4866048 256 -18.271 1.73325 -29.377 -0.681 0.0949999 0 4.125 1 2 -1
196608 5062656 256 -25.2563 1.86065 -24.6269 -0.873 0.0769999 0 2.5 1 2 -1

View File

@@ -0,0 +1,8 @@
13
32768 1641888 256 253.02 21.5927 148.092 2.016 -0.0879998 0 4.375 1 2 -1
98304 1646592 64 251.496 20.4644 184.287 2.217 -0.0699998 0 4.375 1 2 -1
98304 1671168 64 271.173 17.7441 224.107 2.274 -0.0759998 0 4.375 1 2 -1
98304 1695744 64 278.338 14.5324 271.88 2.418 -0.0879998 0 4.375 1 2 -1
98304 1720320 64 280.836 10.603 314.171 2.598 -0.127 0 4.375 1 2 -1
98304 1744896 64 277.94 8.48989 330.249 2.763 -0.184 0 4.375 1 2 -1
98304 1769472 64 279.282 8.09333 378.006 2.793 -0.199 0 4.375 1 2 -1

View File

@@ -0,0 +1,5 @@
13
32768 1744896 256 277.94 8.48989 330.249 2.763 -0.184 0 4.375 1 2 -1
655360 1744896 0 277.94 8.48989 330.249 2.763 -0.184 0 4.375 1 2 -1
32768 1744896 0 277.94 8.48989 330.249 2.763 -0.184 0 4.375 1 2 -1
32768 1744896 0 277.94 8.48989 330.249 2.763 -0.184 0 4.375 1 2 -1

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,169 @@
#pragma once
#include <d3dx9.h>
const int g_iCamTickFactor= 2 << 14;
#if defined(CAMERATESTER) || defined(MESHTESTER)
#include "TextFileReader.h"
#include "StringHelper.h"
#include "EditorHelp.h"
#include <fstream>
#include <sstream>
#include <cstdio>
#endif
#if defined(CAMERATESTER)
#define CAMERAEDIT
#endif
struct SCameraDefinition
{
D3DXVECTOR3 m_vec3Pos;
D3DXVECTOR3 m_vec3Rot;
float m_fDOF;
float m_fFOV;
int m_iDemoTime;
int m_iScene;
};
struct SCameraKey
{
int m_dwTime;
int m_dwDemoTimeStart;
int m_dwDemoTimeSpeed;
float m_fPos[ 3 ];
float m_fRot[ 3 ];
float m_fDOF;
float m_fFOV;
float m_fTangentOffset[ 2 ];
#ifdef CAMERATESTER
void ToString( std::string& strData );
void FromString( std::string& strData );
void Reset();
void FromCameraDefinition( SCameraDefinition& camDef );
void ToCameraDefinition( SCameraDefinition& camDef );
#endif CAMERATESTER
};
struct SActCamData
{
SCameraKey* m_pCamData;
int m_iMaxStepCount;
int m_iScene;
};
void InterpolateCamLocal( SActCamData* pData, int iIndex, int dwLocalTime, SCameraDefinition& Out );
int CalcCamGlobal( SActCamData* pData, int dwTime, SCameraDefinition& Out );
#ifndef CAMERATESTER
void PreparePlayCam();
void PlayCam( int iRealTimePassed, SCameraDefinition& CamData );
#endif
/*
void drawLine( D3DXVECTOR3& pvec3Pos1,
D3DXVECTOR3& pvec3Pos2,
DWORD dwColor )
{
//g_pMatrixStack->LoadIdentity();
//g_d3d_device->SetTransform( D3DTS_WORLD, g_pMatrixStack->GetTop() );
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TFACTOR );
g_d3d_device->SetTextureStageState( 0, D3DTSS_COLOROP, D3DTOP_SELECTARG1 );
g_d3d_device->SetTextureStageState( 0, D3DTSS_ALPHAOP, D3DTOP_DISABLE );
g_d3d_device->SetTextureStageState( 1, D3DTSS_COLOROP, D3DTOP_DISABLE );
g_d3d_device->SetRenderState( D3DRS_FOGENABLE, FALSE );
g_d3d_device->SetRenderState( D3DRS_ZENABLE, FALSE );
g_d3d_device->SetRenderState( D3DRS_LIGHTING, FALSE );
SVertex v[ 3 ];
g_d3d_device->SetRenderState( D3DRS_TEXTUREFACTOR, dwColor );
v[ 0 ].x= pvec3Pos1.x;
v[ 0 ].y= pvec3Pos1.y;
v[ 0 ].z= pvec3Pos1.z;
v[ 1 ].x= pvec3Pos2.x;
v[ 1 ].y= pvec3Pos2.y;
v[ 1 ].z= pvec3Pos2.z;
g_d3d_device->DrawPrimitiveUP( D3DPT_LINESTRIP,
1,
v,
sizeof( SVertex ));
g_d3d_device->SetRenderState( D3DRS_FOGENABLE, TRUE );
g_d3d_device->SetRenderState( D3DRS_ZENABLE, TRUE );
}*/
#if defined(CAMERATESTER) || defined(MESHTESTER)
void HomeCam();
void UserCam( int iTime );
void GetEditCam( SCameraDefinition& CamData );
#endif
#ifdef CAMERATESTER
const int c_iCamCount= 64;
int GetCamTrackCount();
std::vector<SCameraKey>& GetCamTrack( int iIndex );
std::vector<SCameraKey>& GetEditTrack();
void ReadCameraTrack( char* pcFileName, int iTrack );
void WriteCameraTrack( char* pcFileName, int iTrack );
void ReadCamera();
void WriteCameraHeader();
void ReadCameraAll();
void WriteCameraAll();
void DrawEditOutput();
void Save();
void Reload();
void MakeTimeContinous();
void DeleteTrack();
void MoveTrack();
void ClearTrack();
void AddTrack();
void LockTrack();
void ChangeTrack();
void ChangeStep();
void EditToStep();
void VerifyStep();
void ChangeTangent( int iCount );
void ChangeStart();
void ChangeSpeed();
void ChangeLength();
void ChangeScene();
void SetStep();
void RemoveStep();
void SetStepCamera();
void ChangeStepKeys( int iPrior, int iNext );
void InterpolateCamGlobal( int iRealTimePassed, SCameraDefinition& CamData );
void DrawCameraDebugOutput();
int FillDataFromEdit(SActCamData& data);
int GetCurrentTrackStartTime();
void ResetRealTime();
void CalcCamTrackStarts();
void SetStepFromTime();
int CalculateRealTime();
int CalculateDemoTime();
void TickFreeCam( int iTime );
bool IsFreeCam();
int GetRealTime();
#endif

View File

@@ -0,0 +1,23 @@
#include "camerahelper.h"
#include "globals.h"
void FillCameraMatrix( D3DXVECTOR3 v3Pos, D3DXVECTOR3 v3Rot, D3DXMATRIX* CamMat )
{
float fYLeft= cos( v3Rot.y );
g_CamFront.x= -sin( v3Rot.x ) * fYLeft ;
g_CamFront.y= -sin( v3Rot.y );
g_CamFront.z= cos( v3Rot.x ) * fYLeft ;
D3DXVec3Normalize(&g_CamFront, &g_CamFront);
D3DXMatrixRotationYawPitchRoll( CamMat,
-v3Rot.x,
v3Rot.y,
v3Rot.z );
D3DXMATRIX CamMove;
D3DXMatrixTranslation( &CamMove, v3Pos.x, v3Pos.y, v3Pos.z );
D3DXMatrixMultiply( CamMat, CamMat, &CamMove );
D3DXMatrixInverse(CamMat, NULL, CamMat );
}

View File

@@ -0,0 +1,118 @@
#pragma once
#include <d3dx9.h>
/*
void homeCam()
{
g_CamPos.x= 0.0f;
g_CamPos.y= 60.0f;
g_CamPos.z= 75.0f;
g_CamRot.x= 3.14f;
g_CamRot.y= 0.65f;
g_CamRot.z= 0.0f;
#ifdef MESHTESTER
g_CamPos.x= 0.0f;
g_CamPos.y= 1.0f;
g_CamPos.z= -5.0f;
g_CamRot.x= 0.0f;
g_CamRot.y= 0.0f;
g_CamRot.z= 0.0f;
#endif
#ifdef PUPPETTESTER
g_CamPos.x= 0.0f;
g_CamPos.y= 1.0f;
g_CamPos.z= -5.0f;
g_CamRot.x= 0.0f;
g_CamRot.y= 0.0f;
g_CamRot.z= 0.0f;
#endif
#ifdef CURSOR3D
g_CursorPos.x= 0.0f;
g_CursorPos.y= 0.0f;
g_CursorPos.z= 0.0f;
#endif
}
void EditCam()
{
static POINT OldCurPos;
POINT CurPos;
GetCursorPos( &CurPos );
if( GetAsyncKeyState( VK_HOME ) )
{
homeCam();
}
if( GetAsyncKeyState( VK_MBUTTON ) || GetAsyncKeyState( VK_RBUTTON ) )
{
g_CamRot.x+= 0.002f * ( OldCurPos.x - CurPos.x );
g_CamRot.y-= 0.002f * ( OldCurPos.y - CurPos.y );
g_CamRot.y= max( g_CamRot.y, -1.56f );
g_CamRot.y= min( g_CamRot.y, 1.56f );
static float fSpeedA= 0.0f;
if( GetAsyncKeyState( VK_UP ) )
{
fSpeedA= max( fSpeedA, 0.0f );
fSpeedA+= 0.01f;
g_CamPos+= fSpeedA * g_CamFront;
}
else if( GetAsyncKeyState( VK_DOWN ) )
{
fSpeedA= min( fSpeedA, 0.0f );
fSpeedA-= 0.01f;
g_CamPos+= fSpeedA * g_CamFront;
}
else
{
fSpeedA= 0.0f;
}
static float fSpeedB= 0.0f;
if( GetAsyncKeyState( VK_RIGHT ) )
{
fSpeedB= max( fSpeedB, 0.0f );
fSpeedB+= 0.01f;
g_CamPos+= fSpeedB * g_CamRight;
}
else if( GetAsyncKeyState( VK_LEFT ) )
{
fSpeedB= min( fSpeedB, 0.0f );
fSpeedB-= 0.01f;
g_CamPos+= fSpeedB * g_CamRight;
}
else
{
fSpeedB= 0.0f;
}
static float fSpeedC= 0.0f;
if( GetAsyncKeyState( VK_NUMPAD1 ) )
{
fSpeedC= max( fSpeedC, 0.0f );
fSpeedC+= 0.01f;
g_CamPos.y+= fSpeedC;
}
else if( GetAsyncKeyState( VK_NUMPAD0 ) )
{
fSpeedC= min( fSpeedC, 0.0f );
fSpeedC-= 0.01f;
g_CamPos.y+= fSpeedC;
}
else
{
fSpeedC= 0.0f;
}
}
OldCurPos= CurPos;
}*/
void FillCameraMatrix( D3DXVECTOR3 v3Pos, D3DXVECTOR3 v3Rot, D3DXMATRIX* CamMat );

View File

@@ -0,0 +1,77 @@
#include "cave.h"
#include "globals.h"
#include "meshdata/crystal.h"
#ifdef EXTRACODE
int m_iCrystalCount;
SCrystalInfo m_CrystalInfos[ m_iMaxCrystalCount ];
#else
#include "crystaldata.h"
#endif
void CreateCaveRenderJobs()
{
#ifdef CAVE
#ifdef EXTRACODE
OutputDebugString( "Creating cave: \n" );
DWORD dwTicks = GetTickCount();
#endif
g_CaveTerrainGrid.Init( 192, 96, &TerrainGrid::IsoSurfaceCave );
g_CaveGroundTerrainGrid.Init( 96, 48, &TerrainGrid::IsoSurfaceCaveGround );
#ifdef EXTRACODE
char cTime[128];
dwTicks = GetTickCount() - dwTicks;
sprintf_s( cTime, "Time: %d \n", dwTicks );
OutputDebugString( cTime );
#endif
D3DXMATRIX matTerrainWorld, matTerrainPos;
D3DXMatrixScaling(&matTerrainWorld, 128, 32, 128);
D3DXMatrixTranslation(&matTerrainPos, -64, -16, -64);
D3DXMatrixMultiply(&matTerrainWorld, &matTerrainWorld, &matTerrainPos);
g_Objects[ OI_CAVE_FIRST ].m_iUsedPreShader = PreDepth;
g_Objects[ OI_CAVE_FIRST ].m_iUsedShader[ 0 ] = Cave;
g_Objects[ OI_CAVE_FIRST ].SetTransformation(matTerrainWorld);
g_Objects[ OI_CAVE_FIRST ].m_pTerrain = &g_CaveTerrainGrid;
D3DXMatrixScaling(&matTerrainWorld, 128, 16, 128);
D3DXMatrixTranslation(&matTerrainPos, -64, -24, -64);
D3DXMatrixMultiply(&matTerrainWorld, &matTerrainWorld, &matTerrainPos);
g_Objects[ OI_CAVE_GROUND_FIRST].m_iUsedPreShader = PreDepth;
g_Objects[ OI_CAVE_GROUND_FIRST ].m_iUsedShader[ 0 ] = CaveGround;
g_Objects[ OI_CAVE_GROUND_FIRST ].SetTransformation(matTerrainWorld);
g_Objects[ OI_CAVE_GROUND_FIRST ].m_pTerrain = &g_CaveGroundTerrainGrid;
#else
#endif
SetCrystalPos();
}
void SetCrystalPos()
{
for(int i= 0; i < m_iCrystalCount; ++i )
{
assert( OI_CAVE_LIGHT_FIRST + i <= OI_CAVE_LIGHT_LAST );
Renderjob* pRJ= g_Objects + OI_CAVE_LIGHT_FIRST + i;
CreateCrystal( *pRJ );
pRJ->m_iUsedPreShader= PreDepth;
pRJ->m_iUsedShader[ 0 ]= Crystal;
SCrystalInfo& ci= m_CrystalInfos[ i ];
D3DXMATRIX matResult;
D3DXMATRIX mat;
D3DXMatrixScaling( &matResult, ci.m_fScale, ci.m_fScale, ci.m_fScale );
D3DXMatrixRotationYawPitchRoll( &mat, ci.m_v3Rot.x, ci.m_v3Rot.y, ci.m_v3Rot.z );
D3DXMatrixMultiply( &matResult,&matResult,&mat);
D3DXMatrixTranslation( &mat, ci.m_v3Pos.x, ci.m_v3Pos.y, ci.m_v3Pos.z );
D3DXMatrixMultiply( &matResult,&matResult,&mat);
pRJ->SetTransformation( matResult );
}
}

View File

@@ -0,0 +1,22 @@
#pragma once
#include "defines.h"
#include <d3d9.h>
#include <d3dx9math.h>
struct SCrystalInfo
{
D3DXVECTOR3 m_v3Pos;
D3DXVECTOR3 m_v3Rot;
float m_fScale;
};
#ifdef EXTRACODE
const int m_iMaxCrystalCount= 32;
extern int m_iCrystalCount;
extern SCrystalInfo m_CrystalInfos[ m_iMaxCrystalCount ];
#else
#endif
void CreateCaveRenderJobs();
void SetCrystalPos();

View File

@@ -0,0 +1,101 @@
Crystal
Pos= 24.5 -10 -10.5
Scale= 1
Rot= -60 25 0
Crystal
Pos= 25 -10.5 -9
Scale= 0.75
Rot= -45 35 0
Crystal
Pos= 25 -10.5 -12
Scale= 0.5
Rot= -100 35 0
Crystal
Pos= 22.5 -12 -12.5
Scale= 0.45
Rot= -100 65 0
Crystal
Pos= 23 -11.5 -11
Scale= 0.35
Rot= -95 55 0
Crystal
Pos= 25 -11.25 -7.5
Scale= 0.4
Rot= -20 45 0
Crystal
Pos= 20 12 2
Scale= 0.7
Rot= 90 10 180
Crystal
Pos= 20.25 12.0 2.5
Scale= 0.55
Rot= 150 16 180
Crystal
Pos= 20.1 11.85 2.95
Scale= 0.1525
Rot= 160 34 180
Crystal
Pos= 19.7 12.0 1.6
Scale= 0.325
Rot= 60 6 201
Crystal
Pos= 10.4 13.5 -14
Scale= 0.5
Rot= 60 16 180
Crystal
Pos= 10.4 14 -14
Scale= 0.425
Rot= 39 -18 170
Crystal
Pos= -6.1 10.7 -29.8
Scale= 0.5
Rot= -60 16 180
Crystal
Pos= -5.5 10.5 -29.5
Scale= 0.325
Rot= -180 18 180
Crystal
Pos= -6.3 10.2 -30
Scale= 0.225
Rot= 60 16 180
Crystal
Pos= -16 8.5 -24
Scale= 0.3525
Rot= -110 12 180
Crystal
Pos= -15.9 8.1 -23.7
Scale= 0.2
Rot= 150 16 180
Crystal
Pos= 45.625 -2 34
Scale= 2.0
Rot= 120 8 -30
Crystal
Pos= 42 -3.7 27
Scale= 1.1
Rot= -120 25 0
Crystal
Pos= 43.5 -3.7 26.7
Scale= 0.6
Rot= 110 4 -20
Crystal
Pos= 42 -6 28.1
Scale= 1.2
Rot= -75 20 0
Crystal
Pos= 38 -4.7 28.1
Scale= 0.7
Rot= -85 15 0
Crystal
Pos= 37 -3.5 28
Scale= 0.4
Rot= -125 30 0

View File

@@ -0,0 +1,84 @@
//Magier/ Yetis
Entity
Pos= 12 -12.2 23.5
Scale= 0.75 0.75 0.75
Rot= -70 0 0
Move= 0 0 0
Time= 0 200000
Entity
Pos= 8 -19 36
Rot= -140 0 0
Scale= 0.75 0.75 0.75
Move= 0 0 0
Time= 0 200000
Entity
Pos= -12 -13.75 -16
Rot= 10 0 0
Scale= 0.75 0.75 0.75
Move= 0 0 0
Time= 0 200000
// Greets Magier
Entity
Pos= 25 -12.2 10.5
Scale= 1 1 1
Rot= -70 0 0
Move= 0 0 0
Time= 0 200000
//Enten
Entity
Pos= 96 -8 -188
Scale= 1 1 1
Rot= 150 -15 20
Move= 0 0 0
Time= -100000 150000
Entity
Pos= 73 -7.75 -168
Scale= 1 1 1
Rot= 0 70 40
Move= 0 0 0
Time= -100000 150000
//Logos
Entity
Pos= 56 -2 -160
Scale= 1 1 1
Rot= -30 75 0
Move= 0 0 0
Time= -100000 150000
Entity
Pos= 35 -2 -170
Scale= 1 1 1
Rot= -90 75 20
Move= 0 0 0
Time= -100000 150000
//Logos auftauchen
Entity
Pos= 140 -50 160
Scale= 5 5 5
Rot= 30 0 0
Move= 0 200 0
Time= 51000 3500
Entity
Pos= 250 -50 140
Scale= 5 5 5
Rot= 180 0 0
Move= 0 150 0
Time= 50500 3500
Entity
Pos= 189 3.5 394
Scale= 2.75 2.75 2.75
Rot= -140 0 0
Move= 60 0 -105
Time= 50500 3500

View File

@@ -0,0 +1,56 @@
#rundes Pieksding
#----------------------------------
SIZE000= 38 48
BASE000= 1 0
BANK000= 5.0 5.0 -32.0 0.0
OFFSET000= 5 1
BANK001= 12.0 2.5 1.0 0.2
BANK002= 6.0 3.0 2.0 1.0
HEIGHT000= 4 3
BANK003= 5.0 2.0 8.0 1.0
BANK004= 3.0 1.0 0.27 1.0
BANK005= 2.0 2.0 0.7 1.0
MIX000= 0 6
BANK006= 1.0 0.2 0.0 0.0
COLOR000= 255 224 32 32
#blob
#----------------------------------
SIZE001= 48 32
BASE001= 2 7
BANK007= 8.0 3.0 3.0 0.0
BANK007= 24.0 16.0 24.0 0.0
OFFSET001= 5 8
BANK008= 13.0 1.0 1.0 0.2
BANK009= 2.0 1.0 5.0 1.0
BANK010= 160.0 0.0 0.0 0.0
BANK011= 0.0 0.0 0.0 0.0
HEIGHT001= 4 12
BANK012= 6.0 5.0 12.0 1.0
BANK013= 3.0 1.0 0.27 1.0
BANK014= 2.0 2.0 0.7 1.0
MIX001= 4 15
BANK015= 0.15 0.15 0.325 2.0
BANK016= 3.0 7.0 0.65 1.6
BANK017= 5.0 2.0 0.85 1.4
COLOR001= 64 192 96 32

View File

@@ -0,0 +1,147 @@
float4 res : register(c0);
sampler2D colorSampler : register(s0);
sampler2D depthSampler : register(s1);
sampler2D ditherSampler : register(s2);
static float g_fRadiusBase = 0.05f;
static float g_fRadiusScale = 0.25f;
static float g_fFallOff = 0.05f;
static float g_fIntensity = 1.25f;
static float g_fGrain = 0.01f;
static float g_fRange = 256.0f;
static float g_fBlurSensitivity = 12.5f;
static const float3 vSamplePoints[12] = {
float3(0.083333f, 0.000000f, 0.083333f),
float3(-0.144338f, -0.083333f, 0.166667f),
float3(0.125000f, 0.216506f, 0.250000f),
float3(0.000000f, -0.333333f, 0.333333f),
float3(-0.208333f, 0.360844f, 0.416667f),
float3(0.433013f, -0.250000f, 0.500000f),
float3(-0.583333f, -0.000000f, 0.583333f),
float3(0.577350f, 0.333333f, 0.666667f),
float3(-0.375000f, -0.649519f, 0.750000f),
float3(-0.000000f, 0.833333f, 0.833333f),
float3(0.458333f, -0.793857f, 0.916667f),
float3(-0.866025f, 0.500000f, 1.000000f)
};
float4 ps_main(float2 TexCoord : TEXCOORD0) : COLOR0
{
// Sample random 2D matrix
float4 vRotation = tex2D(ditherSampler, TexCoord * res.xy / 32.0f) * 2.0f - 1.0f;
float2x2 mRotation = float2x2(vRotation.xy, vRotation.zw);
// Sample pixel depth
float fDepth = tex2D(depthSampler, TexCoord).x;
// Transform radius to screen space
float3 fScaledRadius = g_fRadiusBase + g_fRadiusScale / ( 8.0f + fDepth );
// Limit radius to reasonable sampling kernels
fScaledRadius = clamp(fScaledRadius, 4.0f * res.z, 64.0f * res.w);
// Transform sampling vector length back to world space
fScaledRadius.z *= fDepth;
float fOcclusion = 0.0f;
float fSampleWeight = 1.f / 18.849556f; // atan version
// float fSampleWeight = 1.f / 12.f;
// Loop over samples
for(int i = 0; i < 12; )
{
float4 fSampleDepth, fSampleRadius;
// Vectorize occlusion code
[unroll] for(int j = 0; j < 4; j++, i++)
{
// Randomly rotate scaled sample points
float3 vSampleOffset = fScaledRadius * vSamplePoints[i];
vSampleOffset.xy = mul(vSampleOffset.xy, mRotation);
// Sample depth texture
fSampleDepth[j] = tex2D(depthSampler, TexCoord + vSampleOffset.xy).x;
fSampleRadius[j] = vSampleOffset.z;
}
// Compute occlusion
float4 fDeltaDepth = (fDepth - fSampleDepth) / fSampleRadius;
float4 fAttenuation = g_fFallOff * fDeltaDepth;
float4 fBlocking = atan(fDeltaDepth) / (1.0f + max(0.0f, fAttenuation)); // atan version
// float4 fBlocking = fDeltaDepth / ( (1.0f + abs(fDeltaDepth)) * (1.0f + max(0.0f, fAttenuation)) );
fOcclusion += dot(fBlocking, fSampleWeight);
}
// Avoid ugly smudge artifacts
float2 fPixelPos = TexCoord * 2.0f - 1.0f;
float fBorderAttenuation = 1.0f - 0.7071f * dot(fPixelPos, fPixelPos);
// Write to intermediate buffer
float fAO = saturate(g_fIntensity * fOcclusion + g_fGrain) * fBorderAttenuation * step(fDepth, g_fRange);
return float4((float3)fAO, 0.f);
}
float4 ps_blur(float2 TexCoord, uniform bool bVertical)
{
float2 fStepSize = float2(1.f, bVertical ? -1.f : 1.f) * res.zw;
float3 fCenterDepths;
// Fetch 3 center depths
fCenterDepths.x = tex2D(depthSampler, TexCoord - fStepSize).x;
fCenterDepths.y = tex2D(depthSampler, TexCoord).x;
fCenterDepths.z = tex2D(depthSampler, TexCoord + fStepSize).x;
float3 fDepthContinuities, fDepthDeltas;
// Compute 3 depth continuity values
fDepthContinuities.x = tex2D(depthSampler, TexCoord - 2.0f * fStepSize).x;
fDepthContinuities.y = fCenterDepths.x;
fDepthContinuities.z = tex2D(depthSampler, TexCoord + 2.0f * fStepSize).x;
fDepthDeltas = fDepthContinuities - fCenterDepths.yzy;
fDepthContinuities += fCenterDepths.yzy - 2.0f * fCenterDepths;
// Correct AA issues
fDepthContinuities = abs(fDepthContinuities);
fDepthDeltas = abs(fDepthDeltas);
fDepthDeltas -= min(min(fDepthDeltas.x, fDepthDeltas.y), fDepthDeltas.z);
// Compute 3 weights
float3 fWeights = 1.0f / (1.0f + g_fBlurSensitivity * (fDepthContinuities + 16.f * fDepthDeltas));
float fOutput = 0.0f;
float3 fSamples;
float3 fSampleWeights = float3(3.0f, 1.5f, 1.0f);
// Blend 5 color samples respecting to the 3 depth continuity weights
fSamples.x = tex2D(colorSampler, TexCoord - 2.0f * fStepSize).x;
fSamples.y = tex2D(colorSampler, TexCoord - fStepSize).x;
fSamples.z = tex2D(colorSampler, TexCoord).x;
fOutput += dot(fSamples, fWeights.x);
fSamples.x = tex2D(colorSampler, TexCoord + fStepSize).x;
fOutput += dot(fSamples, fWeights.y);
fSamples.y = tex2D(colorSampler, TexCoord + 2.0f * fStepSize).x;
fOutput += dot(fSamples, fWeights.z);
// Average output weight
float fOutputWeight = dot(fWeights, 1.0f);
// Average output
fOutput /= 3.0f * fOutputWeight;
// Correction weight
float fCorrectionWeight = saturate(1.0f - fOutputWeight);
// Write to color buffer
fOutput = (1.0f - fCorrectionWeight) * fOutput + fCorrectionWeight * fSamples.z;
return float4((float3)fOutput, 0.f);
}
float4 ps_blur_hor(float2 TexCoord : TEXCOORD0) : COLOR0 { return ps_blur(TexCoord, false); }
float4 ps_blur_ver(float2 TexCoord : TEXCOORD0) : COLOR0 { return ps_blur(TexCoord, true); }

View File

@@ -0,0 +1,59 @@
float4 res : register(c0);
float4 glow : register(c61);
sampler2D colorSampler : register(s0);
sampler2D guideSampler : register(s4);
static float2 fGaussianWeights[] = {
float2(-3.0f, 0.015625f),
float2(-2.0f, 0.09375f),
float2(-1.0f, 0.234375f),
float2(0.0f, 0.3125f),
float2(1.0f, 0.234375f),
float2(2.0f, 0.09375f),
float2(3.0f, 0.015625f)
};
float4 ps_blur(float2 t : TEXCOORD0, uniform float2 vDir) : COLOR0
{
float2 vDelta = vDir * res.zw;
float4 fColor = 0.f;
for(int i = 0; i < 7; i++)
fColor += fGaussianWeights[i].y
* tex2D(colorSampler, t + fGaussianWeights[i].x * vDelta);
return fColor;
}
float4 ps_blur_hor(float2 t : TEXCOORD0) : COLOR0 { return ps_blur(t, float2(1.f, 0.f)); }
float4 ps_blur_ver(float2 t : TEXCOORD0) : COLOR0 { return ps_blur(t, float2(0.f, 1.f)); }
float4 ps_blur_bil(float2 t : TEXCOORD0, uniform float2 vDir) : COLOR0
{
float2 vDelta = vDir * res.zw;
float4 fGuide = tex2D(guideSampler, t);
float4 fColor = 0.f;
float fWeight = 0.f;
for(int i = 0; i < 7; i++)
{
float2 to = t + vDelta * fGaussianWeights[i].x;
float4 fSample = tex2D(colorSampler, to);
float fSampleWeight = (1.f - saturate(4.f * (fGuide.w - fSample.w))) * fGaussianWeights[i].y;
fColor += fSample * fSampleWeight;
fWeight += fSampleWeight;
}
return lerp(fGuide, fColor / fWeight, fWeight);
}
float4 ps_blur_bil_hor(float2 t : TEXCOORD0) : COLOR0 { return ps_blur_bil(t, float2(1.f, 0.f)); }
float4 ps_blur_bil_ver(float2 t : TEXCOORD0) : COLOR0 { return ps_blur_bil(t, float2(0.f, 1.f)); }
float4 ps_extract_inv_alpha(float2 t : TEXCOORD0) : COLOR0
{
float4 c = tex2D(colorSampler, t);
c.a = 2.f - 2.0f * c.a;
c.xyz *= c.a;
return c;
}

View File

@@ -0,0 +1,72 @@
float4 g_fResolution : register(c0);
float3 g_vLightDir : register(c1);
float3 g_vViewDir : register(c4);
float4 g_fGlow : register(c61);
sampler1D dif : register(s2);
sampler1D spec : register(s3);
sampler2D shadowSampler : register(s4);
sampler2D depthSampler : register(s5);
samplerCUBE envSampler : register(s6);
samplerCUBE envIntSampler : register(s7);
static float4 g_fSpecularPower = {1.15f, 1.05f, 1.0f, 1.25f};
struct psIn
{
float4 c : COLOR0;
float2 t : TEXCOORD0;
float3 n : TEXCOORD1;
float3 v : TEXCOORD2;
float4 s : TEXCOORD3;
float3 w : TEXCOORD4;
float3 o : TEXCOORD5;
};
float4 ps_main(psIn i):color
{
// Environment lighting
// return texCUBE(envIntSampler, i.n);
// Environment reflection
// return texCUBE(envSampler, reflect(-i.v, i.n));
// Shadow AA
float2 sc = i.s.xy / i.s.w;
float aa = abs( tex2D(depthSampler, sc).x - i.s.z );
float2 ddaa = float2(ddx(aa), ddy(aa));
float2 aaetc = sign(-ddaa) * g_fResolution.zw;
sc += aaetc * saturate(4.f * aa);
float3 n = normalize(i.n);
float3 v = normalize(i.v);
float3 no = normalize(i.o);
float3 fColor = i.c.xyz;
float fShadow = 0.6f + 0.4f * tex2D(shadowSampler, sc);
// return texCUBE(envSampler, reflect(g_vViewDir, i.n));
// g_vViewDir
// fColor *= texCUBE(envSampler, i.n).xyz; // * fShadow // envIntSampler
// fColor += 0.1f * texCUBE(envSampler, reflect(-i.v, i.n)).xyz;
// Lighting
float fLight = saturate( dot( n, -g_vLightDir) );
fLight = min(fShadow * fLight, fLight);
fColor.xyz *= lerp(
float3(0.7f, 0.6f, 1.0f) * tex1D( dif, fLight ),
float3(0.8f, 0.6f, 0.9f) * tex1D( dif, abs( sin(5 * fLight) ) ),
saturate( 5 * dot(no, n) ) );
// return abs( 3 * dot(no, n) );
// Specular highlights
float3 h = normalize( v + -g_vLightDir );
float hdn = saturate( dot(n, h) );
float fSpecularity = smoothstep( 0.5f, 0.9f,
abs( sin(16 * hdn) ) * ( dot( n, -g_vLightDir) > 0 ) + abs( sin(8 * dot(n, v)) ) * 0.85f );
fColor += 0.3f * fShadow * tex1D( spec, fSpecularity );
return float4( (1.0f + 1.5f * g_fGlow.w) * fColor, 0.3f );
}

View File

@@ -0,0 +1,4 @@
float4 ps_main(float4 s : TEXCOORD3):color
{
return s.z;
}

View File

@@ -0,0 +1,105 @@
float4 res : register(c0);
float2 Dist : register(c3);
sampler2D colorSampler : register(s0);
sampler2D depthSampler : register(s1);
sampler2D blurSampler : register(s4);
// Tweakables
static float g_fRadius = 0.005f;
static float g_fLowRadiusScaling = 0.4f;
static float g_fNearPlane = 1.0f;
static float g_fFocalPlane = Dist.y;
static float g_fDistScale = 1.0f / pow( g_fFocalPlane , 2.5f );
static float g_fFarPlane= 128.0f;
static const float2 vPoissonDisc[] = {
float2(-0.326212f, -0.40581f),
float2(-0.840144f, -0.07358f),
float2(-0.695914f, 0.457137f),
float2(-0.203345f, 0.620716f),
float2(0.96234f, -0.194983f),
float2(0.473434f, -0.480026f),
float2(0.519456f, 0.767022f),
float2(0.185461f, -0.893124f),
float2(0.507431f, 0.064425f),
float2(0.89642f, 0.412458f),
float2(-0.32194f, -0.932615f),
float2(-0.791559f, -0.59771f)
};
float4 ps_blur_intensity(float2 TexCoord : TEXCOORD0) : COLOR0
{
// Sample pixel depth
float fDepth = tex2D(depthSampler, TexCoord).x;
// Anti-aliasing
float4 fDDTexCoords1 = TexCoord.xyxy, fDDTexCoords2 = TexCoord.xyxy;
fDDTexCoords1.zw -= res.zw; fDDTexCoords2.zw += res.zw;
float4 fDDDepth4 = fDepth - float4(
tex2D(depthSampler, fDDTexCoords1.zy).x, tex2D(depthSampler, fDDTexCoords1.xw).x,
tex2D(depthSampler, fDDTexCoords2.zy).x, tex2D(depthSampler, fDDTexCoords2.xw).x );
// fDDDepth4 = lerp(fDDDepth4, abs(fDDDepth4), (fDDDepth4 * fDDDepth4.zwxy) > 0.f);
float2 fDeltaDepth2 = max(fDDDepth4.xy, fDDDepth4.zw);
float fDeltaDepth = max(fDeltaDepth2.x, fDeltaDepth2.y);
float fIntensity;
if(fDepth < g_fFocalPlane)
{
// Close-up blur
fIntensity = (fDepth - g_fFocalPlane) / (g_fFocalPlane - g_fNearPlane);
}
else
{
// Distance blur
float2 fDistances = (fDepth - g_fFocalPlane);
fDistances.y -= max(fDeltaDepth, 0.f);
float2 fIntensities = saturate(fDistances * g_fDistScale );
fIntensity = lerp(fIntensities.y, fIntensities.x, fIntensities.y);
}
// Bias to valid range
return float4(
tex2D(colorSampler, TexCoord).xyz,
saturate(0.5f + 0.5f * fIntensity) );
}
float4 ps_main(float2 TexCoord : TEXCOORD0) : COLOR0
{
// Center pixel depth
float fDepth = tex2D(colorSampler, TexCoord).w;
// Scale sampling radius
float fRadius = abs(2.0f * g_fRadius * fDepth - g_fRadius);
float fLowRadius = fRadius * g_fLowRadiusScaling;
float4 fColor = 0.0f;
float fAmount = 0.0f;
// Loop over samples
for(int i = 0; i < 12; i++)
{
// Sample on poisson disc
float2 fHighSampleTexCoord = TexCoord + fRadius * vPoissonDisc[i];
float2 fLowSampleTexCoord = TexCoord + fLowRadius * vPoissonDisc[i];
// Sample blurred and unblurred texture
float4 fHighSample = tex2D(colorSampler, fHighSampleTexCoord);
float4 fLowSample = tex2D(blurSampler, fLowSampleTexCoord);
// Blend between blurred and unblurred texture
float fSampleBlurIntensity = abs(2.f * fHighSample.w - 1.f);
// * saturate(1.f - 3.f * (fHighSample.w - fLowSample.w));
float4 fSample = lerp(fHighSample, fLowSample, fSampleBlurIntensity);
// Compute smart weight to avoid cross-edge leaking
float fWeight = fSample.w < fDepth ? abs(2.f * fSample.w - 1.f) : 1.f;
// Sum up
fColor += fSample * fWeight;
fAmount += fWeight;
}
return fColor / fAmount;
}

View File

@@ -0,0 +1,60 @@
float4 g_fResolution : register(c0);
float3 g_vLightDir : register(c1);
sampler1D dif : register(s2);
sampler1D spec : register(s3);
sampler2D shadowSampler : register(s4);
sampler2D depthSampler : register(s5);
samplerCUBE envSampler : register(s6);
samplerCUBE envIntSampler : register(s7);
static float g_fMinLight= 0.15f;
static float3 g_fDif = float3(1.0f, 1.0f, 1.0f);
static float3 g_fSpec = float3(3.0f, 3.0f, 3.0f);
static float3 g_fShadowBack = float3(0.05f, 0.09f, 0.15f);
struct psIn
{
float4 c : COLOR0;
float2 t : TEXCOORD0;
float3 n : TEXCOORD1;
float3 v : TEXCOORD2;
float4 s : TEXCOORD3;
float3 w : TEXCOORD4;
};
float4 ps_main(psIn i):color
{
// Environment lighting
// return texCUBE(envIntSampler, i.n);
// Environment reflection
// return texCUBE(envSampler, reflect(-i.v, i.n));
// Shadow AA
float2 sc = i.s.xy / i.s.w;
float aa = abs( tex2D(depthSampler, sc).x - i.s.z );
float2 ddaa = float2(ddx(aa), ddy(aa));
float2 aaetc = sign(-ddaa) * g_fResolution.zw;
sc += aaetc * saturate(4.f * aa);
float3 normal= normalize( i.n );
float fShadow = lerp( g_fMinLight, 1.0f, tex2D(shadowSampler, sc) );
float3 fColor = i.c.xyz;
float3 fDifLight= lerp( g_fShadowBack, texCUBE(envIntSampler, i.n ), fShadow );
fColor*= fDifLight * g_fDif;
// Smoothstep sets threshold for specularity
// fColor += 2.0f * smoothstep( 0.3f, 1.0f, texCUBE(envSampler, reflect(-i.v, normal)).xyz ); <- warum?! Spec kommt aus der ueberhellen Sonne
fColor+= g_fSpec * i.c.aaa * texCUBE(envSampler, reflect(-i.v, normal)).xyz * lerp( 0.65f, 1.0f, fShadow );
// Interpret brightness > 1 as glow, ATTENTION: smaller glow value means MORE glow [0,1]
float fGlow = saturate( 2.0f - dot(fColor, 0.333f) );
// Linear fake "tone mapping", remap color back into range [0,1] (glow will overbright area anyways)
fColor.xyz /= max( 1.0f, dot(fColor, 0.333f) );
return float4( fColor, fGlow );
}

View File

@@ -0,0 +1,190 @@
float4x4 viewProj : register(c31);
float3 eye : register(c2);
float3 g_vLightDir : register(c1);
float4x4 view : register(c35);
float softness : register(c20);
float lightTransferAmmount : register(c21);
float specularFactor : register(c22);
float specularPower : register(c23);
float translucencyAmmount : register(c24);
float textureScale : register(c25);
float surfaceTension : register(c26);
float refractAmmount : register(c27);
float depthDifferenceBlur : register(c28);
float2 ddx : register(c29);
sampler samplerPosition : register(s0);
sampler samplerNormal : register(s1);
sampler samplerDiffuse : register(s2); //WRAP
sampler samplerBackground : register(s3);
samplerCUBE envSampler : register(s6);
struct QuadOutput
{
float4 p:position;
float2 t:texcoord0;
float4 q:texcoord1;
};
struct IndexedQuadOutput
{
float4 q:position;
float3 n:normal;
float4 p:texcoord0;
float4 k:texcoord1;
float2 t:texcoord2;
float size:texcoord3;
};
struct BlurResult
{
float4 position : color0;
float4 normal : color1;
};
struct ColorDepth
{
float4 color : color0;
float depth : depth;
};
float CalcDepth(float4 pos, float difference)
{
float3 eyeVector = viewProj._m02_m12_m22;
pos.xyz -= eyeVector * difference;
float4 finalDepth = mul(pos, viewProj);
return finalDepth.z / finalDepth.w;
}
float4 psDepth(IndexedQuadOutput i):color
{
float l = length(i.t.xy * 2 - 1.0);
if (l > 1.0)
discard;
float dist = cos(asin(l));
float3 eyeVector = viewProj._m02_m12_m22;
float3 pos = i.p.xyz;
//pos -= eyeVector * dist;
return distance(eye, pos);
}
ColorDepth psPosition(IndexedQuadOutput i)
{
float l = length(i.t.xy * 2 - 1.0);
if (l > 1.0)
discard;
float dist = cos(asin(l));
ColorDepth result;
float3 eyeVector = viewProj._m02_m12_m22;
float3 pos = i.p.xyz;
pos -= eyeVector * dist;
result.color = float4(pos, i.k.w);
result.depth = CalcDepth(i.p, dist);
return result;
}
ColorDepth psNormal(IndexedQuadOutput i)
{
float l = length(i.t.xy * 2 - 1.0);
if (l > 1.0)
discard;
float dist = cos(asin(l));
ColorDepth result;
float3 normal = float3(i.t.xy * 2 - 1.0, 0.0);
normal.z = 1.0 - length(normal.xy);
normal = normalize(normal);
normal = mul(normal, (float3x3)view);
result.color = float4(normal, 1.0);
result.depth = CalcDepth(i.p, dist);
return result;
}
BlurResult psBlur(QuadOutput input)
{
const int strength = 8;
float2 SamplePos = input.t;
float pi4 = 3.141 * 2.0 / strength;
float4 resultPosition = tex2D(samplerPosition, SamplePos);
// distance dependend blur
float dist = length(resultPosition.xyz - eye);
float finalSoftness = softness * (10 / dist) * 3;
float3 centerPos = resultPosition.xyz;
float4 resultNormal = tex2D(samplerNormal, SamplePos);
int cnt = 1;
int normalCnt = 1;
for (int i = 0; i < strength; i++)
{
SamplePos = input.t + ddx * finalSoftness * float2(sin(pi4 * i), cos(pi4 * i));
float4 sampledPos = tex2D(samplerPosition, SamplePos);
if (distance(sampledPos.xyz, centerPos) > depthDifferenceBlur)
continue;
resultPosition += sampledPos;
float4 sampledNormal = tex2D(samplerNormal, SamplePos);
if (sampledNormal.a >= 0.0 || resultNormal.a == 0.0)
{
resultNormal += sampledNormal;
normalCnt ++;
}
cnt++;
}
BlurResult result;
resultNormal /= normalCnt;
resultNormal.xyz = normalize(resultNormal.xyz);
result.normal = resultNormal;
result.position = resultPosition / cnt;
return result;
}
float4 psCompose(QuadOutput i):color0
{
float4 normal = tex2D(samplerNormal, i.t);
float4 simpleBackgroundColor = tex2D(samplerBackground, i.t);
if (normal.a < 0.9)
return simpleBackgroundColor;
float3 viewDir = viewProj._m02_m12_m22;
float4 position = tex2D(samplerPosition, i.t);
float intensity = position.a;
normal.xyz *= lerp(tex3D(samplerDiffuse, normal.xyz*0.25).xyz, float3(1.0, 1.0, 1.0), intensity);
normal.xyz = normalize(normal.xyz);
float4 lightColor = float4(0.925f, 1.0f, 0.75f, 1.f);
float3 sssNormal = normalize(normal.xyz + g_vLightDir * lightTransferAmmount);
float fDiffuse = dot(sssNormal, g_vLightDir);
float3 h = normalize( normalize(viewDir) + g_vLightDir );
float fSpecular = dot(normal.xyz, h);
fSpecular = fSpecular > 0 ? pow( fSpecular, specularPower) * specularFactor : 0.0;
float4 diffuse = lightColor * fDiffuse * float4(0.8, 1.0, 1.0, 1.0);
float d = saturate(pow(1.2*(1.0 - dot(normal.xyz, viewDir)), 10.0))*0.5;
float f = dot(viewDir,normal.xyz);// * 2 - 1;
float2 texDuDv = mul((float3x3)view, normal.xyz).yx * -refractAmmount * (f * 2 - 1);
float4 background = 1.0;
background.x = tex2D(samplerBackground, i.t + texDuDv * 1.1).x;
background.y = tex2D(samplerBackground, i.t + texDuDv * 1.05).y;
background.z = tex2D(samplerBackground, i.t + texDuDv * 1.0 ).z;
return lerp(diffuse, background, min(1.0, translucencyAmmount + intensity)) + texCUBE(envSampler, normal.xyz) * (1-f) * specularFactor * 0.5 + fSpecular * lightColor;
}

View File

@@ -0,0 +1,139 @@
float4 g_fResolution : register(c0);
float3 g_vLightDir : register(c1);
float3 g_vViewPos : register(c2);
float3 g_fTime : register(c3);
sampler2D waveSampler : register(s0);
sampler2D reflectionSampler : register(s1);
sampler2D refractionSampler : register(s2);
sampler1D specSampler : register(s3);
sampler2D shadowSampler : register(s4);
sampler2D depthSampler : register(s5);
static float g_fTileHardness = .6f;
static float g_fTileDepth = 8.f;
static float g_fBumpDepth = .75f;
static float g_fTexScale = 0.1f;
static float3 g_vTexSpeed = float3(0.04f, 0.0f, 0.04f);
static float g_fSpecularPower = 0.5f;
static float g_fSpecularHardness = 128.f;
static float4 g_vWaveDirX = float4(0.07f, -0.035f, 0.03f, -0.05f);
static float4 g_vWaveDirY = float4(0.07f, 0.005f, 0.11f, -0.09f);
static float3 g_vWaveVec = float3(4.0f, 0.0f, 0.9f);
static float3 g_vWaveVecOrtho = 0.2f * float3(-0.9f, 0.0f, 4.0f);
static float4 g_fWaveScale = float4(0.2f, 0.1f, 0.3f, 0.7f);
static float4 g_fWaveNoise = float4(1.0f, 2.0f, 3.0f, 4.0f);
//static float4 g_fWaveDistortion = float4(0.025f, 0.15f, 0.1f, 0.05f);
static float4 g_fWaveDistortion = float4(0.025f, 0.1f, 0.03f, 0.01f);
static float4 g_fWaveVariation = float4(3.0f, 4.0f, 17.0f, 23.0f);
static float4 g_fWaveHeightVariation = float4(9.0f, 4.0f, 1.0f, 0.5f);
static float4 g_fLightFilterColor = float4(0.3f, 0.45f, 0.5f, 0.99f);
static float4 g_fFogColor = float4(0.1f, 0.18f, 0.17f, 0.0f);
struct psIn
{
float2 t : TEXCOORD0;
float3 n : TEXCOORD1;
float3 v : TEXCOORD2;
float4 s : TEXCOORD3;
float3 w : TEXCOORD4;
};
float4 ps_main(psIn i) : COLOR0
{
float st = g_fTime.z * 0.000035f;
float wt = (0.75f + 0.25f * sin(st)) * 0.05f;
float3 t = i.w * g_fTexScale;
float3 dt = st * g_fTexScale * g_vTexSpeed;
float3 bx = float3(2.0f, 1.0f, 0.0f);
float4 fWave11 = tex2D(waveSampler, 0.13f * (t + 8 * dt).xz).xzyw * bx.xyxy - bx.yzyz;
float4 fWave12 = tex2D(waveSampler, 0.13f * (t - 8 * dt).zx).xzyw * bx.xyxy - bx.yzyz;
float4 fWave21 = tex2D(waveSampler, (t + 2 * dt).xz).xzyw * bx.xyxy - bx.yzyz;
float4 fWave22 = tex2D(waveSampler, (t - 2 * dt).zx).xzyw * bx.xyxy - bx.yzyz;
float4 fWave31 = tex2D(waveSampler, 11.0f * (t + 0.5f * dt).xz).xzyw * bx.xyxy - bx.yzyz;
float4 fWave32 = tex2D(waveSampler, 11.0f * (t - 0.5f * dt).zx).xzyw * bx.xyxy - bx.yzyz;
float3 fWaveWeights = 1.0f; // float3(1.0f, 0.5f, 0.25f);
// Decode
float4 fWave = (fWave11 * fWaveWeights.x + fWave21 * fWaveWeights.y + fWave31 * fWaveWeights.z
+ fWave12 * fWaveWeights.x + fWave22 * fWaveWeights.y + fWave32 * fWaveWeights.z) / dot(fWaveWeights, 2.0f);
fWave.xyz += (reflect(fWave11.xyz, fWave12.xyz) * fWaveWeights.x
+ reflect(fWave21.xyz, fWave22.xyz) * fWaveWeights.y
+ reflect(fWave31.xyz, fWave32.xyz) * fWaveWeights.z) / dot(fWaveWeights, 1.0f);
fWave.y *= sign(fWave.y) * 11.0f;
float3 vNormal = normalize(fWave.xyz);
float4 fBigWaveX = g_vWaveDirX * i.w.x;
fBigWaveX += g_vWaveDirY * i.w.z;
fBigWaveX += fWave.w * 3 + st * 0.2f;
fBigWaveX -= round(fBigWaveX);
float4 fBigWave = 8.1688f * sin(fBigWaveX) * 0.02f;
float4 fBigWaveLength = 1.0f
/ sqrt(g_vWaveDirX * g_vWaveDirX + g_vWaveDirY * g_vWaveDirY);
float fNormalDisplacement = 1.0f - saturate( dot(i.v, i.v) / 300000.0f + fwidth(dot(i.v, i.v)) / 5000.0f );
vNormal.x -= dot(fBigWave, g_vWaveDirX * fBigWaveLength) * fNormalDisplacement;
vNormal.z -= dot(fBigWave, g_vWaveDirY * fBigWaveLength) * fNormalDisplacement;
vNormal = normalize(vNormal);
// Determine whether under water
float4 fSubmerged = g_vViewPos.y - 5.0f;
fSubmerged.y = sign(fSubmerged);
fSubmerged.z = saturate(fSubmerged.y);
fSubmerged.w = saturate(-fSubmerged.y);
// Invert normal under water
vNormal.y *= fSubmerged.y;
// Evaluate fresnel term
float3 vToEyeDir = normalize(i.v);
float fFresnel = 1.0f - saturate( dot(vNormal, vToEyeDir) );
float fPlaneFresnel = 1.0f - abs( dot(i.n, vToEyeDir) );
fFresnel = lerp( fPlaneFresnel, max( fFresnel, fPlaneFresnel ), 0.5f );
fFresnel = saturate( pow(fFresnel, 5) );
// Compute refraction
float2 vRefractionOffset = vNormal.xz
* lerp( 0.02f, 0.005f, saturate(dot(i.v, i.v) / 1000.0f) );
float2 vRefractionCoord = i.s.xy / i.s.w;
// Compute depths
float fEyeDepth = tex2D(depthSampler, vRefractionCoord).x;
float fEyeRefractionDepth = tex2D(depthSampler, vRefractionCoord + vRefractionOffset).x;
// Compute fades
float fWaterFade = saturate( 1.0f * abs(i.s.z - fEyeDepth) );
float fRefractionFade = 1.0f - saturate(10.0f * (i.s.z - fEyeRefractionDepth));
// Compute corrected refraction coords
vRefractionCoord += vRefractionOffset * fRefractionFade * fWaterFade;
// Fade water
fFresnel *= fWaterFade;
float fTransmissivity = saturate(2.0f - fFresnel - fWaterFade);
// Colorize
float3 fColor = lerp( g_fFogColor.xyz,
float3(0.8f, 0.8f, 0.85f) * tex2D(reflectionSampler, vRefractionCoord).xyz,
fSubmerged.z )
* fFresnel;
fColor += tex2D(refractionSampler, vRefractionCoord).xyz
* fTransmissivity;
// Specular highlights
float3 vHalf = normalize( vToEyeDir + -g_vLightDir );
float fSpecularity = saturate( dot(vNormal, vHalf) ); // * tex2Dproj(shadowSampler, i.s).x;
fColor += g_fSpecularPower * pow(fSpecularity, g_fSpecularHardness) * fWaterFade;
return float4(fColor, 1.0f);
}

View File

@@ -0,0 +1,43 @@
float4 g_fResolution : register(c0);
float3 g_vLightDir : register(c1);
sampler1D dif : register(s2);
sampler1D spec : register(s3);
sampler2D shadowSampler : register(s4);
sampler2D depthSampler : register(s5);
static float4 g_fSpecularPower = {0.85f, 0.85f, 0.85f, 0.85f};
struct psIn
{
float4 c : COLOR0;
float2 t : TEXCOORD0;
float3 n : TEXCOORD1;
float3 v : TEXCOORD2;
float4 s : TEXCOORD3;
float3 w : TEXCOORD4;
};
float4 ps_main(psIn i):color
{
// Shadow AA
float2 sc = i.s.xy / i.s.w;
float aa = abs( tex2D(depthSampler, sc).x - i.s.z );
float2 ddaa = float2(ddx(aa), ddy(aa));
float2 aaetc = sign(-ddaa) * g_fResolution.zw;
sc += aaetc * saturate(4.f * aa);
float4 fColor = i.c;
float fS= 0.2f + 0.8f * tex2D(shadowSampler, sc);
float3 n = normalize(i.n);
// Lighting
fColor.xyz *= tex1D( dif, fS * ( 0.5f + 0.5f * dot( n, -g_vLightDir) ) );
// Specular highlights
float3 h = normalize( normalize(i.v) + -g_vLightDir );
float s = dot(n, h);
fColor.xyz += g_fSpecularPower * tex1D(spec, fS * ( 0.5f + 0.5f * s ) );
return fColor;
}

View File

@@ -0,0 +1,108 @@
float2 g_fResolution : register(c0);
float3 g_vViewPos : register(c2);
float g_fSplit : register(c23);
float4x4 g_mShadowVP : register(c24);
float3 g_vShadowViewPos : register(c28);
float3 g_vShadowViewDir : register(c29);
float4 g_fShadowMapScalingRes : register(c30);
sampler2D shadowMapSampler : register(s0);
sampler2D depthSampler : register(s1);
sampler2D ditherSampler : register(s2);
static float g_fRadius = 6.0f / 64.0f;
static float g_fBias = 4.0f / 64.0f;
static float g_fDepthBias = 16.0f / 64.0f;
static float g_fBiasFalloff = 1.5f / 64.0f;
static float g_fSharpness = 640.0f / 64.0f;
static float g_fBlurSharpness = 640.0f / 64.0f;
static float g_fDepthBlurSharpness = 16.0f / 64.0f;
static const float2 s_vShadowDisc[] = {
float2(-0.326212f, -0.40581f),
float2(-0.840144f, -0.07358f),
float2(-0.695914f, 0.457137f),
float2(-0.203345f, 0.620716f),
float2(0.96234f, -0.194983f),
float2(0.473434f, -0.480026f),
float2(0.519456f, 0.767022f),
float2(0.185461f, -0.893124f),
float2(0.507431f, 0.064425f),
float2(0.89642f, 0.412458f),
float2(-0.32194f, -0.932615f),
float2(-0.791559f, -0.59771f)
};
float4 ps_main(float2 TexCoord : TEXCOORD0, float3 EyeDir : TEXCOORD1) : COLOR0
{
// Compute eye space position
float fEyeDepth = tex2D(depthSampler, TexCoord).x;
float4 vEyePoint = float4(g_vViewPos + fEyeDepth * EyeDir, 1.0f);
// Transform eye point to shadow space
float4 vShadowCoord = mul(vEyePoint, g_mShadowVP);
vShadowCoord.z = dot(vEyePoint.xyz - g_vShadowViewPos, g_vShadowViewDir);
vShadowCoord.xy = vShadowCoord.xy * float2(.5f, -.5f)
+ vShadowCoord.w * (.5f + .5f / g_fShadowMapScalingRes.zw);
// Scale radius
float2 fScaledRadius = g_fRadius * g_fShadowMapScalingRes.xy;
// Transform to shadow map
float2 vShadowCoordProj = vShadowCoord.xy / vShadowCoord.w;
// Clip pixels outside shadow map
clip( float4(vShadowCoordProj, 1.0f - vShadowCoordProj) - fScaledRadius.xyxy );
// Compute sampling plane
float4 vShadowCoordDDX = ddx(vShadowCoord), vShadowCoordDDY = ddy(vShadowCoord);
float2 vShadowCoordDeltaDepth = float2(
vShadowCoordDDX.y * vShadowCoordDDY.z - vShadowCoordDDY.y * vShadowCoordDDX.z,
vShadowCoordDDY.x * vShadowCoordDDX.z - vShadowCoordDDX.x * vShadowCoordDDY.z )
/ (vShadowCoordDDY.x * vShadowCoordDDX.y - vShadowCoordDDX.x * vShadowCoordDDY.y);
vShadowCoordDeltaDepth = vShadowCoord.w * clamp(vShadowCoordDeltaDepth, -16.f, 16.f);
// Compute bias
float fAdaption = 1.f / (1.0f + g_fBiasFalloff * fEyeDepth);
float fAdaptedBias = g_fBias; // lerp(g_fDepthBias, g_fBias, fAdaption);
float fAdaptedBlurSharpness = lerp(g_fDepthBlurSharpness, g_fBlurSharpness, fAdaption);
// Apply bias
float fReferenceDepth = vShadowCoord.z - fAdaptedBias;
// Sample random 2D matrix
float4 vRotation = tex2D(ditherSampler, TexCoord * g_fResolution / 32.0f) * 2.0f - 1.0f;
float2x2 mRotation = float2x2(vRotation.xy, vRotation.zw);
float fShadow = -1.f;
float fSampleWeight = 1.f / 6;
// Sample
for(int i = 0; i < 12; )
{
float4 fSampleDepth;
// Vectorize occlusion code
[unroll] for(int j = 0; j < 4; j++, i++)
{
// Compute some point around this pixel
float2 vSampleOffset = fScaledRadius * mul(s_vShadowDisc[i], mRotation);
// Compute depth delta
float fSampleDeltaDepth = dot(vSampleOffset * vShadowCoordDeltaDepth, 1.f);
// Sample shadow map
fSampleDepth[j] = tex2D(shadowMapSampler, vShadowCoordProj + vSampleOffset).x - fSampleDeltaDepth;
}
// Compare shadow map depth with pixel depth
// (fSampleDepth < fReferenceDepth)
float4 fOcclusion = saturate(fAdaptedBlurSharpness * (fReferenceDepth - fSampleDepth));
// Sum up samples
fShadow += dot(fOcclusion, fSampleWeight);
}
// Write to intermediate buffer
return (1.0f - fShadow); // * float4(g_fSplit == float3(0, 1, 2) || g_fSplit == float3(3, 4, 5), 1.0f);
}

View File

@@ -0,0 +1,297 @@
float3 lightDir : register(c1);
float3 viewPos : register(c2);
float3 viewDir : register(c4);
float3 passID2expIsLast : register(c23);
float4 g_fGlow : register(c61);
sampler2D colorSampler : register(s0);
sampler2D depthSampler : register(s1);
sampler2D waveSampler : register(s3);
sampler2D shadowSampler : register(s4);
// Tweakables
static float4 g_fRayColor = float4(1.75f * 0.45f, 1.75f * 0.4f, 1.75f * 0.35f, 1.0f);
static float g_fRayNearPlane = 10.0f;
static float g_fRayFarPlane = 500.0f;
static float g_fRayDensity = 0.25f;
static float g_fRayDecay = 0.9125f;
static float g_fRayAnglePersistence = 4.f;
float4 ps_ray_mask(float2 TexCoord : TEXCOORD0, float2 LightPos : TEXCOORD2) : COLOR0
{
float2 d = LightPos - TexCoord;
float r = saturate( 1.f - dot(d, d) );
r *= saturate( g_fRayAnglePersistence * dot(-lightDir, viewDir) );
float m = tex2D(depthSampler, TexCoord).x;
m = saturate( (m - g_fRayNearPlane) / (g_fRayFarPlane - g_fRayNearPlane) );
// m = saturate(1.f - m);
// float2 p = TexCoord * 2.0f - 1.0f;
// float b = saturate( 1.0f - 0.7071f * dot(p, p) );
return /* b */ m * r * g_fRayColor;
}
// Pixel shader
float4 ps_ray_extrude(float2 TexCoord : TEXCOORD0, float2 LightPos : TEXCOORD2) : COLOR0
{
float2 s = g_fRayDensity / (passID2expIsLast.y) * (LightPos - TexCoord) / 8.f;
float4 r = 0.f, ro = 0.f, rm = 0.f, rd = .125f;
float2 c = TexCoord;
for(int i = 0; i < 8; i++)
{
float4 rs = tex2D(colorSampler, c);
ro = (i == 0) ? rs : ro;
rm = max(rs, rm);
rs.xyz = rm.xyz;
r += rs * rd;
rd.xyz *= (float3)g_fRayDecay;
c += s;
}
r.xyz *= 1.0f + 0.25f * g_fGlow.z;
r.a = min(ro.a, r.a);
return r * saturate(1.f - passID2expIsLast.z * r.a);
}
float3 g_fTime : register(c3);
// Tweakables
static float g_fWaterLevel = 5.0f;
static float4 g_fLightFilterColor = float4(0.4f, 0.75f, 0.8f, 0.99f); // float4(0.8f, 0.85f, 0.9f, 0.8f);
static float g_fFilterOffset = 0.0f;
static float g_fLightFilterDensity = 0.02f;
static float g_fCausticScaling = 0.004f;
static float g_fCausticDistortion = 0.1f;
static float4 g_fCausticPatternScaling = 0.25f;
static float2 g_vCausticSpeed = float2(0.05f, 0.1f);
static float g_fCausticBrightness = 0.35f;
float4 ps_underwater_filter(float2 TexCoord : TEXCOORD0, float3 EyeDir : TEXCOORD1,
float2 LightPos : TEXCOORD2) : COLOR0
{
// Compute eye space position
float fEyeDepth = tex2D(depthSampler, TexCoord).x;
float3 vEyePoint = viewPos + fEyeDepth * EyeDir;
float3 vEyeNormal = normalize( cross( ddx(vEyePoint), ddy(vEyePoint) ) );
// Compute distance to water level
float fUnderWater = g_fWaterLevel - vEyePoint.y;
float fLightTravel = max( fUnderWater / max(-lightDir.y, 0.0001f), 0.0f );
// Intersect water plane
float3 vSubmerged = vEyePoint - viewPos;
float fSubmergedBelow = (fUnderWater >= 0.0f)
? abs(vSubmerged.y)
: (g_fWaterLevel - viewPos.y);
float fSubmerged = (viewPos.y > g_fWaterLevel)
? max(fUnderWater, 0.0f)
: fSubmergedBelow;
vSubmerged *= fSubmerged / max( abs(vSubmerged.y), 0.0001f );
// Compute submerged length
fSubmerged = length(vSubmerged);
// Compute light color
float4 fFilterDist= fLightTravel + float2(fSubmerged, 0.0f).xxxy;
float4 fLightColor = pow(g_fLightFilterColor, g_fLightFilterDensity * fFilterDist );
// Color hack
fLightColor.xyz *= pow(g_fLightFilterColor.xyz, max(fLightTravel - 30, 0) * 0.08f);
// Compute light coordinate space
float3 vLightU = normalize( cross( lightDir, float3(1.0f, 0.0f, 0.0f) ) );
float3 vLightV = normalize( cross( vLightU, lightDir ) );
// Scale time
float fTime = g_fTime.z * 0.000095f;
// Animate caustics
float2 fCausticCoord = float2( dot(vLightU, vEyePoint), dot(vLightV, vEyePoint) ) * g_fCausticScaling;
float2 fCausticCoordDelta = fTime * g_vCausticSpeed * g_fCausticScaling;
float3 bx = float3(2.0f, 1.0f, 0.0f);
// Get caustic normal
float3 vCausticNormal1 = normalize( tex2D(waveSampler, fCausticCoord - fCausticCoordDelta).xzy * bx.xyx - bx.yzy );
float3 vCausticNormal2 = normalize( tex2D(waveSampler, fCausticCoord.yx + fCausticCoordDelta).xzy * bx.xyx - bx.yzy );
float3 vCausticNormal3 = normalize( tex2D(waveSampler, 5 * (fCausticCoord - 2 * fCausticCoordDelta)).xzy * bx.xyx - bx.yzy );
float3 vCausticNormal4 = normalize( tex2D(waveSampler, 5 * (fCausticCoord.yx + 2 * fCausticCoordDelta)).xzy * bx.xyx - bx.yzy );
// Compute normals used for distortion & lighting
float3 vCausticNormalX1 = vCausticNormal1 + vCausticNormal4 / 3.0f;
float3 vCausticNormalX2 = vCausticNormal2 + vCausticNormal3 / 3.0f;
float3 vCausticNormal = vCausticNormalX1 + vCausticNormalX2;
vCausticNormal = normalize(vCausticNormal);
// Compute caustic pattern
float4 fCausticPattern = float2( dot(vEyePoint, vLightU), dot(vEyePoint, vLightV) ).xyxy;
fCausticPattern.xy += g_fCausticDistortion * vCausticNormalX1.xz * (1.0f + fEyeDepth); // + 1000 * dc.yx;
fCausticPattern.zw += g_fCausticDistortion * vCausticNormalX2.xz * (1.0f + fEyeDepth); // - 1000 * dc.xy;
fCausticPattern *= g_fCausticPatternScaling;
fCausticPattern = 2.0f * (fCausticPattern - round(fCausticPattern));
float fCaustics = dot(fCausticPattern, fCausticPattern) * g_fCausticBrightness;
// Sharpen
fCaustics *= fCaustics;
fCaustics *= fCaustics;
// Cut at surface
fCaustics *= saturate(fUnderWater);
// Remove underside lighting
fCaustics *= saturate( dot(vEyeNormal, -lightDir) ) * tex2D(shadowSampler, TexCoord).x;
float3 vSurfacePoint = vEyePoint - vSubmerged;
vSurfacePoint.y = 0.0f;
float fFadeOut = saturate( max(dot(vSurfacePoint, vSurfacePoint) - 2000000.0f, 0.0f) / 10000000.0f )
* saturate(fUnderWater);
// Filter light
return lerp(float4(fLightColor.xyz, fLightColor.w * fCaustics), float2(1, 0).xxxy, fFadeOut);
}
// Tweakables
static float4 g_fFogColor = float4(0.1f, 0.18f, 0.17f, 0.0f); // float4(0.6f, 0.7f, 0.9f, 0.25f);
static float g_fFogDensity = 0.7f;
static float g_fSceneFog = 0.6f;
static float g_fRayScaling = 0.024f;
static float2 g_vRaySpeed = float2(0.03f, 0.02f);
float4 ps_underwater(float2 TexCoord : TEXCOORD0, float3 EyeDir : TEXCOORD1,
float2 LightPos : TEXCOORD2) : COLOR0
{
// Compute eye space position
float fEyeDepth = tex2D(depthSampler, TexCoord).x;
float3 vEyePoint = viewPos + fEyeDepth * EyeDir;
// Compute distance to water level
float fUnderWater = g_fWaterLevel - vEyePoint.y;
// Intersect water plane
float3 vSubmerged = vEyePoint - viewPos;
float fSubmergedBelow = (fUnderWater >= 0.0f)
? abs(vSubmerged.y)
: (g_fWaterLevel - viewPos.y);
float fSubmerged = (viewPos.y > g_fWaterLevel)
? max(fUnderWater, 0.0f)
: fSubmergedBelow;
vSubmerged *= fSubmerged / max( abs(vSubmerged.y), 0.0001f );
// Compute submerged length & normalize
fSubmerged = length(vSubmerged);
float3 vSubmergedDir = vSubmerged / max(fSubmerged, 0.0001f);
// Pre-compute light travel quantities
float fEyeLightTravel = max( (g_fWaterLevel - viewPos.y) / max(-lightDir.y, 0.0001f), 0.0f );
float fDeltaLightTravel = vSubmergedDir.y / min(lightDir.y, -0.0001f);
float fSubmergedLightTravel = fEyeLightTravel + fDeltaLightTravel * fSubmerged;
float4 fLogLightFilterColor = log(g_fLightFilterColor);
float4 fFog = g_fFogColor / (fLogLightFilterColor * g_fLightFilterDensity * fDeltaLightTravel - g_fFogDensity);
fFog *= exp(fLogLightFilterColor * (g_fFilterOffset + g_fLightFilterDensity * fSubmergedLightTravel) - g_fFogDensity * fSubmerged)
- exp(fLogLightFilterColor * (g_fFilterOffset + g_fLightFilterDensity) * fEyeLightTravel);
// "Absorb" more scene light
fFog.w = g_fSceneFog * (1.0f - exp(-g_fFogDensity * fSubmerged));
// fFog.w = dot(fFog.xyz, 0.1f);
// fFog.w = 1.0f - fFog.w;
// fFog.w = 0;
// Compute light coordinate space
float3 vLightU = normalize( cross( lightDir, float3(1.0f, 0.0f, 0.0f) ) );
float3 vLightV = normalize( cross( vLightU, lightDir ) );
// Parallel ray direction vector
float3 vRayDir = EyeDir - lightDir * dot(lightDir, EyeDir);
vRayDir = normalize(vRayDir);
float3 vFullRayDir = EyeDir / dot(EyeDir, vRayDir);
// 1 / submerged flat
float3 vSubmergedFlatInvScale = vSubmerged - lightDir * dot(lightDir, vSubmerged);
vSubmergedFlatInvScale /= max( dot(vSubmergedFlatInvScale, vSubmergedFlatInvScale), 0.0001f );
// 4 ray Planes
float4 fPlanes = float4(5.0f, 10.0f, 20.0f, 40.0f);
float4 fPlaneIntersect = fPlanes * dot(vRayDir, vSubmergedFlatInvScale);
float4 fPlaneSubmerged = vSubmerged.y * fPlaneIntersect;
// float fWeightScaling = saturate( 1.0f - 0.1f * dot(viewDir, -lightDir) ); // polar
float4 fPlaneWeight = 1.0f - saturate( 0.5f * (fPlaneIntersect - 1.0f) );
// Compute light travel
float4 fPlanesY = g_fWaterLevel - (viewPos.y + vFullRayDir.y * fPlanes);
float4 fPlanesLightTravel = max( fPlanesY / max(-lightDir.y, 0.0001f), 0.0f );
float4 fPlanesLightInt = 1.0f / (1.0f + 0.01f * fPlanesLightTravel * fPlanesLightTravel);
// return float4(fPlanesLightInt.yyy, 1.0f);
// Snap view pos
// float3 vSnappedViewPos = vLightU * floor( dot(vLightU, viewPos) / 25.0f ) * 25.0f
// + vLightV * floor( dot(vLightV, viewPos) / 25.0f ) * 25.0f;
// fPlanes += dot(viewPos - vSnappedViewPos, vRayDir);
// Scale time
float fTime = g_fTime.z * 0.000075f;
// Animate rays
float4 fRayCoordsX = dot(vLightU, viewPos) + dot(vLightU, vRayDir) * fPlanes;
float4 fRayCoordsY = dot(vLightV, viewPos) + dot(vLightV, vRayDir) * fPlanes;
// fPlanes = dot(vLightU, vRayDir) * tx - dot(vLightV, vRayDir) * ty - 2.0f * dot(viewPos, vRayDir);
fRayCoordsX *= g_fRayScaling; fRayCoordsY *= g_fRayScaling;
float2 fRayCoordDelta = fTime * g_vRaySpeed * g_fRayScaling;
// Sample rays
float4 fRay1 = tex2D(waveSampler, float2(fRayCoordsX.x, fRayCoordsY.x) + fPlanes.x * fRayCoordDelta).xzyw;
float4 fRay2 = tex2D(waveSampler, float2(fRayCoordsX.y, fRayCoordsY.y) - fPlanes.y * fRayCoordDelta).xzyw;
float4 fRay3 = tex2D(waveSampler, float2(fRayCoordsX.z, fRayCoordsY.z) + fPlanes.z * fRayCoordDelta).xzyw;
float4 fRay4 = tex2D(waveSampler, float2(fRayCoordsX.w, fRayCoordsY.w) - fPlanes.w * fRayCoordDelta).xzyw;
// Decode Normal
float3 vRayNormal = (fRay1.xyz + fRay2.xyz + fRay3.xyz + fRay4.xyz) / 4.0f;
vRayNormal.xz = vRayNormal.xz * 2.0f - 1.0f;
vRayNormal = normalize(vRayNormal);
float4 fLight;
// Light
fLight.x = fRay1.w;
fLight.y = fRay2.w;
fLight.z = fRay3.w;
fLight.w = fRay4.w;
// fLight *= fLight * fLight;
float fLightSubmerged = 0.05f * max( fPlaneIntersect * dot(vSubmerged, lightDir), 0.0f);
// Fade rays
fLight *= fPlanesLightInt * fPlaneWeight * saturate(fSubmerged) / (1.0f + fLightSubmerged * fLightSubmerged);
fLight *= saturate(g_fWaterLevel - viewPos.y + 1.0f);
float fRayAngle = saturate( 1.0f - dot(vRayNormal, -lightDir) );
float fRayColor = 0.1f * saturate( dot(EyeDir, vRayNormal - lightDir) );
fRayAngle = frac( fRayAngle );
float3 fLightColor = 1.0f;
fLightColor.r += saturate( 1.0f - pow(3.0f * fRayAngle - 3.0f * (fRayAngle > 1.0f / 3.0f), 2) ) * fRayColor;
fLightColor.g += saturate( 1.0f - pow(3.0f * fRayAngle - 1.0f, 2) ) * fRayColor;
fLightColor.b += saturate( 1.0f - pow(3.0f * fRayAngle - 2.0f, 2) ) * fRayColor;
// God rays
fFog.xyz += dot(fLight, 0.04f) * fLightColor;
float3 vSurfacePoint = vEyePoint - vSubmerged;
vSurfacePoint.y = 0.0f;
float fFadeOut = 1.0f - saturate( max(dot(vSurfacePoint, vSurfacePoint) - 2000000.0f, 0.0f) / 10000000.0f )
* saturate(fUnderWater);
return fFog * fFadeOut;
}

View File

@@ -0,0 +1,97 @@
float3 g_vLightDir : register(c1); // = normalize( float3(1.f,-3.f,-2.f) );
float3 g_fTime : register(c3);
sampler3D randomSampler : register(s0);
samplerCUBE envSampler : register(s6);
static float4 g_fSky = float4(0.392f, 0.502f, 0.702f, 0.7f);
static float4 g_fHaze = float4(0.765f, 0.808f, 0.871f, -0.3f);
//static float4 g_fAbyss = float4(0.01f, 0.01f, 0.04f, -1.0f);
// { Outside, Cave }
static float g_fSunSize[] = { .0025f, .01f };
static float g_fCoronaSize[] = { .005f, 0.02f };
static float4 g_fSunColor[] = { float4(0.925f, 1.0f, 0.75f, 1.f), float4(0.925f, 1.0f, 0.85f, 1.0f) * 8.0f };
static float cover[] = { 0.275f, 0.0275f };
float4 clouds(float3 d, float4 color, uniform int iConfig)
{
float3 t = float3(g_fTime.x*0.001, 0, 0);
float3 bumpOffset = float3(0.f, .07f, 0.f);
float3 d1 = normalize(d + bumpOffset), d2 = normalize(d + cross(bumpOffset, d));
float4 cloud = tex3D(randomSampler, float3(0.2,0.6,0.2) * d);
float4 cloud1 = tex3D(randomSampler, float3(0.2,0.6,0.2) * d1);
float4 cloud2 = tex3D(randomSampler, float3(0.2,0.6,0.2) * d2);
float3 smoothAlpha = float3(cloud.a, cloud1.a, cloud2.a);
smoothAlpha = saturate( smoothAlpha - max(cover[iConfig] - smoothAlpha, 0.f) * .25f );
float bumpDepth = .5f;
float3 cloudel = d + d * (bumpDepth - bumpDepth * smoothAlpha.x);
float3 cloudel1 = d1 + d1 * (bumpDepth - bumpDepth * smoothAlpha.y);
float3 cloudel2 = d2 + d2 * (bumpDepth - bumpDepth * smoothAlpha.z);
float3 normal = normalize( cross(cloudel1 - cloudel, cloudel2 - cloudel) );
cloud *= 0.5;
cloud += tex3D(randomSampler, float3(0.4,1.2,0.4) * (d + t)) * 0.25;
cloud += tex3D(randomSampler, float3(0.8,2.4,0.8) * d) * 0.125;
cloud += tex3D(randomSampler, float3(1.6,4.8,1.6) * (d + t)) * 0.0625;
cloud.a = saturate( saturate( cloud.a * 2.5f ) - max(cover[iConfig] - cloud.a, 0.f) * 25.f );
float3 sdd = d + g_vLightDir;
float sd = dot(sdd, sdd);
float s = g_fCoronaSize[iConfig] / ( g_fCoronaSize[iConfig] + saturate(sd - g_fSunSize[iConfig]) );
float light = 0.5f + 0.7f * dot(normal, -g_vLightDir);
float3 stormNormal = normalize(cloud.xyz * 2 - 1);
float stormLight = 0.5f + 0.5f * dot(stormNormal, g_vLightDir);
cloud.xyz = lerp(cloud.xyz, stormLight, 0.3f * saturate(1.f - cover[iConfig]));
cloud.xyz = dot(cloud.xyz, .3f) + 0.1f * cloud.xyz;
cloud.xyz = 1.f - .65f * cloud.xyz * (1.f - 0.2f * cover[iConfig]);
cloud.xyz += 0.4f * light * saturate(cover[iConfig]);
cloud.xyz = cloud.a * cloud.xyz + (1 - cloud.a) * color.xyz;
cloud.xyz += (1 - 0.5f * cloud.a) * g_fSunColor[iConfig].xyz * s;
float3 riseColor = float3(0.9,0.8,0) * (1 - cover[iConfig] * 0.5);
float a = pow( max(0, dot(g_vLightDir, -d)), 2 ) * 0.7 * (1.f - .9f * abs(g_vLightDir.y));
float risefac = -1.f - g_vLightDir.y;
if (sign(dot(g_vLightDir, d)) > 0)
risefac = -1.0;
cloud.xyz += max( 0, a * lerp( riseColor, 1, min(1.0, risefac*1.5) + risefac ) );
cloud.a = 1.f;
return cloud;
}
float4 ps_sky_temp(float3 w : TEXCOORD4, uniform int iConfig):color
{
float4 fColor = g_fSky;
float3 d = normalize(w);
float g1 = saturate( (d.y - g_fSky.w) / (g_fHaze.w - g_fSky.w) );
fColor.xyz = lerp(g_fSky.xyz, g_fHaze.xyz, g1);
return clouds(d, fColor, iConfig);
}
float4 ps_sky(float3 w : TEXCOORD4):color { return ps_sky_temp(w, 0); }
float4 ps_cave_sky(float3 w : TEXCOORD4):color { return ps_sky_temp(w, 1); }
float4 ps_env(float3 w : TEXCOORD4):color
{
float4 fColor = texCUBE(envSampler, w);
// Interpret brightness > 1 as glow, ATTENTION: smaller glow value means MORE glow [0,1]
float fGlow = max( 0.65f, saturate( 2.0f - dot(fColor, 0.333f) ) );
// Linear fake "tone mapping", remap color back into range [0,1] (glow will overbright area anyways)
fColor.xyz /= max( 1.0f, dot(fColor.xyz, 0.333f) );
return float4( fColor.xyz, fGlow );
}

View File

@@ -0,0 +1,342 @@
float4x4 viewProj : register(c31);
float4 resolution : register(c0);
float3 lightDir : register(c1);
sampler2D waveSampler : register(s0);
sampler3D randomSampler : register(s1);
sampler1D dif : register(s2);
sampler1D spec : register(s3);
sampler2D shadowSampler : register(s4);
sampler2D depthSampler : register(s5);
samplerCUBE envSampler : register(s6);
static float3 lightSources[] = {
float3(19.6f, 8.9f, 2.0f),
float3(40.3f, 0.7f, 26.1f),
float3(22.5f, -6.2f, -9.2f),
float3(-15.9f, 6.8f, -23.9f),
float3(-5.2f, 8.9f, -29.2f),
float3(10.1f, 11.4f, -13.6f) };
static float4 lightColors[] = {
8.0 * float4(0.7f, 0.6f, 1.0f, 1.0f),
8.0 * float4(0.7f, 0.6f, 1.0f, 1.0f),
8.0 * float4(0.7f, 0.6f, 1.0f, 1.0f),
8.0 * float4(0.7f, 0.6f, 1.0f, 1.0f),
8.0 * float4(0.7f, 0.6f, 1.0f, 1.0f),
8.0 * float4(0.7f, 0.6f, 1.0f, 1.0f) };
static float lightRanges[] = {
3.0f / 2.6f,
3.0f / 3.5f,
3.0f / 5.3f,
3.0f / 1.0f,
3.0f / 1.2f,
3.0f / 1.6f };
static int lightCount = 6;
struct psIn
{
float4 c : COLOR0;
float2 t : TEXCOORD0;
float3 n : TEXCOORD1;
float3 v : TEXCOORD2;
float4 s : TEXCOORD3;
float3 w : TEXCOORD4;
};
float4 tex2D_3D(uniform sampler2D smplr, in float3 t, in float3 n)
{
float4 front = tex2D(smplr, t.xy);
float4 side = tex2D(smplr, t.zy);
float4 floor = tex2D(smplr, t.xz);
return lerp( lerp(side, front, abs(n.z)), floor, abs(n.y) );
}
float4 ps_main(psIn i, uniform bool bCrystalLight) : color0
{
// Shadow AA
float2 sc = i.s.xy / i.s.w;
float aa = abs( tex2D(depthSampler, sc).x - i.s.z );
float2 ddaa = float2(ddx(aa), ddy(aa));
float2 aaetc = sign(-ddaa) * resolution.zw;
sc += aaetc * saturate(4.f * aa);
float3 t = i.w / 128;
float3 n = normalize(i.n);
float3 v = normalize(i.v);
// Composition
float iceAmount = 0.68f;
float rock = smoothstep(iceAmount - 0.05f, iceAmount, tex2D_3D(waveSampler, 0.6f * t, n).a);
float rockBlend = smoothstep( -0.7f, 1.0f, rock );
float transition = 1.0f - abs( 2.0f * rock - 1.0f );
// Surface
float3 vSurfacePoint = i.w - n * rock;
float3 vSurfacePointDDX = ddx(vSurfacePoint), vSurfacePointDDY = ddy(vSurfacePoint);
float3 vSurfaceNormal = normalize( cross(vSurfacePointDDX, vSurfacePointDDY) );
float3 vFlatSurfaceNormal = vSurfaceNormal - n * dot(n, vSurfaceNormal);
float4 fShadow = float4(0.2f, 0.4f, 0.6f, 0.8f) + float4(0.8f, 0.6f, 0.4f, 0.2f) * tex2D(shadowSampler, sc).x;
float3 tc = (i.w - v) * 8;
float3 vCellCoord1 = tc + 1.5f * tex3D(randomSampler, tc / 48).xyz;
float3 vCellCoord2 = 1.25f * tc + 3.0f * tex3D(randomSampler, tc / 32).xyz;
float3 vCellCoord1Frac = frac(vCellCoord1) * 2.0f - 1.0f;
float3 vCellCoord2Frac = frac(vCellCoord2) * 2.0f - 1.0f;
vCellCoord1 = floor(vCellCoord1) + sign(vCellCoord1Frac) * pow( abs(vCellCoord1Frac), 8 ) * 0.5f + 0.5f;
vCellCoord2 = floor(vCellCoord2) + sign(vCellCoord2Frac) * pow( abs(vCellCoord2Frac), 8 ) * 0.5f + 0.5f;
float3 vCellNormal1 = normalize( tex3D(randomSampler, vCellCoord1 / 32).xyz * 2.0f - 1.0f );
float3 vCellNormal2 = normalize( tex3D(randomSampler, vCellCoord2 / 32).xyz * 2.0f - 1.0f );
float3 vFlatCellNormal1 = vCellNormal1 - n * dot(n, vCellNormal1);
float3 vFlatCellNormal2 = vCellNormal2 - n * dot(n, vCellNormal2);
float3 rockN = tex2D_3D(waveSampler, t, n).xyz
* (0.5 - abs( cos( (t.x + 0.1 * tex2D_3D(waveSampler, t * 2, n).a) * 20 ) ) );
float3 roughN = tex2D_3D(waveSampler, t * 10, n).xyz * 0.3
+ tex2D_3D(waveSampler, t * 100, n).xyz * 0.4;
float3 fIceNormal = normalize( n + 0.2f * roughN + transition * vFlatSurfaceNormal );
float3 fIceNormalEx = normalize(fIceNormal - 0.7f * n * dot(fIceNormal, n));
float3 fRockNormal = normalize( n + 0.4f * (roughN + rockN) );
float3 fRockNormalEx = normalize(fRockNormal - 0.6f * n * dot(fRockNormal, n));
float3 fIceCellNormal1 = normalize(fIceNormalEx - 0.1f * vFlatCellNormal1);
float3 fIceCellNormal2 = vCellNormal2; // normalize(fIceNormalEx - 0.7f * vFlatCellNormal2);
float2 fLight = float2( dot(fIceNormal, -lightDir), dot(fRockNormal, -lightDir) );
float2 fRimLight = 1.0f - abs(fLight); // * saturate( dot(lightDir, v) );
fLight = min(fShadow.y * fLight, fLight); // Occlude only direct lighting (back-shadowing artifacts otherwise)
fLight = saturate( 0.2f * saturate(1.0f + 2.0f * fLight) + 0.8f * saturate(fLight) ); // Ambient, Diffuse
fRimLight *= fShadow.w;
float3 h = normalize( v + -lightDir );
float4 hdn = float4( abs( dot( h, fIceNormalEx ) ), dot( h, fRockNormalEx ), dot( h, fIceCellNormal1 ), dot( h, fIceCellNormal2 ) );
float4 fSpecularity = fShadow.ywww * pow( saturate( hdn ), float4(8.0f, 4.0f, 4.0f, 8.0f) );
float4 fIceCrystalLight = 0.0f;
float4 fRockCrystalLight = 0.0f;
if(bCrystalLight)
{
for (int l = 0; l < lightCount; l++)
{
float3 toW = (i.w - lightSources[l]) * lightRanges[l];
float3 dirToW = normalize(toW);
float2 lgt = 1.0f / ( 1.0f + dot(toW, toW) );
lgt *= saturate( float2( dot(-dirToW, fIceNormal) , dot(-dirToW, fRockNormal) ) );
fIceCrystalLight += lgt.x * lightColors[l];
fRockCrystalLight += lgt.y * lightColors[l];
}
}
// Ice
float fIceSpecBoost = 0.4f * saturate( 0.5f - 0.5f * dot(lightDir, v) );
// return float2(fIceSpecBoost, 1).xxxy;
float fIceSpecularity = dot( fSpecularity.xzw, float3(0.35f, 0.35f, 0.4f + fIceSpecBoost) ); // float3(0.35f, 0.35f, 0.5f)
float4 fIceSpecLighting = 0.4f * tex1D(spec, 0.85f + 0.15f * fIceSpecularity) * fIceSpecularity;
float4 fIceLighting = tex1D(dif, fLight.x) + fIceCrystalLight;
float4 fIceRimLighting = tex1D(dif, fRimLight.x);
float fIceRimFresnel = pow( saturate( 1.0f - dot(fIceNormal, v) ), 8 ) * saturate( 0.5f + 0.5f * dot(lightDir, v) );
float fIceFresnel = 0.5f + dot(0.5f / 3, float3( dot(v, fIceNormalEx), dot(v, fIceCellNormal1), dot(v, fIceCellNormal2) ));
float fPlaneIceFresnel = 0.5f + 0.5f * dot(v, n);
fIceFresnel = lerp(fPlaneIceFresnel, max(fIceFresnel, fPlaneIceFresnel), 0.5f);
fIceFresnel = pow(fIceFresnel, 4);
float4 fIceColor = lerp(
float4(0.665f, 0.738f, 0.901f, 1.0f),
float4(0.965f, 0.938f, 0.901f, 1.0f),
fIceFresnel );
fIceSpecLighting *= fIceColor;
fIceColor *= fIceLighting;
fIceColor += float4(0.905f, 0.908f, 0.901f, 1.0f) * fIceRimFresnel * fIceRimLighting;
fIceColor.w *= saturate( 1.0f - dot( float2(0.3f, 0.7f), fSpecularity.zw ) );
// Rock
float4 fRockLighting = tex1D(dif, fLight.y) + fRockCrystalLight
+ 0.2f * tex1D(spec, 0.75f + 0.25f * fSpecularity.y) * fSpecularity.y;
float4 fRockColor = float4(0.45f, 0.4f, 0.5f, 1.0f);
fRockColor *= fRockLighting;
// Compose
float4 fColor = lerp( fIceColor, fRockColor, saturate(rockBlend) ); // saturate(rock)
fColor += fIceSpecLighting * (rock < 0.5f);
return fColor;
}
static float3 g_fLightFilterColor = float3(0.3f, 0.45f, 0.5f);
float4 ps_main_isle(psIn i) : color0
{
// Shadow AA
float2 sc = i.s.xy / i.s.w;
float aa = abs( tex2D(depthSampler, sc).x - i.s.z );
float2 ddaa = float2(ddx(aa), ddy(aa));
float2 aaetc = sign(-ddaa) * resolution.zw;
sc += aaetc * saturate(4.f * aa);
float3 t = i.w / 128;
float3 n = normalize(i.n);
float3 v = normalize(i.v);
// Composition
float shore = 0.4f * (i.w.y - 5) + tex2D_3D(waveSampler, t * 3, n).a;
// shore = max(0.02, smoothstep(0.0, 1.5, shore) * (smoothstep(0.6, 0.7, n.y)) * 0.5);
shore = saturate(1.0f - shore);
float rock = (1 - smoothstep(0.6, 0.8, n.y)) * smoothstep(0.5, 0.7, tex2D_3D(waveSampler, t * 2, n).a);
rock += (1 - smoothstep(0.4, 0.8, n.y)) * smoothstep(0.35, 0.45, tex2D_3D(waveSampler, t * 2, n).a);
rock = rock / 2 + shore;
float rockBlend = smoothstep( -0.7f, 1.0f, rock );
float transition = saturate( 1.0f - 5.0f * abs( 2.0f * rock - 1.0f ) );
// Surface
float3 vSurfacePoint = i.w - n * rock;
float3 vSurfacePointDDX = ddx(vSurfacePoint), vSurfacePointDDY = ddy(vSurfacePoint);
float3 vSurfaceNormal = normalize( cross(vSurfacePointDDX, vSurfacePointDDY) );
float3 vFlatSurfaceNormal = vSurfaceNormal - n * dot(n, vSurfaceNormal);
float4 fShadow = float4(0.2f, 0.4f, 0.6f, 0.8f) + float4(0.8f, 0.6f, 0.4f, 0.2f) * tex2D(shadowSampler, sc).x;
float3 tc = (i.w - v) * 8;
float3 vCellCoord1 = tc + 1.5f * tex3D(randomSampler, tc / 48).xyz;
float3 vCellCoord2 = 1.25f * tc + 3.0f * tex3D(randomSampler, tc / 32).xyz;
float3 vCellCoord1Frac = frac(vCellCoord1) * 2.0f - 1.0f;
float3 vCellCoord2Frac = frac(vCellCoord2) * 2.0f - 1.0f;
vCellCoord1 = floor(vCellCoord1) + sign(vCellCoord1Frac) * pow( abs(vCellCoord1Frac), 8 ) * 0.5f + 0.5f;
vCellCoord2 = floor(vCellCoord2) + sign(vCellCoord2Frac) * pow( abs(vCellCoord2Frac), 8 ) * 0.5f + 0.5f;
float3 vCellNormal1 = normalize( tex3D(randomSampler, vCellCoord1 / 32).xyz * 2.0f - 1.0f );
float3 vCellNormal2 = normalize( tex3D(randomSampler, vCellCoord2 / 32).xyz * 2.0f - 1.0f );
float3 vFlatCellNormal1 = vCellNormal1 - n * dot(n, vCellNormal1);
float3 vFlatCellNormal2 = vCellNormal2 - n * dot(n, vCellNormal2);
float3 rockN = tex2D_3D(waveSampler, t, n).xyz
* (0.5 - abs( cos( (t.x + 0.1 * tex2D_3D(waveSampler, t * 2, n).a) * 20 ) ) );
float3 roughN = tex2D_3D(waveSampler, t * 10, n).xyz * 0.3
+ tex2D_3D(waveSampler, t * 100, n).xyz * 0.4;
float3 fIceNormal = normalize( n + 0.2f * roughN + transition * vFlatSurfaceNormal );
float3 fIceNormalEx = normalize(fIceNormal - 0.7f * n * dot(fIceNormal, n));
float3 fRockNormal = normalize( n + 0.4f * (roughN + rockN) );
float3 fRockNormalEx = normalize(fRockNormal - 0.6f * n * dot(fRockNormal, n));
float3 fIceCellNormal1 = normalize(fIceNormalEx - 0.1f * vFlatCellNormal1);
float3 fIceCellNormal2 = vCellNormal2; // normalize(fIceNormalEx - 0.7f * vFlatCellNormal2);
float2 fLight = float2( dot(fIceNormal, -lightDir), dot(fRockNormal, -lightDir) );
float2 fRimLight = 1.0f - abs(fLight); // * saturate( dot(lightDir, v) );
fLight = min(fShadow.y * fLight, fLight); // Occlude only direct lighting (back-shadowing artifacts otherwise)
fLight = saturate( 0.2f * saturate(1.0f + 2.0f * fLight) + 0.8f * saturate(fLight) ); // Ambient, Diffuse
fRimLight *= fShadow.w;
float3 h = normalize( v + -lightDir );
float4 hdn = float4( abs( dot( h, fIceNormalEx ) ), dot( h, fRockNormalEx ), dot( h, fIceCellNormal1 ), dot( h, fIceCellNormal2 ) );
float4 fSpecularity = fShadow.ywww * pow( saturate( hdn ), float4(8.0f, 4.0f, 4.0f, 8.0f) );
// Ice
float fIceSpecBoost = 0.4f * saturate( 0.5f - 0.5f * dot(lightDir, v) );
// return float2(fIceSpecBoost, 1).xxxy;
float fIceSpecularity = dot( fSpecularity.xzw, float3(0.35f, 0.35f, 0.4f + fIceSpecBoost) ); // float3(0.35f, 0.35f, 0.5f)
float4 fIceSpecLighting = 0.4f * tex1D(spec, 0.85f + 0.15f * fIceSpecularity) * fIceSpecularity;
float4 fIceLighting = tex1D(dif, fLight.x);
float4 fIceRimLighting = tex1D(dif, fRimLight.x);
float fIceRimFresnel = pow( saturate( 1.0f - dot(fIceNormal, v) ), 8 ) * saturate( 0.5f + 0.5f * dot(lightDir, v) );
float fIceFresnel = 0.5f + dot(0.5f / 3, float3( dot(v, fIceNormalEx), dot(v, fIceCellNormal1), dot(v, fIceCellNormal2) ));
float fPlaneIceFresnel = 0.5f + 0.5f * dot(v, n);
fIceFresnel = lerp(fPlaneIceFresnel, max(fIceFresnel, fPlaneIceFresnel), 0.5f);
fIceFresnel = pow(fIceFresnel, 4);
float4 fIceColor = lerp(
float4(0.665f, 0.738f, 0.901f, 1.0f),
float4(0.965f, 0.938f, 0.901f, 1.0f),
fIceFresnel );
fIceSpecLighting *= fIceColor;
fIceColor *= fIceLighting;
fIceColor += float4(0.905f, 0.908f, 0.901f, 1.0f) * fIceRimFresnel * fIceRimLighting;
fIceColor.w *= saturate( 1.0f - dot( float2(0.3f, 0.7f), fSpecularity.zw ) );
// Rock
float4 fRockLighting = tex1D(dif, fLight.y)
+ 0.2f * tex1D(spec, 0.75f + 0.25f * fSpecularity.y) * fSpecularity.y;
float4 fRockColor = float4(0.45f, 0.4f, 0.5f, 1.0f);
fRockColor *= fRockLighting;
// Compose
float4 fColor = lerp( fIceColor, fRockColor, saturate(rockBlend) ); // saturate(rock)
fColor += fIceSpecLighting * (rock < 0.5f);
// Fade edge
fColor.xyz *= pow(g_fLightFilterColor, max(-15 - i.w.y, 0) * 0.2f);
return fColor;
}
float4 ps_main_old(psIn i) : color0
{
return ps_main_isle(i);
// Shadow AA
float2 sc = i.s.xy / i.s.w;
float aa = abs( tex2D(depthSampler, sc).x - i.s.z );
float2 ddaa = float2(ddx(aa), ddy(aa));
float2 aaetc = sign(-ddaa) * resolution.zw;
sc += aaetc * saturate(4.f * aa);
float fShadow = 0.2f + 0.8f * tex2D(shadowSampler, sc);
float3 n = normalize(i.n);
float3 t = i.w / 128;
float shore = i.w.y - 5 + tex2D_3D(waveSampler, t * 3, n).a;
shore = 0.2 + max(0.02, smoothstep(0.0, 1.5, shore) * (smoothstep(0.6, 0.7, n.y)) * 0.5);
float rock = 1-((1-smoothstep(0.6, 0.7, n.y)) * smoothstep(0.5, 0.7, tex2D_3D(waveSampler, t * 2, n).a));
return shore;
float3 pn = n;
pn += shore * tex2D_3D(waveSampler, t, n).xyz * (0.5-abs(cos((t.x + 0.1 * tex2D_3D(waveSampler, t * 2, n).a) * 20)));
pn += shore * tex2D_3D(waveSampler, t * 10, n).xyz * 0.3;
pn += shore * tex2D_3D(waveSampler, t * 100, n).xyz * 0.4;
pn = normalize(pn);
float3 pnn = normalize(pn - 0.9f * n * dot(pn, n));
float fIceSpecularity = 0.003f * pow( texCUBE(envSampler, reflect(-i.v, pnn)).g, 16.0f) * fShadow;
float fSnowSpecularity = 0.3f * saturate( pow( texCUBE(envSampler, reflect(-i.v, pnn)).g, 6.0f) * fShadow );
float fLight = dot( pn, -lightDir);
fLight = min(fShadow * fLight, fLight); // Occlude only direct lighting (back-shadowing artifacts otherwise)
fLight = saturate( 0.2f * saturate(1.0f + 2.0f * fLight) + 0.8f * saturate(fLight) ); // Ambient, Diffuse
float light = tex1D( dif, 0.3f * (1 - min(0.3, pow(dot(pn, n), 8))) + 0.7f * fLight );
float4 reflection = texCUBE(envSampler, reflect(-i.v, pn));
float4 fColor = lerp(i.c,
light * float4(0.15, 0.2, 0.25, 0.0) + 0.4 * rock * smoothstep(-0.5, 0.5, pn.y),
(1.0 - shore));
return float4(fColor.xyz, 1.0f);
// Lighting
fColor.xyz *= light;
fColor += lerp(fSnowSpecularity, fIceSpecularity, rock * (1.0 - shore));
return float4(fColor.xyz, 1.0f);
}
float4 ps_terrain(psIn i) : color0 { return ps_main_old(i); };
float4 ps_cave(psIn i) : color0 { return ps_main(i, true); };
float4 ps_cave_ground(psIn i) : color0 { return ps_main(i, false); };

View File

@@ -0,0 +1,145 @@
float4 g_fResolution : register(c0);
float3x3 g_mCubeMatrix : register(c40);
float g_fCubeWeight : register(c43);
float g_fOverlayFade : register(c50);
float4 g_fFadeColor : register(c51);
sampler2D randomSampler : register(s0);
sampler3D randomCubeSampler : register(s1);
sampler2D ditherSampler : register(s2);
sampler2D inputSampler : register(s3);
samplerCUBE inputCubeSampler : register(s4);
float4 rand_val(float4 r)
{
return r;
// float lr = dot(r, float4(10.f, 100.f, 1000.f, 1.f));
// return lr / 1111.f;
}
float4 noise(float2 t)
{
float4 r = tex2D(randomSampler, .03125f * t);
return rand_val(r)* 2.f - 1.f;
}
float4 noise_grad(float2 t, float2 dtX, float2 dtY)
{
float4 r = tex2Dgrad(randomSampler, .03125f * t, .0625f * dtX, .0625f * dtY);
return rand_val(r)* 2.f - 1.f;
}
float4 abs_noise(float2 t)
{
return abs( noise(t) );
}
float4 abs_noise_grad(float2 t, float2 dtX, float2 dtY)
{
return abs( noise_grad(t, dtX, dtY) );
}
float4 ps_perlin(float2 TexCoord : TEXCOORD0) : COLOR0
{
float2 t = 32 * TexCoord;
float4 fNoise = noise(t) / 2.0f;
fNoise += noise(2 * t) / 4.0f;
fNoise += noise(4 * t) / 8.0f;
fNoise += noise(8 * t) / 16.0f;
fNoise += noise(16 * t) / 32.0f;
fNoise += noise(32 * t) / 64.0f;
fNoise += noise(64 * t) / 128.0f;
fNoise += noise(128 * t) / 256.0f;
fNoise += noise(256 * t) / 512.0f;
fNoise += noise(512 * t) / 1024.0f;
return fNoise * 0.5f + 0.5f;
}
float4 ps_wave(float2 TexCoord : TEXCOORD0) : COLOR0
{
float4 fNoise = tex2D(inputSampler, TexCoord);
float4 fX = 0.5f * fNoise;
fX -= round(fX);
float4 fWave = 8.1688f * (1.0f - cos(fX));
return fNoise;
}
float4 ps_normal(float2 TexCoord : TEXCOORD0) : COLOR0
{
// Construct pixels
float3 vPixel = TexCoord.xyy;
vPixel.z = tex2D(inputSampler, vPixel.xy).r;
float3 vRightPixel = TexCoord.xyy;
vRightPixel.x += g_fResolution.z;
vRightPixel.z = tex2D(inputSampler, vRightPixel.xy).r;
float3 vBottomPixel = TexCoord.xyy;
vBottomPixel.y += g_fResolution.w;
vBottomPixel.z = tex2D(inputSampler, vBottomPixel.xy).r;
// Get change rates
float3 vRight = vRightPixel - vPixel;
float3 vDown = vBottomPixel - vPixel;
// Compute normal
float3 vNormal = cross(vRight, vDown);
vNormal.z = max(vNormal.z, 0.0f);
vNormal = normalize(vNormal);
// Encode & return
vNormal.xy = vNormal.xy * 0.5f + 0.5f;
return float4(saturate(vNormal), vPixel.z);
}
float4 ps_cube_blur(float2 TexCoord : TEXCOORD0) : COLOR0
{
float3 vCubeDir = float3(TexCoord * float2(2.0f, -2.0f) - float2(1.0f, -1.0f), 1.0f);
float3 vCubeCoord = mul(vCubeDir, transpose(g_mCubeMatrix));
return texCUBE(inputCubeSampler, vCubeCoord) * g_fCubeWeight;
}
bool flame(float2 o)
{
return (o.x < -0.52) && (pow(2 * (o.x + 0.52), 2.0) + pow(o.y - 0.33, 2.0) < 1) ||
(o.x >= -0.52 && o.x < 1.57 && o.y <= 1 - sin(3 * o.x) / 3 || o.x >= 1.57 && o.y < 1.33 - pow(o.x - 1.57, 2.0)) &&
(o.x >= -0.52 && o.y >= -0.01 + sin(1.5 * o.x - 0.9) / 1.5);
}
float4 ps_logo(float2 TexCoord : TEXCOORD0) : COLOR0
{
float4 fColor = 0.0f;
float2 o;
TexCoord.y = (TexCoord.y - 0.5f) * (g_fResolution.y * 16) / (g_fResolution.x * 9) + 0.5f;
TexCoord.y = 1.0f - TexCoord.y;
TexCoord *= float2(1024, 768);
// 4x sampling
for (float x = 0; x < 1/128.0; x += 1/256.0)
for (float y = 0; y < 1/128.0; y += 1/256.0)
{
o = (TexCoord.yx - float2(384.0f, 512.0f)) / 128.0f + float2(0.5f + y, 0.3f + x);
o.y *= (3.0f * 16) / (4.0f * 9);
o.x /= 1.1;
o.y *= 1.2;
fColor += flame(o) * float4(0, 0.5, 1, 1);
o.y /= -1.2;
o.x *= 1.1;
o += float2(0.2, 0.3);
fColor += flame(o) * float4(0, 0.75, 1, 1);
}
fColor /= 8.0f;
fColor *= g_fOverlayFade * length((o+float2(.4,0))*.8);
return fColor;
}
float4 ps_fade() : COLOR0
{
float4 fColor = g_fFadeColor;
fColor.xyz *= fColor.w;
return fColor;
}

View File

@@ -0,0 +1,58 @@
float4 g_fResolution : register(c0);
float3 g_vLightDir : register(c1);
float4 g_fTime : register(c3);
sampler1D dif : register(s2);
sampler1D spec : register(s3);
sampler2D shadowSampler : register(s4);
sampler2D depthSampler : register(s5);
static float4 g_fSpecularPower = {1.15f, 1.05f, 1.0f, 1.25f};
struct psIn
{
float4 c : COLOR0;
float2 t : TEXCOORD0;
float3 n : TEXCOORD1;
float3 v : TEXCOORD2;
float4 s : TEXCOORD3;
float3 w : TEXCOORD4;
};
float4 ps_main(psIn i):color
{
// Shadow AA
float2 sc = i.s.xy / i.s.w;
float aa = abs( tex2D(depthSampler, sc).x - i.s.z );
float2 ddaa = float2(ddx(aa), ddy(aa));
float2 aaetc = sign(-ddaa) * g_fResolution.zw;
sc += aaetc * saturate(4.f * aa);
float3 fColor = lerp( float3(1, 0.126, 0.251), float3(255, 224, 32) / 255, 0.5f + 0.5f * cos( g_fTime.x * 0.1f ) );
fColor = lerp( fColor, float3(64, 192, 96) / 255, 0.5f + 0.5f * cos( g_fTime.x * 0.3f ) );
fColor = lerp(i.c.xyz, fColor, 0.75f * (g_fTime.x > 130 * 64) * saturate(-i.w.x + 0.5f) );
//float fS= 0.2f + 0.8f * tex2D(shadowSampler, sc);
float3 n = normalize(i.n);
float3 v = normalize(i.v);
// Lighting
//fColor.xyz *= tex1D( dif, fS * ( 0.5f + 0.5f * dot( n, -g_vLightDir) ) );
fColor.xyz *= tex1D( dif, ( 0.5f + 0.5f * dot( n, -g_vLightDir) ) );
// Specular highlights
float3 h = normalize( v + -g_vLightDir );
float s = dot(n, h);
//fColor += g_fSpecularPower * tex1D(spec, fS * ( 0.5f + 0.5f * s ) );
fColor += g_fSpecularPower * tex1D(spec,( 0.5f + 0.5f * s ) );
float fGlow = ( g_fTime.x < 0 )
? saturate( -106.5f - ( g_fTime.x / 32.0f ) )
: 1.0f - saturate( g_fTime.w );
fGlow = saturate( fGlow - ( 0.5f + 0.5f * cos(g_fTime.x * 0.5f + i.w.x * 0.1f) ) * (g_fTime.x > 130 * 64) );
return float4(fColor, fGlow );
}

View File

@@ -0,0 +1,14 @@
SCENE000= . . . . . . x . . . . . . . x
SCENE001= . x . . x x . . . . . . . . x
SCENE002= . x . . x x . . . . . . . . .
SCENE003= . . . x . . . x x . . . . . . x
SCENE004= . . . x . . . x . x . . . . . x
SCENE005= . . . x . . . x . . x . . . . . x
SCENE006= . . . x . . . x . . . x . . .
SCENE007= . . . x . . . x . . . . x . .
SCENE008= . . . x . . . x . . . . . x .
SCENE009= x . . . . . . . x . . . . .
SCENE010= . x . . . . x
SCENE011= . . . x . . . x . . . . . . . . x x
SCENE012= . . . x . . . x . . . . . . x . x . x
SCENE013= . x . . x x . . . . . . . . . . . . . x

View File

@@ -0,0 +1,91 @@
Text=liquidiced
Pos= 250 -12 -180
Scale= 16 16 4
Rot= 0 0 0
Move= 0 0 0
Time= -80000 40000
Text=GFX
Pos= 320 -12 -300
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=rip
Pos= 320 -17 -300
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=TGGC
Pos= 320 -22 -300
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=Music
Pos= 350 -15 -380
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=LPChip
Pos= 350 -20 -380
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=xTr1m
Pos= 350 -25 -380
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=Code
Pos= 380 -15 -460
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=CodingCat
Pos= 380 -20 -460
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=Hel
Pos= 380 -25 -460
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=TGGC
Pos= 380 -30 -460
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=xTr1m
Pos= 380 -35 -460
Rot= -10 0 0
Scale= 6 6 3
Move= 0 0 0
Time= -80000 40000
Text=ASD - Alcatraz - Brainstorm - Calodox - Conspiracy - Fairlight - Farbrausch - Fuzzion - Kakiarts - Loonies - Mercury - RGBA - Speckdrumm - Still - TBC - TBL - Titan - Traction - Youth Uprising
Pos= 700 0 0
Rot= 0 0 0
Scale= 6 6 3
Move= -2000 0 0
Time= 100000 80000

View File

@@ -0,0 +1,75 @@
float4x4 viewProj : register(c31);
float2 quadddx : register(c30);
struct QuadInput
{
float4 p:position;
float2 t:texcoord0;
};
struct QuadOutput
{
float4 p:position;
float2 t:texcoord0;
float4 q:texcoord1;
};
struct IndexedQuadInput
{
float4 p:position;
float2 n:normal;
float4 i:texcoord0;
float k:texcoord1;
};
struct IndexedQuadOutput
{
float4 q:position;
float3 n:normal;
float4 p:texcoord0;
float4 k:texcoord1;
float2 t:texcoord2;
float size:texcoord3;
};
void calc(IndexedQuadInput i, out IndexedQuadOutput o, float sizeFactor)
{
float3 eyeVector = viewProj._m02_m12_m22;
float3 side;
float3 up;
side = normalize(cross(eyeVector, float3(0,1,0)));
up = normalize(cross(side,eyeVector));
float3 finalPos = i.i.xyz;
float size = i.i.w * sizeFactor;
finalPos += (i.p.x) * side * size * (1 - i.k * 0.5);
finalPos += (i.p.y) * up * size * (1 + i.k * 5);
float4 finalPos4 = float4(finalPos, 1);
o.q = mul(finalPos4, viewProj);
o.t = i.n;
o.n.xy = i.n;
o.n.z = 0.0;
o.p = finalPos4;
o.k.xyz = i.p.xyz;
o.k.a = i.k;
o.size = size;
}
void vsDeferred(IndexedQuadInput i, out IndexedQuadOutput o) { calc(i, o, 1.0); }
void vsDepth(IndexedQuadInput i, out IndexedQuadOutput o) { calc(i, o, 0.9); }
QuadOutput vsCompose(QuadInput i)
{
QuadOutput o;
o.p = i.p;
o.q = i.p;
o.t = i.t;
o.t *= 1.0 + quadddx;
return o;
}

View File

@@ -0,0 +1,29 @@
float4x4 matWVP : register(c0);
float4 res : register(c5);
float3 viewPos : register(c4);
float3 lightDir : register(c6);
float3x3 viewMatrixRotInv : register(c7);
float4 projScaleOffsetInv : register(c11);
struct vsOut
{
float4 p : POSITION;
float2 t : TEXCOORD0;
float3 e : TEXCOORD1;
float2 l : TEXCOORD2;
};
vsOut vs_main(float4 p : POSITION)
{
vsOut o = { p, p.xy, p.xyw, (float2)0.f };
o.p.xy += float2(-1.f, 1.f) * res.zw;
o.t = o.t * float2(.5f, -.5f) + .5f;
o.e.xy = o.e.xy * projScaleOffsetInv.xy + projScaleOffsetInv.zw;
o.e = mul(o.e, viewMatrixRotInv);
o.e.xy += float2(-1.f, 1.f) * res.zw;
// Compute light position
float4 lightPos = mul( float4(viewPos - lightDir, 1.0f), matWVP );
o.l = clamp( lightPos.xy / abs(lightPos.w), -1.f, 1.f );
o.l = o.l * float2(.5f, -.5f) + .5f;
return o;
};

View File

@@ -0,0 +1,53 @@
float4x4 matWVP : register(c0);
float4x4 matWorld : register(c12);
float4x4 matWorldI : register(c16);
float3 viewPos : register(c4);
float3 viewDir : register(c10);
float4 res : register(c5);
struct vsIn
{
float4 p : POSITION;
float3 n : NORMAL;
float4 c : COLOR;
float2 t : TEXCOORD;
};
struct vsOut
{
float4 p : POSITION;
float4 c : COLOR0;
float2 t : TEXCOORD0;
float3 n : TEXCOORD1;
float3 v : TEXCOORD2;
float4 s : TEXCOORD3;
float3 w : TEXCOORD4;
float3 o : TEXCOORD5;
};
vsOut vs_main(vsIn i)
{
vsOut o;
// Basic transformation of untransformed vertex into clip-space
o.p= mul(i.p, matWVP);
// No scaling or translation is done, simply assign them and let the GPU interpolate
o.c = i.c;
o.t = i.t;
o.o = i.p;
// Trasform to world space
o.w= mul(i.p, matWorld).xyz;
o.n= mul(i.n, transpose((float3x3)matWorldI));
//OUT.normal = mul(matWorldIT, IN.normal);
// Calculate the view vector
o.v= viewPos - o.w;
// (Pre-proj biased screen texcoords, unscaled z, w)
o.s = o.p;
o.s.xy = o.s.xy * float2(.5f, -.5f) + o.s.w * (.5f + .5f * res.zw);
o.s.z = dot(o.w - viewPos, viewDir);
return o;
};

View File

@@ -0,0 +1,52 @@
float4x4 matWVP : register(c0);
float4x4 matWorld : register(c12);
float4x4 matWorldI : register(c16);
float3 viewPos : register(c4);
float3 viewDir : register(c10);
float4 res : register(c5);
struct vsIn
{
float4 p : POSITION;
float3 n : NORMAL;
float4 c : COLOR;
float2 t : TEXCOORD;
};
struct vsOut
{
float4 p : POSITION;
float4 c : COLOR0;
float2 t : TEXCOORD0;
float3 n : TEXCOORD1;
float3 v : TEXCOORD2;
float4 s : TEXCOORD3;
float3 w : TEXCOORD4;
};
vsOut vs_main(vsIn i)
{
vsOut o;
// Basic transformation of untransformed vertex into clip-space
o.p= mul(i.p, matWVP);
// No scaling or translation is done, simply assign them and let the GPU interpolate
o.c = i.c;
o.t = i.t;
// Trasform to world space
o.w= mul(i.p, matWorld).xyz;
o.n= mul(i.n, transpose((float3x3)matWorldI));
//OUT.normal = mul(matWorldIT, IN.normal);
// Calculate the view vector
o.v= viewPos - o.w;
// (Pre-proj biased screen texcoords, unscaled z, w)
o.s = o.p;
o.s.xy = o.s.xy * float2(.5f, -.5f) + o.s.w * (.5f + .5f * res.zw);
o.s.z = dot(o.w - viewPos, viewDir);
return o;
};

Some files were not shown because too many files have changed in this diff Show More