rebol [ Title: "3D Torus with hidden liine removal" Date: 01-Jan-2006 File: %torus.r Version: 1.0.0 Email: phil.bevan@gmail.com Category: [game] Purpose: { A 3D Persectve demo } License: {Copyright (c) <2006>, All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.} History: [ 0.0.1 - Initial Version 1.0.0 - Initial Release ] ] objs: to block! decompress #{ 789C9D5C4D12232B73DCFB14BA00130DC5EF017C8A89597861AFBCF3FD235C49 490DA52ED448F3BD2FDE1B550A3599D09D09487FFFE3C17FFE1E8FF37FFF1E7F FF1E7F8E87FF931EFC6FFEABFC2D121D3E94C3D71642E05248672D00AA00BE9D 456EF3CF0B7AFC296B28C3726EB58456FD514AF5F3871CEA72AE50A7B0FC29EE D315B97149FDEA3F80DFFA3D3E27E4239610724EC7412D035A4AF03E87967C25 7F5E6E88B5C6E38831A4E26305D0FB10039AE40A8D6E065F8E7CF0C71C957226 5C1BF9E368B9F99053C80BEA7CA11CAB2F25332968AED55899960428B7750AE0 E908943D5148876F78BD50CD47AA3E96D47CB23FA0FDA93165F2CC742E5CFA4F 07F953AA5428D672506A35BF3A51FFE41AE2516B258A7CCD028E8D5FA35A98AB EC8FF8A466A7E132317E7FF90B1D6F093AC7C3AD028B4FB8D578F4227137B823 3E72211DF88878B444B53111A5762665DCC47678DF027F38BFCA43DCFF01A3CD C7CCFF1C790C9B184A0AC917A6A01C1523D1170625EE60AB81DA62D8105F1E5F 60049FCC0B68E171DC420E47A9A94DE386EBC927962936EE20442A3CF673E3CB 49B5C53ED64DDEB9C100755B66F60ADAA3501A95CA3D63E6A719EE8B3F98E8E2 730E953042224FF0C8A3832717CFA878D272D7A89AA3EAC2BD71E10B3DEFB939 87CC2DFB8B8FB89377F482EF663C0E5BE319E48F94318A4F3698309E53940EEE 93472321FA23249E6DA5C61807C139A095A38644BEA458E848AB5B315EAF398F 66FA109266A8DFC073E47B5C3B124B5529AC0618846C3CF318C8C3BBDF06FC5B A3A74ED726C6FDF3AE99C1947D750B01AC6E9EAA9A742D1A521A1CED2AC2B8C0 96A3E7DB958F891F5D1DCAF7818305CD3133B69C9DE621CE639921AC3B8F5E5C 4BE311C56F2DE1A098067795FFCAF751CF73826F7150BCA592F087D9E2476458 A89379E0F21D19E32FA72E060F2CBE83310F9E71654CFF5879941EE5280122E0 13528989F84F209E8B325BAD499423F733625A33B68318C693A3A107C7A43F05 4F8DEAC11DE1B9CCAFB370B80B079F528B758C85DB2607D577574D2B39EF8939 47C91DF7CBCFB895F7D50F6380BC8F21E1C61820EF1F3246E1DB455A1D3107FA 65805CB97A3EE4AE03E422877953BC8C908BE2AF21731921974174EC35393D9A 6FAF7A7507B825E61C32F7DC9B9FB121EF183297674549E728B93C1FDE9E2067 239747455EDA7CE361718E84EBA3829619C0783EBCDFFB5F93FBF2AC08231FDC 363314B7AF6EA1B2D5CDA7AE0BBA1652DE693094BC58C377F7F892F5DD1ABEBB 8B713BB958C337FFB2B8615DACE1D5223DDDCAC51A5EEDA3F938BE58C3ABD37B A97FB18657FB78188D06A3D1C966DD5EF8EA667ECBCD394A6ED95F8C9859DED4 0C7DA721F39E42DF83EA6BC85C53E85B8819F793F714FA1E9316BC5C62E82588 3D99BFA4D06BD43387CC5B06B503E56BD0BC65503BA91E46C3E5BDE10AEC3470 6E2F7F3570EE083AC7CDAD028B7173ABF11837FDFE3906C7FB72CF310D8717D4 7C4C3D6B67745941ADE59E63C8355F8E0D5501E9F9C2FA8A06951FC146BF9753 CB6DCF2DB73FB9DCAFB3CBBD8F1EBF9C5FEED709E6AC89B09C61EE6D8AD1A729 6636BD9E634617362799C1D36A9A195AECCD3343EFE533DDED3ED4DDFE53DDFD FA5877FBCF75F7EB83DD7DF16477FB8F76A3D9F5B3DDB8F8CD87BBC1D0EAE96E A8B0F77837945E9A7BF7C9DDBBEBE2C4CADFBB6F0CBEFBE4F0DD3716DFED7B7C F7D1E45F1B5ABB7CF795CD779F7CBEFBC6E81B722C73BEDB0EFA6E3BE9F741FE 5BD477FB59DFBDC7E6E558B8AEDDECA67DB71DF7AF8DAEF23E5DAF7C3BF01BF4 2C13BFA1C15EE437845EAF2CBAEDA545B7BFB6E87E5D5C74BBAB8B32D37E595E 74FBEB8B6E7B81D16874B5C2685CF9F612A341CF628D315D35D85E64BC0AAD2C B4DBDD64709F7719DCF63683FBBCCFE07EDC68709F771AAE6C9D1DBD6F48EF35 1857B8DC6C303AAB761BAEB46D6E375CE598EE706FCED26DEF36BAEDED46F7E3 7EA3DBDF7074BFEE38BA2FB61CDDFE9EE3A5D9F5A6A379F10B6537183A87CCBD 0A8B0FB9113ACD635CC7DB3E46370F39B8FD530EEEB7630E6EFF9C83FBE9A043 7E26D0BD930EFE89DE3FEA7069FAD35907A30B0B7DEF693AC7D0BD128BCFB857 7BF4E440753EBCE33E1D26721F4F13397D9CE8957D16E08F078A9C3E5164809D 467F3A53E4DE0E15B9CFA78AAE0CBC3ECB58525ACDB9CB1A435B4F3A6B21636B D6D98B25F6BCB397647626DEFBDA4FFB3CF3CC75A5E5D4DB6BBCCC12FC3AF9F6 D872275D3FCEBF8BF29F26A07B37017169022ECB0E61E9022E4B1B65D306D8CB 27B60FB01769768C80FBC609B8772B90D65660A7613D9B7F34037B3C8DA174AF C6EA63F6FD80FB1813DE17373EE404F74D5070A6799EC6C81751C1DD5BFC3ADF 333F84854B53FE535C585FE64A16B3CF436FE6EF187FFC6E7AD81169BA66B5A8 E0976B0AEE2D6BA6F59A82DB08B4F6A2827B8BCD71BDA8E0B6B2F96ADAED2E2B B8FD7585AD6627DE7F5D59D8E2680CA20D25561F73ABF7D99BFB95CDFA62E97E C56B9E9DB7EB6A4B8935236DBDB879E1DD58DDB497A76C7DD520086A24DD2C70 E669286D343C3FFDEF3BB0BC55DCF33406D3AFCB9C5BAA4FA3E9C3FE87792FB3 CF3799F7CBD506C8E24E3C06C9175B20C603E7FA549AEE041F364116CF9BEB53 297CBECC95FC669F5F827FB513B223CC24F1DD0E691C7AEF6E91DA7E68638FD4 765DF626A96DEE7676490D776A58CD6958DCED934E63E48B8DD2BD0E2C9F09DB 5BA55B6AAC46D2FE66E9353ABBEB9AD63994B6CF6C98316DE7D086DB388D300D A5DF4E6DB8FB631B693AB6E1EECF6D8C631B97B6AFE736F27C6E63AF17CBF174 CBD5184E3F9EDCD8927D1A4EF3A9246B1DEB98C7C8FAEC93D3E7A4CE67D852D0 F54929A78F4A2DC0B3201FCE3FB9B7D352EEF371299B81F5ECDB9F7C5FCCBD9F A7DEFECCFB79E25973633DEFAC15E5E5BC5BAC28AFA6DDEFB36E7FD2FD3CE73E 4EB99B23D04B2FF08515B82E9F6C3EE1BE30023FFB806F6CC0172EE02B13F0BB 07F8C202188B587B0EE0A301587F17C25A9EDA0D0B5F65858F51E1ABA4F04550 F89C13BE8A09DFA5848F21C158B8DACB0B9FE2C2E637A4AC35A9C5C1A94B9CC5 7CD939387509CDEB2F4919D17CEFE094B356A4EC83536EFB7B523B8D4E43C458 4BBB2E59FD488F3B564B0AE68AD5CE8AC2FAE094DBFE4EA6DBFF52A6FBF55B99 6EFF6B99CE1A2C3B07A7DCFE1733DDF63733771A9D28FFF1BB995BF48CE1F3E3 B7337784D67E7A7B47E46643647F3FE4663BE4D7DD909BCD902FF6426EB742BE D909B9D908D9FCA2F6861CF31D4EB9CCB0FA9986CBEAC3EA671A2E0B1C69EF77 1A2E8B28D044BBACE98972F78307CBDBCEFDAF2AAC764BD7BFD5B0D5AC9B47D8 4FBFD6B0C5D01830B72AAC3EE446E7B9232AE596D54FC35C961ADAF2B7612EEB 1971EFC7612E4B26F8ECEDE31B3F9DDE20FFF10762DE1797D2A75F88D96AFAE3 D18DDF4F6EEC1FDC30B4587DC8ADDED2957F0FF95DA6F1EFBF7FFFFA07DF85F8 B3E8DFE37FFEEB7FFFEFBF1F7FF9EFFFE4179BC2831E9EC772346AF4E037652E 1BB5F8E037F100CD462D3DF84D3CCE8B51CB0F7E135F7E356AE5511FE178A0CB 975A7DB40767DA7018356EEE78F01D2178A3C825BE61F3233B04ABCAF7727E63 648055E5FF64DAB86E1509A4B26461E627BCAA11B4B2F109D9AA26101BB8BBC5 AA6650CB0FB650AD6A01B9C43D6E56B5825E1E857458D50682F9664EDEA87289 29660F45C1AA7A70CC776D22AB1AC0312506585570F8A0CC00AB1A3BC9FC5E8B 2B7E9D49E64737CD5CD1AB9A4132DF7CA95AD502922377B959D50A92A3678055 6D2039060618552E31C93CEF62B0AA1E24B32F8864550348663318A35525901C 3303AC6A04C99C2D62B6AAE0F011B9CB1657943BC9FC5E8B2B7E9D494EDCE599 ABF8AA5690CCCFD67458D5069253608051E512939C880156D583647EF627B2AA 0124B3334BD1AA1248E67B734A56358264360F295BD504921377B958D50C9213 77B95A5570F8C8DC658BAB583BC98D0156B581E41C1E79E62ABDEE9D0748CEC4 00ABEA41323F373259D5009233DF7EA3552590CC192327AB1A41722E0CB0AA09 24B377C9C5AA66909CB9BFD5AA16905CB8CBCDAA56905C3C03AC2A387C94C000 A39A8F4E32BFD7E28A5F679239BD9599ABFCAA0690CC71A244AB4A20B9F0C32A 59D508924B6180554D2099F36429563583E4C25DAE56B580E4CA5D6E56B582E4 EA1960551B48AE810146954B4C722506585570F8A8910156357492F9BD1657FC 3A93CC3EADCE5C9557358264B65A355BD504922B77B958D50C92395DD66A550B 486EDCE566552B48E63CD90EABDA40720B0C30AA5C62921B31C0AA7A90DC2203 AC6A00C92D31C0AA82C347CB0CB0AAB193CCEFB5B8E2D7B131C45D9EB9AAAF6A 06C98DBB5CAD6A01C96C341961952B58E66C0688556FE0D923CC1EDEA873B1E1 BD048C55F7E01AEE9C31563D806D7F2460AC3A816FCF598931563D8271B6FAC0 587550CA35506091D772671D6FB7D8E302D3EEE1248F99BEF6AA5710EFE125FD 61D55BA7DEC34E7A6F007A15ECC353FA6022BCF00F5FA98CFC40045100DE52D9 F98120D100FE5299FA8188A2023CA6B2F603914407F84C65F007228B1270F9CA E60F44112DE0F5BD4528AA5D8D06900968A207DB4EAF6DFF713AFB432461EFE9 B5F71F102FA2C080EA0030204154C162918E010342220B5B51AFB2C00489A20B FB51AF02C10449224C0031C58664512680966A438A4843E0A6D9902ADA10A2CD 61439A88C346D593CD6E389EF2A0159B5D94A00FC1DE2B7647BE0AA20FFB56AF 82C30421D187CDAB57E9618244D1874D975711628224D187C04DB12159F42170 536D48117D22B86936A48A3EEC6ABD8A1513A4893E11A9DC9B1094A14F44C60C 36C48B3E6C727DB4D9A5F0D407ADD8ECA2047DD8EE7A9537FC1919BB7C582128 80D99024FAE0F76B55F2982059F4C1D2858A1F13A4883E09DC341B52451FF6C1 5E059109D2441F36C35EA591014119FA242C7D041BE2459F84184F3624883EEC 8DBD0A271384449F8445149BDD189FFAA0159B5D94A04F02378A5D3A2159F449 E0A6DA9022FA6470D36C48157DD8EC79155D2648137DD83E7B955F060465E883 1F415621668278D1070B602AC94C9020FA64AC94441B42A20F5B6AAF32CD0489 A24FC64A55B62149F4C1C26CB6D94DF9A90F5AB1D94509FA1470A3D88D27A48A 3EECB5BD0A3B13A4893E6CB8BD4A3C038232F461A3E855EC99205EF461EBED55 F6992041F4C116940A401384449F82C5A86443A2E8C34EDCAB28344192E853C0 4DB12159F429E0A6DA9022FA547063B39BEB531FAC2DDAECA2047DD8A27B9591 FC2B32F632F4619FEE55509A205EF461B3EE555A9A2041F4C11E818A4C138444 1FFCECB3CA4D13248A3E15EB7DD98624D107DE5E25A80992451FF87B15A32648 117D60F155969A2055F481CB57816A8234D10746BFD9ECD6E3A90F5AB1D94509 FAC0EEAB7CE5F30909A20F1CBF0A591384441F987E95B42648147D603355DC9A 2049F481F757996B8264D1070E5F05AF0952BA3E01165F85AF0952BB3EE1C0FA F661435AD727B0C90F2A820D08E46B688100B3219D782E47C06C4878EA83566C 7611D51A5AC8FC7FC56E3921B1EB13D8E90795C82648EAFA607B24A850364172 D7271CE0A6DA90D2F509D80050D96C82D4AE4FC02E808A6713A4757D02B60254 403B21BD0C7DB050AD12DA04F1A20F7605F45ECB8004D1075B037ACB654048F4 C1FE8037D94559F4412B26BBBD047D3CB851ECD61392451FEC09E8ED980129A2 4FDF186836A48A3E7D77E0B0214DF4C11681CE6A270465E8D3B769820DF1A20F F66A74561B9020FA60C74067B50121D107DB063AAB0D48147DB077A0B3DA8024 D1071B08C166D7E7A73E68C5661725E883AD1C9DD5DA09A9A20F6107EBB0214D F4216CC078138232F4619F1974561B102FFA1076C2C88604D187CD7ED0596D40 48F4C14683CE6A0312451F36FB4167B50149A20F819B6243B2E843E0A6DA9022 FA447063B31BEA539F06980D69A24FC426A1DA337BC5DC5E863E117B5CC18678 D187CD7E50596D8204D1877D6650596D8290E8C3663FA8AC3641A2E8C3663FA8 AC364192E813C14DB12159F489E0A5DA9022FA2470D36C48157DD8EC0795D526 48137DD8EC8764B31B8FA73E68C5661725E8C3663FA8AC16CE4DEE2E1FB61813 603684449F844DB26443A2E8C33E33A8AC364192E893C04DB12159F449E0A6DA 9022FA6470D36C48157DD8EC0795D52648137DD8EC0795D5060465E8C3663FA8 AC3641BCE893B1D76DB39BC2531FB462B38B12F461B31F54560B639B378A3E19 7BE6D98624D127839B6243B2E893C14DB52145F429E0A6D9902AFAB0D90F2AAB 4D9026FAB0D90F2AAB0D08CAD087CD7E50596D8278D187CD7E50596D8204D1A7 E03841B42124FA146C86DBECE6F8D407ADD8ECA2047D0AB851EC8ECDF62CFA14 70536D48117D2AB86936A48A3EEC3383CA6A13A4893E6CF683CA6A038232F461 B31F54569B205EF461B31F54569B2041F461B31F54569B2024FA549CD8483624 8A3E15E70DB20D49A20FB240B5D92DF9A90F5AB1D94509FA200BA8AC16E209A9 A20FB280CA6A13A4893EC8022AAB0D08CAD0073E5365B509E2451F640195D526 48107D900554569B2024FA200BA8AC3641A2E8832CA0B2DA0449A20FB280CA6A 13248B3E30FB2AAB4D904EFC8360F69BCD6EAD4F7D703AC46617518EF52136FB A4B25A78C5DC2E5FC3191D02CC86F8AE0FB1D92795D52648E8FA10FB4C52596D 8250D787D8EC93CA6A1324767D88CD3EA9AC364152D7870E70536C48EEFAD001 5EAA0D295D1FF2E0A6D990DAF52136FBA4B2DA04E9C4731987984C76BB7C5D1F B462B2DB4BD087CD3EA9AC16F20909A20F9B7D52596D8290E8C3669F54569B20 51F4619F492AAB4D9024FAE05497CA6A13248B3EFD6857B52145F4C1F92E95D5 2648157D70C84B65B509D2441F9CF452596D4050863E38EEA5B2DA04F1A20FCE 7C059B5D1F9EFAA0159B5D94A00F4E7FE93376E58444D10747C0F441BB0149A2 4F0037C58664D10727BEF491BB0129A20F8E7DE973770352451F9CFDD287EF06 A4893EFD00983721FD781E5A20C06C88177DFA513CB22141F4C179307D206F40 48F4C1A13CB2D90DF1A90F5AB1D94509FAE07898CA6AA19E902CFAE08C9ECA6A 13A4883E38A8A7B2DA04A9A20FFB4C52596D8234D127E294A2372128439F8833 76C18678D187CD3EE9AC362041F48938ED186D08893E6CF64967B50189A20F9B 7DD2596D4092E8830365D16697F2531FB462B38B12F449E046B1DB4E48157DD8 EC93CE6A03D2441F36FBA4B3DA094119FA241C040D36C48B3E09C718C98604D1 87CD3EE9AC362024FA241C284D36248A3E6CF64967B50149A24F0237C58664D1 27819B6A438AE893C18DCD6EAC4F7D1A6036A4893E6CF64965357AC5DC5E863E 6CF64965B509E2459F8CB3B6644382E893715234DA10127DD8EC93CA6A13248A 3E6CF64965B50992449F0C6E8A0DC9A24F062FD58614D1A7809B6643AAE8C366 9F54569B204DF461B34FC566371F4F7DD08ACD2E4AD087CD3EA9AC46E781F92E 1FD35770CC36DA10127DD8EC93CA6A13248A3EEC334965B50992449F026E8A0D C9A24F0137D58614D1A7829B6643AAE8C3669F54569B204DF461B34F2AAB0D08 CAD087CD3EA9AC3641BCE8C3669FAACD6E094F7DD08ACD2E4AD0A7E2C4B86237 9C9028FA549C77CE3624893EC8022AAB4D902CFAC067AAAC36418AE8832CA0B2 DA04A9A20FB280CA6A13A4893EC8022AAB0D08CAD007594065B509E2451F6401 95D52648107D900554569B2024FA200B349BDD1A9FFAA0159B5D94A00FB280CA 6A741E45EFF2E1583FB8A936A4747D22B280CA6A13A4767DE28113FE870D695D 9FC8663FAAAC362090AFA10502CC86F8AE4F64B31F55569B20A1EB13D9EC4795 D52608757D229BFDA8B2DA04895D9FC8663FAAAC36413AF15C063736BB2D3FF5 412B36BB8872AC4FF4E046B13B8EFCD7AE4F64B31F55569B20ADEB133DBE44E1 2D482F431FF6995165B509E2451F36FB5165B50912441F36FB5165B50942A20F 9BFDA8B2DA0489A20F9BFDA8B2DA0449A28F0737C58664D1C7839B6A438AE813 C08DC92ECAA24F03CC8634D187CD7E54598D5E31B797A14FC0F754820DF1A20F 9BFDA8B2DA0409A20FFBCCA8B2DA0421D187CD7E54596D8244D187CD7E54596D 8224D107DFD951596D8264D1075FDC51596D8214D1A77F7BA7D9902AFAF4AFF0 1C36A4893EF81E0FD9EC86E3A90F5AB1D945091B670FD5423ECBA16B438F6097 497479905D8E5D93F4887639753DF223D9E5DCB5288F6C974BD7A13E8A5DAE5D 83F6A876B975FE79FC35B30E6D7082D13FF4AD63003AA70F2F87152D401FF5F8 7EDE95BB7FFFF1EFFF012E8EA63AA0820000 } clrs: [50.255.100 55.250.97 60.245.94 65.240.91 70.235.88 75.230.85 80.225.82 85.220.79 90.215.76 95.210.73 100.205.70 105.200.67 110.195.64 115.190.61 120.185.58 125.180.55 130.175.52 135.170.49 140.165.46 145.160.43 150.155.40 155.150.37 160.145.34 165.140.31 170.135.28 175.130.25 180.125.22 185.120.19 190.115.16 195.110.13 200.105.10 205.100.7 210.95.4 215.90.1 220.85.254 225.80.251] camera: [0 0 6 0 0 800 800] ; x y z a1 a2 xsc ysc ; draw order for all faces draw-o: [] ; draw block draw-bl: [] rot: false fn-rot: func [obj [block!]][ context [ c1: cosine obj/1/4 c2: cosine obj/1/5 c3: cosine obj/1/6 s1: sine obj/1/4 s2: sine obj/1/5 s3: sine obj/1/6 clear obj/3 clear obj/4 obj/3: copy/deep obj/2 ; calculate the perspective of the points after the roation & translation foreach point obj/3 [ ; Roation about z axis x1: (point/1 * c1) - (point/2 * s1) y1: (point/1 * s1) + (point/2 * c1) z1: point/3 ; Roation about y axis x2: (x1 * c2) + (point/3 * s2) y2: y1 z2: - (x1 * s2) + (point/3 * c2) x3: x2 + obj/1/1 y3: (y2 * c3) - (z2 * s3) + obj/1/2 z3: (y2 * s3) + (z2 * c3) + obj/1/3 poke point 1 (x3 + camera/1) poke point 2 (y3 + camera/2) poke point 3 (z3 + camera/3) x: point/1 / point/3 * camera/6 y: point/2 / point/3 * camera/7 append obj/4 to pair! reduce[(x + 250) (y + 250)] ] foreach f obj/5 [ p1: f/1/1 p2: f/1/2 p3: f/1/3 d1: reduce [(obj/3/:p2/1 - obj/3/:p1/1) (obj/3/:p2/2 - obj/3/:p1/2) (obj/3/:p2/3 - obj/3/:p1/3)] d2: reduce [(obj/3/:p3/1 - obj/3/:p1/1) (obj/3/:p3/2 - obj/3/:p1/2) (obj/3/:p3/3 - obj/3/:p1/3)] poke f 4 (-2 * obj/3/:p1/3 - d1/3 - d2/3) n1: (d1/2 * d2/3) - (d1/3 * d2/2) n2: - (d1/1 * d2/3) + (d1/3 * d2/1) n3: (d1/1 * d2/2) - (d1/2 * d2/1) v: 0 > ((obj/3/:p1/1 * n1) + (obj/3/:p1/2 * n2) + (obj/3/:p1/3 * n3)) poke f 2 v ] ] ] fn-show: func [][ context [ ; setup the faces to be shown pts: [] clear draw-o foreach o objs [ foreach f o/5 [ if f/2 = true [ append draw-o f/4 switch f/3/1 [ 1 [append/only draw-o reduce ['image (pick bmps f/3/2) pick o/4 f/1/1 pick o/4 f/1/2 pick o/4 f/1/3 pick o/4 f/1/4]] 2 [ pts: copy reduce ['fill-pen (pick clrs f/3/2) 'polygon] foreach coord f/1 [append pts pick o/4 coord] append/only draw-o pts ; append/only draw-o reduce ['fill-pen (pick clrs f/3/2) 'polygon pick o/4 f/1/1 pick o/4 f/1/2 pick o/4 f/1/3 pick o/4 f/1/4] ] ] ] ] ] ; sort the faces sort/skip draw-o 2 ; reset the draw-block clear draw-bl append draw-bl reduce ['pen black] ; create the draw block forskip draw-o 2 [append draw-bl draw-o/2] ; show the face show f-box f-angles/text: rejoin [to string! objs/1/1/4 " / " to string! objs/1/1/5 " / " to string! objs/1/1/6] show f-angles ] ] foreach o objs [fn-rot o] lv-lay: layout [ across backdrop 10.120.10 banner "A Torus in 3D Perspective" return vh2 "Rotate - left, right, up, down, page-up, page-down" return vh2 "Zoom - ^"+^" ^"-^"" font-fixed return f-box: box 500x500 effect [draw draw-bl] rate 60 edge [size: 2x2 color: gray effect: 'bevel] feel [ engage: func [face action event][ if all[action = 'time rot][ objs/1/1/4: objs/1/1/4 + 3 if objs/1/1/4 > 360 [objs/1/1/4: objs/1/1/4 - 360] objs/1/1/5: objs/1/1/5 + 6 if objs/1/1/5 > 360 [objs/1/1/5: objs/1/1/5 - 360] objs/1/1/6: objs/1/1/6 + 2 if objs/1/1/6 > 360 [objs/1/1/6: objs/1/1/6 - 360] fn-rot objs/1 fn-show ] ] ] return sensor 0x0 keycode [up down left right page-up page-down #"+" #"-"] [ switch value [ up [objs/1/1/4: objs/1/1/4 + 5 fn-rot objs/1 fn-show if objs/1/1/4 > 360 [objs/1/1/4: objs/1/1/4 - 360]] down [objs/1/1/4: objs/1/1/4 - 5 fn-rot objs/1 fn-show if objs/1/1/4 < 0 [objs/1/1/4: objs/1/1/4 + 360]] left [objs/1/1/5: objs/1/1/5 + 5 fn-rot objs/1 fn-show if objs/1/1/5 > 360 [objs/1/1/5: objs/1/1/5 - 360]] right [objs/1/1/5: objs/1/1/5 - 5 fn-rot objs/1 fn-show if objs/1/1/5 < 0 [objs/1/1/5: objs/1/1/5 + 360]] page-up [objs/1/1/6: objs/1/1/6 + 5 fn-rot objs/1 fn-show if objs/1/1/6 > 360 [objs/1/1/6: objs/1/1/6 - 360]] page-down [objs/1/1/6: objs/1/1/6 - 5 fn-rot objs/1 fn-show if objs/1/1/6 < 0 [objs/1/1/6: objs/1/1/6 + 360]] #"+" [if camera/6 < 2000 [camera/6: camera/6 + 10 camera/7: camera/7 + 10 fn-rot objs/1 fn-show]] #"-" [if camera/6 > 200 [camera/6: camera/6 - 10 camera/7: camera/7 - 10 fn-rot objs/1 fn-show]] ] ] btn "Auto-Rotate" [either rot [rot: false][rot: true]] f-angles: field 400 ] fn-show view lv-lay