A"""
129 | soup = self.soup(markup)
130 | self.assertEqual(u"A", soup.body.decode())
131 |
--------------------------------------------------------------------------------
/modules/bs4/tests/test_htmlparser.py:
--------------------------------------------------------------------------------
1 | """Tests to ensure that the html.parser tree builder generates good
2 | trees."""
3 |
4 | from pdb import set_trace
5 | import pickle
6 | from bs4.testing import SoupTest, HTMLTreeBuilderSmokeTest
7 | from bs4.builder import HTMLParserTreeBuilder
8 |
9 | class HTMLParserTreeBuilderSmokeTest(SoupTest, HTMLTreeBuilderSmokeTest):
10 |
11 | @property
12 | def default_builder(self):
13 | return HTMLParserTreeBuilder()
14 |
15 | def test_namespaced_system_doctype(self):
16 | # html.parser can't handle namespaced doctypes, so skip this one.
17 | pass
18 |
19 | def test_namespaced_public_doctype(self):
20 | # html.parser can't handle namespaced doctypes, so skip this one.
21 | pass
22 |
23 | def test_builder_is_pickled(self):
24 | """Unlike most tree builders, HTMLParserTreeBuilder and will
25 | be restored after pickling.
26 | """
27 | tree = self.soup("foo")
28 | dumped = pickle.dumps(tree, 2)
29 | loaded = pickle.loads(dumped)
30 | self.assertTrue(isinstance(loaded.builder, type(tree.builder)))
31 |
32 |
33 |
--------------------------------------------------------------------------------
/modules/bs4/tests/test_lxml.py:
--------------------------------------------------------------------------------
1 | """Tests to ensure that the lxml tree builder generates good trees."""
2 |
3 | import re
4 | import warnings
5 |
6 | try:
7 | import lxml.etree
8 | LXML_PRESENT = True
9 | LXML_VERSION = lxml.etree.LXML_VERSION
10 | except ImportError as e:
11 | LXML_PRESENT = False
12 | LXML_VERSION = (0,)
13 |
14 | if LXML_PRESENT:
15 | from bs4.builder import LXMLTreeBuilder, LXMLTreeBuilderForXML
16 |
17 | from bs4 import (
18 | BeautifulSoup,
19 | BeautifulStoneSoup,
20 | )
21 | from bs4.element import Comment, Doctype, SoupStrainer
22 | from bs4.testing import skipIf
23 | from bs4.tests import test_htmlparser
24 | from bs4.testing import (
25 | HTMLTreeBuilderSmokeTest,
26 | XMLTreeBuilderSmokeTest,
27 | SoupTest,
28 | skipIf,
29 | )
30 |
31 | @skipIf(
32 | not LXML_PRESENT,
33 | "lxml seems not to be present, not testing its tree builder.")
34 | class LXMLTreeBuilderSmokeTest(SoupTest, HTMLTreeBuilderSmokeTest):
35 | """See ``HTMLTreeBuilderSmokeTest``."""
36 |
37 | @property
38 | def default_builder(self):
39 | return LXMLTreeBuilder()
40 |
41 | def test_out_of_range_entity(self):
42 | self.assertSoupEquals(
43 | " foobar ", "foobar ")
44 | self.assertSoupEquals(
45 | "foobar ", "foobar ")
46 | self.assertSoupEquals(
47 | "foobar ", "foobar ")
48 |
49 | # In lxml < 2.3.5, an empty doctype causes a segfault. Skip this
50 | # test if an old version of lxml is installed.
51 |
52 | @skipIf(
53 | not LXML_PRESENT or LXML_VERSION < (2,3,5,0),
54 | "Skipping doctype test for old version of lxml to avoid segfault.")
55 | def test_empty_doctype(self):
56 | soup = self.soup("")
57 | doctype = soup.contents[0]
58 | self.assertEqual("", doctype.strip())
59 |
60 | def test_beautifulstonesoup_is_xml_parser(self):
61 | # Make sure that the deprecated BSS class uses an xml builder
62 | # if one is installed.
63 | with warnings.catch_warnings(record=True) as w:
64 | soup = BeautifulStoneSoup("")
65 | self.assertEqual("", str(soup.b))
66 | self.assertTrue("BeautifulStoneSoup class is deprecated" in str(w[0].message))
67 |
68 | @skipIf(
69 | not LXML_PRESENT,
70 | "lxml seems not to be present, not testing its XML tree builder.")
71 | class LXMLXMLTreeBuilderSmokeTest(SoupTest, XMLTreeBuilderSmokeTest):
72 | """See ``HTMLTreeBuilderSmokeTest``."""
73 |
74 | @property
75 | def default_builder(self):
76 | return LXMLTreeBuilderForXML()
77 |
--------------------------------------------------------------------------------
/modules/bs4/tests/test_lxml.py.bak:
--------------------------------------------------------------------------------
1 | """Tests to ensure that the lxml tree builder generates good trees."""
2 |
3 | import re
4 | import warnings
5 |
6 | try:
7 | import lxml.etree
8 | LXML_PRESENT = True
9 | LXML_VERSION = lxml.etree.LXML_VERSION
10 | except ImportError, e:
11 | LXML_PRESENT = False
12 | LXML_VERSION = (0,)
13 |
14 | if LXML_PRESENT:
15 | from bs4.builder import LXMLTreeBuilder, LXMLTreeBuilderForXML
16 |
17 | from bs4 import (
18 | BeautifulSoup,
19 | BeautifulStoneSoup,
20 | )
21 | from bs4.element import Comment, Doctype, SoupStrainer
22 | from bs4.testing import skipIf
23 | from bs4.tests import test_htmlparser
24 | from bs4.testing import (
25 | HTMLTreeBuilderSmokeTest,
26 | XMLTreeBuilderSmokeTest,
27 | SoupTest,
28 | skipIf,
29 | )
30 |
31 | @skipIf(
32 | not LXML_PRESENT,
33 | "lxml seems not to be present, not testing its tree builder.")
34 | class LXMLTreeBuilderSmokeTest(SoupTest, HTMLTreeBuilderSmokeTest):
35 | """See ``HTMLTreeBuilderSmokeTest``."""
36 |
37 | @property
38 | def default_builder(self):
39 | return LXMLTreeBuilder()
40 |
41 | def test_out_of_range_entity(self):
42 | self.assertSoupEquals(
43 | "foobar ", "foobar ")
44 | self.assertSoupEquals(
45 | "foobar ", "foobar ")
46 | self.assertSoupEquals(
47 | "foobar ", "foobar ")
48 |
49 | # In lxml < 2.3.5, an empty doctype causes a segfault. Skip this
50 | # test if an old version of lxml is installed.
51 |
52 | @skipIf(
53 | not LXML_PRESENT or LXML_VERSION < (2,3,5,0),
54 | "Skipping doctype test for old version of lxml to avoid segfault.")
55 | def test_empty_doctype(self):
56 | soup = self.soup("")
57 | doctype = soup.contents[0]
58 | self.assertEqual("", doctype.strip())
59 |
60 | def test_beautifulstonesoup_is_xml_parser(self):
61 | # Make sure that the deprecated BSS class uses an xml builder
62 | # if one is installed.
63 | with warnings.catch_warnings(record=True) as w:
64 | soup = BeautifulStoneSoup("")
65 | self.assertEqual(u"", unicode(soup.b))
66 | self.assertTrue("BeautifulStoneSoup class is deprecated" in str(w[0].message))
67 |
68 | @skipIf(
69 | not LXML_PRESENT,
70 | "lxml seems not to be present, not testing its XML tree builder.")
71 | class LXMLXMLTreeBuilderSmokeTest(SoupTest, XMLTreeBuilderSmokeTest):
72 | """See ``HTMLTreeBuilderSmokeTest``."""
73 |
74 | @property
75 | def default_builder(self):
76 | return LXMLTreeBuilderForXML()
77 |
--------------------------------------------------------------------------------
/primitives/cone.obj:
--------------------------------------------------------------------------------
1 | # Blender v2.79 (sub 0) OBJ File: ''
2 | # www.blender.org
3 | o cone
4 | v 0.475529 0.000000 -0.154509
5 | v 0.500000 0.000000 0.000000
6 | v 0.404509 0.000000 -0.293893
7 | v 0.475528 -0.000000 0.154509
8 | v 0.404509 -0.000000 0.293893
9 | v 0.293893 -0.000000 0.404509
10 | v 0.154508 -0.000000 0.475528
11 | v 0.000000 -0.000000 0.500000
12 | v -0.154509 -0.000000 0.475528
13 | v -0.293893 -0.000000 0.404509
14 | v -0.404509 -0.000000 0.293893
15 | v -0.475528 -0.000000 0.154509
16 | v -0.500000 0.000000 0.000000
17 | v -0.475528 0.000000 -0.154509
18 | v -0.404509 0.000000 -0.293893
19 | v -0.293893 0.000000 -0.404509
20 | v -0.154509 0.000000 -0.475528
21 | v 0.000000 0.000000 -0.500000
22 | v 0.154509 0.000000 -0.475529
23 | v 0.293893 0.000000 -0.404509
24 | v 0.000000 1.000000 0.000000
25 | vt 0.737764 0.172746
26 | vt 0.750000 0.250000
27 | vt 0.702254 0.103054
28 | vt 0.737764 0.327254
29 | vt 0.702254 0.396946
30 | vt 0.646946 0.452254
31 | vt 0.577254 0.487764
32 | vt 0.500000 0.500000
33 | vt 0.422746 0.487764
34 | vt 0.353054 0.452254
35 | vt 0.297746 0.396946
36 | vt 0.262236 0.327254
37 | vt 0.250000 0.250000
38 | vt 0.262236 0.172746
39 | vt 0.297746 0.103054
40 | vt 0.353054 0.047746
41 | vt 0.422746 0.012236
42 | vt 0.500000 -0.000000
43 | vt 0.577254 0.012236
44 | vt 0.646946 0.047746
45 | vt 0.250000 0.500000
46 | vt 0.275000 0.500000
47 | vt 0.500000 1.000000
48 | vt 0.300000 0.500000
49 | vt 0.325000 0.500000
50 | vt 0.350000 0.500000
51 | vt 0.375000 0.500000
52 | vt 0.400000 0.500000
53 | vt 0.425000 0.500000
54 | vt 0.450000 0.500000
55 | vt 0.475000 0.500000
56 | vt 0.500000 0.500000
57 | vt 0.525000 0.500000
58 | vt 0.550000 0.500000
59 | vt 0.575000 0.500000
60 | vt 0.600000 0.500000
61 | vt 0.625000 0.500000
62 | vt 0.650000 0.500000
63 | vt 0.675000 0.500000
64 | vt 0.700000 0.500000
65 | vt 0.725000 0.500000
66 | vt 0.750000 0.500000
67 | vn 0.0000 -1.0000 -0.0000
68 | vn 0.8507 0.4472 -0.2764
69 | vn 0.7236 0.4472 -0.5257
70 | vn -0.0000 1.0000 0.0000
71 | vn 0.5257 0.4472 -0.7236
72 | vn 0.2764 0.4472 -0.8507
73 | vn -0.0000 0.4472 -0.8944
74 | vn -0.2764 0.4472 -0.8507
75 | vn -0.5257 0.4472 -0.7236
76 | vn -0.7236 0.4472 -0.5257
77 | vn -0.8507 0.4472 -0.2764
78 | vn -0.8944 0.4472 0.0000
79 | vn -0.8507 0.4472 0.2764
80 | vn -0.7236 0.4472 0.5257
81 | vn -0.5257 0.4472 0.7236
82 | vn -0.2764 0.4472 0.8507
83 | vn 0.0000 0.4472 0.8944
84 | vn 0.2764 0.4472 0.8507
85 | vn 0.5257 0.4472 0.7236
86 | vn 0.7236 0.4472 0.5257
87 | vn 0.8507 0.4472 0.2764
88 | vn 0.8944 0.4472 0.0000
89 | s 1
90 | f 1/1/1 2/2/1 3/3/1
91 | f 2/2/1 4/4/1 3/3/1
92 | f 4/4/1 5/5/1 3/3/1
93 | f 5/5/1 6/6/1 3/3/1
94 | f 6/6/1 7/7/1 3/3/1
95 | f 7/7/1 8/8/1 3/3/1
96 | f 8/8/1 9/9/1 3/3/1
97 | f 9/9/1 10/10/1 3/3/1
98 | f 10/10/1 11/11/1 3/3/1
99 | f 11/11/1 12/12/1 3/3/1
100 | f 12/12/1 13/13/1 3/3/1
101 | f 13/13/1 14/14/1 3/3/1
102 | f 14/14/1 15/15/1 3/3/1
103 | f 15/15/1 16/16/1 3/3/1
104 | f 16/16/1 17/17/1 3/3/1
105 | f 17/17/1 18/18/1 3/3/1
106 | f 18/18/1 19/19/1 3/3/1
107 | f 19/19/1 20/20/1 3/3/1
108 | f 1/21/2 3/22/3 21/23/4
109 | f 3/22/3 20/24/5 21/23/4
110 | f 20/24/5 19/25/6 21/23/4
111 | f 19/25/6 18/26/7 21/23/4
112 | f 18/26/7 17/27/8 21/23/4
113 | f 17/27/8 16/28/9 21/23/4
114 | f 16/28/9 15/29/10 21/23/4
115 | f 15/29/10 14/30/11 21/23/4
116 | f 14/30/11 13/31/12 21/23/4
117 | f 13/31/12 12/32/13 21/23/4
118 | f 12/32/13 11/33/14 21/23/4
119 | f 11/33/14 10/34/15 21/23/4
120 | f 10/34/15 9/35/16 21/23/4
121 | f 9/35/16 8/36/17 21/23/4
122 | f 8/36/17 7/37/18 21/23/4
123 | f 7/37/18 6/38/19 21/23/4
124 | f 6/38/19 5/39/20 21/23/4
125 | f 5/39/20 4/40/21 21/23/4
126 | f 4/40/21 2/41/22 21/23/4
127 | f 2/41/22 1/42/2 21/23/4
128 |
--------------------------------------------------------------------------------
/primitives/cube.obj:
--------------------------------------------------------------------------------
1 | # Blender v2.79 (sub 0) OBJ File: ''
2 | # www.blender.org
3 | o Mesh
4 | v -0.500000 -0.500000 0.500000
5 | v 0.500000 -0.500000 0.500000
6 | v 0.500000 0.500000 0.500000
7 | v -0.500000 0.500000 0.500000
8 | v 0.500000 0.500000 -0.500000
9 | v -0.500000 0.500000 -0.500000
10 | v 0.500000 -0.500000 -0.500000
11 | v -0.500000 -0.500000 -0.500000
12 | vt 1.000000 0.000000
13 | vt 0.000000 1.000000
14 | vt 0.000000 0.000000
15 | vt 1.000000 0.000000
16 | vt 0.000000 1.000000
17 | vt 0.000000 0.000000
18 | vt 0.000000 1.000000
19 | vt 1.000000 0.000000
20 | vt 1.000000 1.000000
21 | vt 1.000000 0.000000
22 | vt 0.000000 1.000000
23 | vt 0.000000 0.000000
24 | vt 0.000000 1.000000
25 | vt 0.000000 0.000000
26 | vt 1.000000 0.000000
27 | vt 1.000000 1.000000
28 | vt 1.000000 1.000000
29 | vt 0.000000 0.000000
30 | vt 1.000000 1.000000
31 | vt 1.000000 1.000000
32 | vn 0.0000 -0.0000 1.0000
33 | vn 0.0000 1.0000 0.0000
34 | vn 0.0000 0.0000 -1.0000
35 | vn 0.0000 -1.0000 -0.0000
36 | vn 1.0000 0.0000 0.0000
37 | vn -1.0000 0.0000 0.0000
38 | s 1
39 | f 2/1/1 4/2/1 1/3/1
40 | f 3/4/2 6/5/2 4/6/2
41 | f 5/7/3 8/8/3 6/9/3
42 | f 7/10/4 1/11/4 8/12/4
43 | f 7/10/5 3/13/5 2/14/5
44 | f 1/15/6 6/5/6 8/12/6
45 | f 2/1/1 3/16/1 4/2/1
46 | f 3/4/2 5/17/2 6/5/2
47 | f 5/7/3 7/18/3 8/8/3
48 | f 7/10/4 2/19/4 1/11/4
49 | f 7/10/5 5/17/5 3/13/5
50 | f 1/15/6 4/20/6 6/5/6
51 |
--------------------------------------------------------------------------------
/primitives/cylinder.obj:
--------------------------------------------------------------------------------
1 | # Blender v2.79 (sub 0) OBJ File: ''
2 | # www.blender.org
3 | o Mesh
4 | v 0.493845 0.000000 -0.078217
5 | v 0.475529 0.000000 -0.154509
6 | v 0.475529 1.000000 -0.154509
7 | v 0.493845 1.000000 -0.078217
8 | v 0.445504 0.000000 -0.226995
9 | v 0.445504 1.000000 -0.226995
10 | v 0.404509 0.000000 -0.293893
11 | v 0.404509 1.000000 -0.293893
12 | v 0.353554 0.000000 -0.353554
13 | v 0.353554 1.000000 -0.353554
14 | v 0.293893 0.000000 -0.404509
15 | v 0.293893 1.000000 -0.404509
16 | v 0.226995 0.000000 -0.445504
17 | v 0.226995 1.000000 -0.445504
18 | v 0.154509 0.000000 -0.475529
19 | v 0.154509 1.000000 -0.475529
20 | v 0.078217 0.000000 -0.493845
21 | v 0.078217 1.000000 -0.493845
22 | v 0.000000 0.000000 -0.500000
23 | v 0.000000 1.000000 -0.500000
24 | v -0.078217 0.000000 -0.493845
25 | v -0.078217 1.000000 -0.493845
26 | v -0.154509 0.000000 -0.475529
27 | v -0.154509 1.000000 -0.475529
28 | v -0.226995 0.000000 -0.445504
29 | v -0.226995 1.000000 -0.445504
30 | v -0.293893 0.000000 -0.404509
31 | v -0.293893 1.000000 -0.404509
32 | v -0.353554 0.000000 -0.353554
33 | v -0.353554 1.000000 -0.353554
34 | v -0.404509 0.000000 -0.293893
35 | v -0.404509 1.000000 -0.293893
36 | v -0.445504 0.000000 -0.226995
37 | v -0.445504 1.000000 -0.226995
38 | v -0.475529 0.000000 -0.154509
39 | v -0.475529 1.000000 -0.154509
40 | v -0.493845 0.000000 -0.078217
41 | v -0.493845 1.000000 -0.078217
42 | v -0.500000 0.000000 0.000000
43 | v -0.500000 1.000000 0.000000
44 | v -0.493845 -0.000000 0.078217
45 | v -0.493845 1.000000 0.078217
46 | v -0.475529 -0.000000 0.154509
47 | v -0.475529 1.000000 0.154509
48 | v -0.445504 -0.000000 0.226995
49 | v -0.445504 1.000000 0.226995
50 | v -0.404509 -0.000000 0.293893
51 | v -0.404509 1.000000 0.293893
52 | v -0.353554 -0.000000 0.353554
53 | v -0.353554 1.000000 0.353554
54 | v -0.293893 -0.000000 0.404509
55 | v -0.293893 1.000000 0.404509
56 | v -0.226995 -0.000000 0.445504
57 | v -0.226995 1.000000 0.445504
58 | v -0.154509 -0.000000 0.475529
59 | v -0.154509 1.000000 0.475529
60 | v -0.078217 -0.000000 0.493845
61 | v -0.078217 1.000000 0.493845
62 | v 0.000000 -0.000000 0.500000
63 | v 0.000000 1.000000 0.500000
64 | v 0.078217 -0.000000 0.493845
65 | v 0.078217 1.000000 0.493845
66 | v 0.154509 -0.000000 0.475529
67 | v 0.154509 1.000000 0.475529
68 | v 0.226995 -0.000000 0.445504
69 | v 0.226995 1.000000 0.445504
70 | v 0.293893 -0.000000 0.404509
71 | v 0.293893 1.000000 0.404509
72 | v 0.353554 -0.000000 0.353554
73 | v 0.353554 1.000000 0.353554
74 | v 0.404509 -0.000000 0.293893
75 | v 0.404509 1.000000 0.293893
76 | v 0.445504 -0.000000 0.226995
77 | v 0.445504 1.000000 0.226995
78 | v 0.475529 -0.000000 0.154509
79 | v 0.475529 1.000000 0.154509
80 | v 0.493844 -0.000000 0.078217
81 | v 0.493844 1.000000 0.078217
82 | v 0.500000 0.000000 0.000000
83 | v 0.500000 1.000000 0.000000
84 | v 0.000000 0.000000 0.000000
85 | v 0.000000 1.000000 0.000000
86 | vt 1.100032 0.000000
87 | vt 1.050032 1.000000
88 | vt 1.050032 0.000000
89 | vt 1.150032 0.000000
90 | vt 1.100032 1.000000
91 | vt 1.200032 0.000000
92 | vt 1.150032 1.000000
93 | vt 1.250032 0.000000
94 | vt 1.200032 1.000000
95 | vt 1.300032 0.000000
96 | vt 1.250032 1.000000
97 | vt 1.350032 0.000000
98 | vt 1.300032 1.000000
99 | vt 1.400032 0.000000
100 | vt 1.350032 1.000000
101 | vt 1.450032 0.000000
102 | vt 1.400032 1.000000
103 | vt 1.500032 1.000000
104 | vt 1.450032 1.000000
105 | vt -0.449968 0.000000
106 | vt -0.499968 1.000000
107 | vt -0.499968 0.000000
108 | vt -0.399968 1.000000
109 | vt -0.449968 1.000000
110 | vt -0.349968 0.000000
111 | vt -0.399968 0.000000
112 | vt -0.299968 1.000000
113 | vt -0.349968 1.000000
114 | vt -0.299968 0.000000
115 | vt -0.249968 1.000000
116 | vt -0.199968 0.000000
117 | vt -0.249968 0.000000
118 | vt -0.149968 0.000000
119 | vt -0.199968 1.000000
120 | vt -0.099968 0.000000
121 | vt -0.149968 1.000000
122 | vt -0.049968 0.000000
123 | vt -0.099968 1.000000
124 | vt 0.000032 0.000000
125 | vt -0.049968 1.000000
126 | vt 0.050032 0.000000
127 | vt 0.000032 1.000000
128 | vt 0.100032 0.000000
129 | vt 0.050032 1.000000
130 | vt 0.150032 0.000000
131 | vt 0.100032 1.000000
132 | vt 0.200032 0.000000
133 | vt 0.150032 1.000000
134 | vt 0.250032 0.000000
135 | vt 0.200032 1.000000
136 | vt 0.300032 0.000000
137 | vt 0.250032 1.000000
138 | vt 0.350032 0.000000
139 | vt 0.300032 1.000000
140 | vt 0.400032 0.000000
141 | vt 0.350032 1.000000
142 | vt 0.450032 0.000000
143 | vt 0.400032 1.000000
144 | vt 0.500032 0.000000
145 | vt 0.450032 1.000000
146 | vt 0.550032 0.000000
147 | vt 0.500032 1.000000
148 | vt 0.600032 0.000000
149 | vt 0.550032 1.000000
150 | vt 0.650032 0.000000
151 | vt 0.600032 1.000000
152 | vt 0.700032 0.000000
153 | vt 0.650032 1.000000
154 | vt 0.750032 0.000000
155 | vt 0.700032 1.000000
156 | vt 0.800032 0.000000
157 | vt 0.750032 1.000000
158 | vt 0.850032 1.000000
159 | vt 0.800032 1.000000
160 | vt 0.900032 0.000000
161 | vt 0.850032 0.000000
162 | vt 0.950032 0.000000
163 | vt 0.900032 1.000000
164 | vt 1.000032 0.000000
165 | vt 0.950032 1.000000
166 | vt 1.000032 1.000000
167 | vt 0.654508 0.975529
168 | vt 0.578217 0.993845
169 | vt 0.500000 0.500000
170 | vt 0.726995 0.945504
171 | vt 0.793892 0.904509
172 | vt 0.853553 0.853554
173 | vt 0.904508 0.793893
174 | vt 0.945503 0.726995
175 | vt 0.975528 0.654509
176 | vt 0.993844 0.578217
177 | vt 1.000000 0.500000
178 | vt 0.993844 0.421783
179 | vt 0.975528 0.345492
180 | vt 0.945503 0.273005
181 | vt 0.904508 0.206107
182 | vt 0.853553 0.146447
183 | vt 0.793893 0.095491
184 | vt 0.726995 0.054497
185 | vt 0.654508 0.024472
186 | vt 0.578217 0.006156
187 | vt 0.500000 -0.000000
188 | vt 0.421783 0.006156
189 | vt 0.345491 0.024472
190 | vt 0.273005 0.054497
191 | vt 0.206107 0.095491
192 | vt 0.146447 0.146446
193 | vt 0.095491 0.206107
194 | vt 0.054497 0.273005
195 | vt 0.024472 0.345491
196 | vt 0.006156 0.421783
197 | vt -0.000000 0.500000
198 | vt 0.006156 0.578217
199 | vt 0.024472 0.654508
200 | vt 0.054497 0.726995
201 | vt 0.095491 0.793893
202 | vt 0.146447 0.853553
203 | vt 0.206107 0.904509
204 | vt 0.273005 0.945503
205 | vt 0.345491 0.975528
206 | vt 0.421783 0.993844
207 | vt 0.500000 1.000000
208 | vt 0.578217 0.993845
209 | vt 0.654508 0.975529
210 | vt 0.500000 0.500000
211 | vt 0.726995 0.945504
212 | vt 0.793892 0.904509
213 | vt 0.853553 0.853554
214 | vt 0.904508 0.793893
215 | vt 0.945503 0.726995
216 | vt 0.975528 0.654509
217 | vt 0.993844 0.578217
218 | vt 1.000000 0.500000
219 | vt 0.993844 0.421783
220 | vt 0.975528 0.345492
221 | vt 0.945503 0.273005
222 | vt 0.904508 0.206107
223 | vt 0.853553 0.146447
224 | vt 0.793893 0.095491
225 | vt 0.726995 0.054497
226 | vt 0.654508 0.024472
227 | vt 0.578217 0.006156
228 | vt 0.500000 -0.000000
229 | vt 0.421783 0.006156
230 | vt 0.345491 0.024472
231 | vt 0.273005 0.054497
232 | vt 0.206107 0.095491
233 | vt 0.146447 0.146446
234 | vt 0.095491 0.206107
235 | vt 0.054497 0.273005
236 | vt 0.024472 0.345491
237 | vt 0.006156 0.421783
238 | vt -0.000000 0.500000
239 | vt 0.006156 0.578217
240 | vt 0.024472 0.654508
241 | vt 0.054497 0.726995
242 | vt 0.095491 0.793893
243 | vt 0.146447 0.853553
244 | vt 0.206107 0.904509
245 | vt 0.273005 0.945503
246 | vt 0.345491 0.975528
247 | vt 0.421783 0.993844
248 | vt 0.500000 1.000000
249 | vt 1.500032 0.000000
250 | vn 0.9511 0.0000 -0.3090
251 | vn 0.9877 0.0000 -0.1564
252 | vn 0.8910 0.0000 -0.4540
253 | vn 0.8090 0.0000 -0.5878
254 | vn 0.7071 0.0000 -0.7071
255 | vn 0.5878 0.0000 -0.8090
256 | vn 0.4540 0.0000 -0.8910
257 | vn 0.3090 0.0000 -0.9511
258 | vn 0.1564 0.0000 -0.9877
259 | vn 0.0000 0.0000 -1.0000
260 | vn -0.1564 0.0000 -0.9877
261 | vn -0.3090 0.0000 -0.9511
262 | vn -0.4540 0.0000 -0.8910
263 | vn -0.5878 0.0000 -0.8090
264 | vn -0.7071 0.0000 -0.7071
265 | vn -0.8090 0.0000 -0.5878
266 | vn -0.8910 0.0000 -0.4540
267 | vn -0.9511 0.0000 -0.3090
268 | vn -0.9877 0.0000 -0.1564
269 | vn -1.0000 0.0000 0.0000
270 | vn -0.9877 -0.0000 0.1564
271 | vn -0.9511 -0.0000 0.3090
272 | vn -0.8910 -0.0000 0.4540
273 | vn -0.8090 -0.0000 0.5878
274 | vn -0.7071 -0.0000 0.7071
275 | vn -0.5878 -0.0000 0.8090
276 | vn -0.4540 -0.0000 0.8910
277 | vn -0.3090 -0.0000 0.9511
278 | vn -0.1564 -0.0000 0.9877
279 | vn 0.0000 -0.0000 1.0000
280 | vn 0.1564 -0.0000 0.9877
281 | vn 0.3090 -0.0000 0.9511
282 | vn 0.4540 -0.0000 0.8910
283 | vn 0.5878 -0.0000 0.8090
284 | vn 0.7071 -0.0000 0.7071
285 | vn 0.8090 -0.0000 0.5878
286 | vn 0.8910 -0.0000 0.4540
287 | vn 0.9511 -0.0000 0.3090
288 | vn 0.9877 -0.0000 0.1564
289 | vn 1.0000 -0.0000 0.0000
290 | vn 0.0000 -1.0000 -0.0000
291 | vn 0.0000 1.0000 0.0000
292 | s 1
293 | f 2/1/1 4/2/2 1/3/2
294 | f 5/4/3 3/5/1 2/1/1
295 | f 7/6/4 6/7/3 5/4/3
296 | f 9/8/5 8/9/4 7/6/4
297 | f 11/10/6 10/11/5 9/8/5
298 | f 13/12/7 12/13/6 11/10/6
299 | f 15/14/8 14/15/7 13/12/7
300 | f 17/16/9 16/17/8 15/14/8
301 | f 17/16/9 20/18/10 18/19/9
302 | f 21/20/11 20/21/10 19/22/10
303 | f 21/20/11 24/23/12 22/24/11
304 | f 25/25/13 24/23/12 23/26/12
305 | f 25/25/13 28/27/14 26/28/13
306 | f 27/29/14 30/30/15 28/27/14
307 | f 31/31/16 30/30/15 29/32/15
308 | f 33/33/17 32/34/16 31/31/16
309 | f 35/35/18 34/36/17 33/33/17
310 | f 37/37/19 36/38/18 35/35/18
311 | f 39/39/20 38/40/19 37/37/19
312 | f 41/41/21 40/42/20 39/39/20
313 | f 43/43/22 42/44/21 41/41/21
314 | f 45/45/23 44/46/22 43/43/22
315 | f 47/47/24 46/48/23 45/45/23
316 | f 49/49/25 48/50/24 47/47/24
317 | f 51/51/26 50/52/25 49/49/25
318 | f 53/53/27 52/54/26 51/51/26
319 | f 55/55/28 54/56/27 53/53/27
320 | f 57/57/29 56/58/28 55/55/28
321 | f 59/59/30 58/60/29 57/57/29
322 | f 61/61/31 60/62/30 59/59/30
323 | f 63/63/32 62/64/31 61/61/31
324 | f 65/65/33 64/66/32 63/63/32
325 | f 67/67/34 66/68/33 65/65/33
326 | f 69/69/35 68/70/34 67/67/34
327 | f 71/71/36 70/72/35 69/69/35
328 | f 71/71/36 74/73/37 72/74/36
329 | f 75/75/38 74/73/37 73/76/37
330 | f 77/77/39 76/78/38 75/75/38
331 | f 79/79/40 78/80/39 77/77/39
332 | f 1/3/2 80/81/40 79/79/40
333 | f 2/82/41 1/83/41 81/84/41
334 | f 5/85/41 2/82/41 81/84/41
335 | f 7/86/41 5/85/41 81/84/41
336 | f 9/87/41 7/86/41 81/84/41
337 | f 11/88/41 9/87/41 81/84/41
338 | f 13/89/41 11/88/41 81/84/41
339 | f 15/90/41 13/89/41 81/84/41
340 | f 17/91/41 15/90/41 81/84/41
341 | f 19/92/41 17/91/41 81/84/41
342 | f 21/93/41 19/92/41 81/84/41
343 | f 23/94/41 21/93/41 81/84/41
344 | f 25/95/41 23/94/41 81/84/41
345 | f 27/96/41 25/95/41 81/84/41
346 | f 29/97/41 27/96/41 81/84/41
347 | f 31/98/41 29/97/41 81/84/41
348 | f 33/99/41 31/98/41 81/84/41
349 | f 35/100/41 33/99/41 81/84/41
350 | f 37/101/41 35/100/41 81/84/41
351 | f 39/102/41 37/101/41 81/84/41
352 | f 41/103/41 39/102/41 81/84/41
353 | f 43/104/41 41/103/41 81/84/41
354 | f 45/105/41 43/104/41 81/84/41
355 | f 47/106/41 45/105/41 81/84/41
356 | f 49/107/41 47/106/41 81/84/41
357 | f 51/108/41 49/107/41 81/84/41
358 | f 53/109/41 51/108/41 81/84/41
359 | f 55/110/41 53/109/41 81/84/41
360 | f 57/111/41 55/110/41 81/84/41
361 | f 59/112/41 57/111/41 81/84/41
362 | f 61/113/41 59/112/41 81/84/41
363 | f 63/114/41 61/113/41 81/84/41
364 | f 65/115/41 63/114/41 81/84/41
365 | f 67/116/41 65/115/41 81/84/41
366 | f 69/117/41 67/116/41 81/84/41
367 | f 71/118/41 69/117/41 81/84/41
368 | f 73/119/41 71/118/41 81/84/41
369 | f 75/120/41 73/119/41 81/84/41
370 | f 77/121/41 75/120/41 81/84/41
371 | f 79/122/41 77/121/41 81/84/41
372 | f 1/83/41 79/122/41 81/84/41
373 | f 4/123/42 3/124/42 82/125/42
374 | f 3/124/42 6/126/42 82/125/42
375 | f 6/126/42 8/127/42 82/125/42
376 | f 8/127/42 10/128/42 82/125/42
377 | f 10/128/42 12/129/42 82/125/42
378 | f 12/129/42 14/130/42 82/125/42
379 | f 14/130/42 16/131/42 82/125/42
380 | f 16/131/42 18/132/42 82/125/42
381 | f 18/132/42 20/133/42 82/125/42
382 | f 20/133/42 22/134/42 82/125/42
383 | f 22/134/42 24/135/42 82/125/42
384 | f 24/135/42 26/136/42 82/125/42
385 | f 26/136/42 28/137/42 82/125/42
386 | f 28/137/42 30/138/42 82/125/42
387 | f 30/138/42 32/139/42 82/125/42
388 | f 32/139/42 34/140/42 82/125/42
389 | f 34/140/42 36/141/42 82/125/42
390 | f 36/141/42 38/142/42 82/125/42
391 | f 38/142/42 40/143/42 82/125/42
392 | f 40/143/42 42/144/42 82/125/42
393 | f 42/144/42 44/145/42 82/125/42
394 | f 44/145/42 46/146/42 82/125/42
395 | f 46/146/42 48/147/42 82/125/42
396 | f 48/147/42 50/148/42 82/125/42
397 | f 50/148/42 52/149/42 82/125/42
398 | f 52/149/42 54/150/42 82/125/42
399 | f 54/150/42 56/151/42 82/125/42
400 | f 56/151/42 58/152/42 82/125/42
401 | f 58/152/42 60/153/42 82/125/42
402 | f 60/153/42 62/154/42 82/125/42
403 | f 62/154/42 64/155/42 82/125/42
404 | f 64/155/42 66/156/42 82/125/42
405 | f 66/156/42 68/157/42 82/125/42
406 | f 68/157/42 70/158/42 82/125/42
407 | f 70/158/42 72/159/42 82/125/42
408 | f 72/159/42 74/160/42 82/125/42
409 | f 74/160/42 76/161/42 82/125/42
410 | f 76/161/42 78/162/42 82/125/42
411 | f 78/162/42 80/163/42 82/125/42
412 | f 80/163/42 4/123/42 82/125/42
413 | f 2/1/1 3/5/1 4/2/2
414 | f 5/4/3 6/7/3 3/5/1
415 | f 7/6/4 8/9/4 6/7/3
416 | f 9/8/5 10/11/5 8/9/4
417 | f 11/10/6 12/13/6 10/11/5
418 | f 13/12/7 14/15/7 12/13/6
419 | f 15/14/8 16/17/8 14/15/7
420 | f 17/16/9 18/19/9 16/17/8
421 | f 17/16/9 19/164/10 20/18/10
422 | f 21/20/11 22/24/11 20/21/10
423 | f 21/20/11 23/26/12 24/23/12
424 | f 25/25/13 26/28/13 24/23/12
425 | f 25/25/13 27/29/14 28/27/14
426 | f 27/29/14 29/32/15 30/30/15
427 | f 31/31/16 32/34/16 30/30/15
428 | f 33/33/17 34/36/17 32/34/16
429 | f 35/35/18 36/38/18 34/36/17
430 | f 37/37/19 38/40/19 36/38/18
431 | f 39/39/20 40/42/20 38/40/19
432 | f 41/41/21 42/44/21 40/42/20
433 | f 43/43/22 44/46/22 42/44/21
434 | f 45/45/23 46/48/23 44/46/22
435 | f 47/47/24 48/50/24 46/48/23
436 | f 49/49/25 50/52/25 48/50/24
437 | f 51/51/26 52/54/26 50/52/25
438 | f 53/53/27 54/56/27 52/54/26
439 | f 55/55/28 56/58/28 54/56/27
440 | f 57/57/29 58/60/29 56/58/28
441 | f 59/59/30 60/62/30 58/60/29
442 | f 61/61/31 62/64/31 60/62/30
443 | f 63/63/32 64/66/32 62/64/31
444 | f 65/65/33 66/68/33 64/66/32
445 | f 67/67/34 68/70/34 66/68/33
446 | f 69/69/35 70/72/35 68/70/34
447 | f 71/71/36 72/74/36 70/72/35
448 | f 71/71/36 73/76/37 74/73/37
449 | f 75/75/38 76/78/38 74/73/37
450 | f 77/77/39 78/80/39 76/78/38
451 | f 79/79/40 80/81/40 78/80/39
452 | f 1/3/2 4/2/2 80/81/40
453 |
--------------------------------------------------------------------------------
/primitives/pipe.obj:
--------------------------------------------------------------------------------
1 | # Blender v2.79 (sub 0) OBJ File: ''
2 | # www.blender.org
3 | o pipe
4 | v 0.285317 0.000000 -0.092705
5 | v 0.300000 0.000000 0.000000
6 | v 0.285317 1.000000 -0.092705
7 | v 0.300000 1.000000 0.000000
8 | v 0.242705 0.000000 -0.176336
9 | v 0.242705 1.000000 -0.176336
10 | v 0.176336 0.000000 -0.242705
11 | v 0.176336 1.000000 -0.242705
12 | v 0.092705 0.000000 -0.285317
13 | v 0.092705 1.000000 -0.285317
14 | v 0.000000 0.000000 -0.300000
15 | v 0.000000 1.000000 -0.300000
16 | v -0.092705 0.000000 -0.285317
17 | v -0.092705 1.000000 -0.285317
18 | v -0.176336 0.000000 -0.242705
19 | v -0.176336 1.000000 -0.242705
20 | v -0.242705 0.000000 -0.176336
21 | v -0.242705 1.000000 -0.176336
22 | v -0.285317 0.000000 -0.092705
23 | v -0.285317 1.000000 -0.092705
24 | v -0.300000 0.000000 0.000000
25 | v -0.300000 1.000000 0.000000
26 | v -0.285317 -0.000000 0.092705
27 | v -0.285317 1.000000 0.092705
28 | v -0.242705 -0.000000 0.176336
29 | v -0.242705 1.000000 0.176336
30 | v -0.176336 -0.000000 0.242705
31 | v -0.176336 1.000000 0.242705
32 | v -0.092705 -0.000000 0.285317
33 | v -0.092705 1.000000 0.285317
34 | v 0.000000 -0.000000 0.300000
35 | v 0.000000 1.000000 0.300000
36 | v 0.092705 -0.000000 0.285317
37 | v 0.092705 1.000000 0.285317
38 | v 0.176336 -0.000000 0.242705
39 | v 0.176336 1.000000 0.242705
40 | v 0.242705 -0.000000 0.176336
41 | v 0.242705 1.000000 0.176336
42 | v 0.285317 -0.000000 0.092705
43 | v 0.285317 1.000000 0.092705
44 | v 0.475528 1.000000 -0.154509
45 | v 0.500000 1.000000 0.000000
46 | v 0.404509 1.000000 -0.293893
47 | v 0.293893 1.000000 -0.404509
48 | v 0.154508 1.000000 -0.475528
49 | v 0.000000 1.000000 -0.500000
50 | v -0.154509 1.000000 -0.475528
51 | v -0.293893 1.000000 -0.404509
52 | v -0.404509 1.000000 -0.293893
53 | v -0.475528 1.000000 -0.154509
54 | v -0.500000 1.000000 0.000000
55 | v -0.475528 1.000000 0.154509
56 | v -0.404509 1.000000 0.293893
57 | v -0.293893 1.000000 0.404509
58 | v -0.154509 1.000000 0.475528
59 | v 0.000000 1.000000 0.500000
60 | v 0.154509 1.000000 0.475529
61 | v 0.293893 1.000000 0.404509
62 | v 0.404509 1.000000 0.293893
63 | v 0.475529 1.000000 0.154509
64 | v 0.475528 0.000000 -0.154509
65 | v 0.500000 0.000000 0.000000
66 | v 0.404509 0.000000 -0.293893
67 | v 0.293893 0.000000 -0.404509
68 | v 0.154508 0.000000 -0.475528
69 | v 0.000000 0.000000 -0.500000
70 | v -0.154509 0.000000 -0.475528
71 | v -0.293893 0.000000 -0.404509
72 | v -0.404509 0.000000 -0.293893
73 | v -0.475528 0.000000 -0.154509
74 | v -0.500000 0.000000 0.000000
75 | v -0.475528 -0.000000 0.154509
76 | v -0.404509 -0.000000 0.293893
77 | v -0.293893 -0.000000 0.404509
78 | v -0.154509 -0.000000 0.475528
79 | v 0.000000 -0.000000 0.500000
80 | v 0.154509 -0.000000 0.475529
81 | v 0.293893 -0.000000 0.404509
82 | v 0.404509 -0.000000 0.293893
83 | v 0.475529 -0.000000 0.154509
84 | vt 0.050000 1.000000
85 | vt 0.000000 1.000000
86 | vt 0.050000 0.750000
87 | vt 0.000000 0.750000
88 | vt 0.100000 1.000000
89 | vt 0.100000 0.750000
90 | vt 0.150000 1.000000
91 | vt 0.150000 0.750000
92 | vt 0.200000 1.000000
93 | vt 0.200000 0.750000
94 | vt 0.250000 1.000000
95 | vt 0.250000 0.750000
96 | vt 0.300000 1.000000
97 | vt 0.300000 0.750000
98 | vt 0.350000 1.000000
99 | vt 0.350000 0.750000
100 | vt 0.400000 1.000000
101 | vt 0.400000 0.750000
102 | vt 0.450000 1.000000
103 | vt 0.450000 0.750000
104 | vt 0.500000 1.000000
105 | vt 0.500000 0.750000
106 | vt 0.550000 1.000000
107 | vt 0.550000 0.750000
108 | vt 0.600000 1.000000
109 | vt 0.600000 0.750000
110 | vt 0.650000 1.000000
111 | vt 0.650000 0.750000
112 | vt 0.700000 1.000000
113 | vt 0.700000 0.750000
114 | vt 0.750000 1.000000
115 | vt 0.750000 0.750000
116 | vt 0.800000 1.000000
117 | vt 0.800000 0.750000
118 | vt 0.850000 1.000000
119 | vt 0.850000 0.750000
120 | vt 0.900000 1.000000
121 | vt 0.900000 0.750000
122 | vt 0.950000 1.000000
123 | vt 0.950000 0.750000
124 | vt 1.000000 1.000000
125 | vt 1.000000 0.750000
126 | vt 0.050000 0.500000
127 | vt 0.000000 0.500000
128 | vt 0.100000 0.500000
129 | vt 0.150000 0.500000
130 | vt 0.200000 0.500000
131 | vt 0.250000 0.500000
132 | vt 0.300000 0.500000
133 | vt 0.350000 0.500000
134 | vt 0.400000 0.500000
135 | vt 0.450000 0.500000
136 | vt 0.500000 0.500000
137 | vt 0.550000 0.500000
138 | vt 0.600000 0.500000
139 | vt 0.650000 0.500000
140 | vt 0.700000 0.500000
141 | vt 0.750000 0.500000
142 | vt 0.800000 0.500000
143 | vt 0.850000 0.500000
144 | vt 0.900000 0.500000
145 | vt 0.950000 0.500000
146 | vt 1.000000 0.500000
147 | vt 0.050000 0.250000
148 | vt 0.000000 0.250000
149 | vt 0.100000 0.250000
150 | vt 0.150000 0.250000
151 | vt 0.200000 0.250000
152 | vt 0.250000 0.250000
153 | vt 0.300000 0.250000
154 | vt 0.350000 0.250000
155 | vt 0.400000 0.250000
156 | vt 0.450000 0.250000
157 | vt 0.500000 0.250000
158 | vt 0.550000 0.250000
159 | vt 0.600000 0.250000
160 | vt 0.650000 0.250000
161 | vt 0.700000 0.250000
162 | vt 0.750000 0.250000
163 | vt 0.800000 0.250000
164 | vt 0.850000 0.250000
165 | vt 0.900000 0.250000
166 | vt 0.950000 0.250000
167 | vt 1.000000 0.250000
168 | vt 0.050000 0.000000
169 | vt 0.000000 0.000000
170 | vt 0.100000 0.000000
171 | vt 0.150000 0.000000
172 | vt 0.200000 0.000000
173 | vt 0.250000 0.000000
174 | vt 0.300000 0.000000
175 | vt 0.350000 0.000000
176 | vt 0.400000 0.000000
177 | vt 0.450000 0.000000
178 | vt 0.500000 0.000000
179 | vt 0.550000 0.000000
180 | vt 0.600000 0.000000
181 | vt 0.650000 0.000000
182 | vt 0.700000 0.000000
183 | vt 0.750000 0.000000
184 | vt 0.800000 0.000000
185 | vt 0.850000 0.000000
186 | vt 0.900000 0.000000
187 | vt 0.950000 0.000000
188 | vt 1.000000 0.000000
189 | vn -0.9334 -0.0000 0.3587
190 | vn -0.9986 -0.0000 0.0527
191 | vn -0.9660 -0.0000 0.2584
192 | vn -0.9986 0.0000 -0.0527
193 | vn -0.7769 -0.0000 0.6296
194 | vn -0.8389 -0.0000 0.5443
195 | vn -0.5443 -0.0000 0.8389
196 | vn -0.6296 -0.0000 0.7769
197 | vn -0.2584 -0.0000 0.9660
198 | vn -0.3587 -0.0000 0.9334
199 | vn 0.0527 -0.0000 0.9986
200 | vn -0.0527 -0.0000 0.9986
201 | vn 0.3587 -0.0000 0.9334
202 | vn 0.2584 -0.0000 0.9660
203 | vn 0.6296 -0.0000 0.7769
204 | vn 0.5443 -0.0000 0.8389
205 | vn 0.8389 -0.0000 0.5443
206 | vn 0.7769 -0.0000 0.6296
207 | vn 0.9660 -0.0000 0.2584
208 | vn 0.9334 -0.0000 0.3587
209 | vn 0.9986 0.0000 -0.0527
210 | vn 0.9986 -0.0000 0.0527
211 | vn 0.9334 0.0000 -0.3587
212 | vn 0.9660 0.0000 -0.2584
213 | vn 0.7769 0.0000 -0.6296
214 | vn 0.8389 0.0000 -0.5443
215 | vn 0.5443 0.0000 -0.8389
216 | vn 0.6296 0.0000 -0.7769
217 | vn 0.2584 0.0000 -0.9660
218 | vn 0.3587 0.0000 -0.9334
219 | vn -0.0527 0.0000 -0.9986
220 | vn 0.0527 0.0000 -0.9986
221 | vn -0.3587 0.0000 -0.9334
222 | vn -0.2584 0.0000 -0.9660
223 | vn -0.6296 0.0000 -0.7769
224 | vn -0.5443 0.0000 -0.8389
225 | vn -0.8389 0.0000 -0.5443
226 | vn -0.7769 0.0000 -0.6296
227 | vn -0.9660 0.0000 -0.2584
228 | vn -0.9334 0.0000 -0.3587
229 | vn 0.0000 1.0000 0.0000
230 | vn 0.0000 -1.0000 -0.0000
231 | s 1
232 | f 1/1/1 2/2/2 3/3/3
233 | f 3/3/3 2/2/2 4/4/4
234 | f 5/5/5 1/1/1 6/6/6
235 | f 6/6/6 1/1/1 3/3/3
236 | f 7/7/7 5/5/5 8/8/8
237 | f 8/8/8 5/5/5 6/6/6
238 | f 9/9/9 7/7/7 10/10/10
239 | f 10/10/10 7/7/7 8/8/8
240 | f 11/11/11 9/9/9 12/12/12
241 | f 12/12/12 9/9/9 10/10/10
242 | f 13/13/13 11/11/11 14/14/14
243 | f 14/14/14 11/11/11 12/12/12
244 | f 15/15/15 13/13/13 16/16/16
245 | f 16/16/16 13/13/13 14/14/14
246 | f 17/17/17 15/15/15 18/18/18
247 | f 18/18/18 15/15/15 16/16/16
248 | f 19/19/19 17/17/17 20/20/20
249 | f 20/20/20 17/17/17 18/18/18
250 | f 21/21/21 19/19/19 22/22/22
251 | f 22/22/22 19/19/19 20/20/20
252 | f 23/23/23 21/21/21 24/24/24
253 | f 24/24/24 21/21/21 22/22/22
254 | f 25/25/25 23/23/23 26/26/26
255 | f 26/26/26 23/23/23 24/24/24
256 | f 27/27/27 25/25/25 28/28/28
257 | f 28/28/28 25/25/25 26/26/26
258 | f 29/29/29 27/27/27 30/30/30
259 | f 30/30/30 27/27/27 28/28/28
260 | f 31/31/31 29/29/29 32/32/32
261 | f 32/32/32 29/29/29 30/30/30
262 | f 33/33/33 31/31/31 34/34/34
263 | f 34/34/34 31/31/31 32/32/32
264 | f 35/35/35 33/33/33 36/36/36
265 | f 36/36/36 33/33/33 34/34/34
266 | f 37/37/37 35/35/35 38/38/38
267 | f 38/38/38 35/35/35 36/36/36
268 | f 39/39/39 37/37/37 40/40/40
269 | f 40/40/40 37/37/37 38/38/38
270 | f 2/41/2 39/39/39 4/42/4
271 | f 4/42/4 39/39/39 40/40/40
272 | f 3/3/41 4/4/41 41/43/41
273 | f 41/43/41 4/4/41 42/44/41
274 | f 6/6/41 3/3/41 43/45/41
275 | f 43/45/41 3/3/41 41/43/41
276 | f 8/8/41 6/6/41 44/46/41
277 | f 44/46/41 6/6/41 43/45/41
278 | f 10/10/41 8/8/41 45/47/41
279 | f 45/47/41 8/8/41 44/46/41
280 | f 12/12/41 10/10/41 46/48/41
281 | f 46/48/41 10/10/41 45/47/41
282 | f 14/14/41 12/12/41 47/49/41
283 | f 47/49/41 12/12/41 46/48/41
284 | f 16/16/41 14/14/41 48/50/41
285 | f 48/50/41 14/14/41 47/49/41
286 | f 18/18/41 16/16/41 49/51/41
287 | f 49/51/41 16/16/41 48/50/41
288 | f 20/20/41 18/18/41 50/52/41
289 | f 50/52/41 18/18/41 49/51/41
290 | f 22/22/41 20/20/41 51/53/41
291 | f 51/53/41 20/20/41 50/52/41
292 | f 24/24/41 22/22/41 52/54/41
293 | f 52/54/41 22/22/41 51/53/41
294 | f 26/26/41 24/24/41 53/55/41
295 | f 53/55/41 24/24/41 52/54/41
296 | f 28/28/41 26/26/41 54/56/41
297 | f 54/56/41 26/26/41 53/55/41
298 | f 30/30/41 28/28/41 55/57/41
299 | f 55/57/41 28/28/41 54/56/41
300 | f 32/32/41 30/30/41 56/58/41
301 | f 56/58/41 30/30/41 55/57/41
302 | f 34/34/41 32/32/41 57/59/41
303 | f 57/59/41 32/32/41 56/58/41
304 | f 36/36/41 34/34/41 58/60/41
305 | f 58/60/41 34/34/41 57/59/41
306 | f 38/38/41 36/36/41 59/61/41
307 | f 59/61/41 36/36/41 58/60/41
308 | f 40/40/41 38/38/41 60/62/41
309 | f 60/62/41 38/38/41 59/61/41
310 | f 4/42/41 40/40/41 42/63/41
311 | f 42/63/41 40/40/41 60/62/41
312 | f 41/43/23 42/44/21 61/64/24
313 | f 61/64/24 42/44/21 62/65/22
314 | f 43/45/25 41/43/23 63/66/26
315 | f 63/66/26 41/43/23 61/64/24
316 | f 44/46/27 43/45/25 64/67/28
317 | f 64/67/28 43/45/25 63/66/26
318 | f 45/47/29 44/46/27 65/68/30
319 | f 65/68/30 44/46/27 64/67/28
320 | f 46/48/31 45/47/29 66/69/32
321 | f 66/69/32 45/47/29 65/68/30
322 | f 47/49/33 46/48/31 67/70/34
323 | f 67/70/34 46/48/31 66/69/32
324 | f 48/50/35 47/49/33 68/71/36
325 | f 68/71/36 47/49/33 67/70/34
326 | f 49/51/37 48/50/35 69/72/38
327 | f 69/72/38 48/50/35 68/71/36
328 | f 50/52/39 49/51/37 70/73/40
329 | f 70/73/40 49/51/37 69/72/38
330 | f 51/53/2 50/52/39 71/74/4
331 | f 71/74/4 50/52/39 70/73/40
332 | f 52/54/1 51/53/2 72/75/3
333 | f 72/75/3 51/53/2 71/74/4
334 | f 53/55/5 52/54/1 73/76/6
335 | f 73/76/6 52/54/1 72/75/3
336 | f 54/56/7 53/55/5 74/77/8
337 | f 74/77/8 53/55/5 73/76/6
338 | f 55/57/9 54/56/7 75/78/10
339 | f 75/78/10 54/56/7 74/77/8
340 | f 56/58/11 55/57/9 76/79/12
341 | f 76/79/12 55/57/9 75/78/10
342 | f 57/59/13 56/58/11 77/80/14
343 | f 77/80/14 56/58/11 76/79/12
344 | f 58/60/15 57/59/13 78/81/16
345 | f 78/81/16 57/59/13 77/80/14
346 | f 59/61/17 58/60/15 79/82/18
347 | f 79/82/18 58/60/15 78/81/16
348 | f 60/62/19 59/61/17 80/83/20
349 | f 80/83/20 59/61/17 79/82/18
350 | f 42/63/21 60/62/19 62/84/22
351 | f 62/84/22 60/62/19 80/83/20
352 | f 61/64/42 62/65/42 1/85/42
353 | f 1/85/42 62/65/42 2/86/42
354 | f 63/66/42 61/64/42 5/87/42
355 | f 5/87/42 61/64/42 1/85/42
356 | f 64/67/42 63/66/42 7/88/42
357 | f 7/88/42 63/66/42 5/87/42
358 | f 65/68/42 64/67/42 9/89/42
359 | f 9/89/42 64/67/42 7/88/42
360 | f 66/69/42 65/68/42 11/90/42
361 | f 11/90/42 65/68/42 9/89/42
362 | f 67/70/42 66/69/42 13/91/42
363 | f 13/91/42 66/69/42 11/90/42
364 | f 68/71/42 67/70/42 15/92/42
365 | f 15/92/42 67/70/42 13/91/42
366 | f 69/72/42 68/71/42 17/93/42
367 | f 17/93/42 68/71/42 15/92/42
368 | f 70/73/42 69/72/42 19/94/42
369 | f 19/94/42 69/72/42 17/93/42
370 | f 71/74/42 70/73/42 21/95/42
371 | f 21/95/42 70/73/42 19/94/42
372 | f 72/75/42 71/74/42 23/96/42
373 | f 23/96/42 71/74/42 21/95/42
374 | f 73/76/42 72/75/42 25/97/42
375 | f 25/97/42 72/75/42 23/96/42
376 | f 74/77/42 73/76/42 27/98/42
377 | f 27/98/42 73/76/42 25/97/42
378 | f 75/78/42 74/77/42 29/99/42
379 | f 29/99/42 74/77/42 27/98/42
380 | f 76/79/42 75/78/42 31/100/42
381 | f 31/100/42 75/78/42 29/99/42
382 | f 77/80/42 76/79/42 33/101/42
383 | f 33/101/42 76/79/42 31/100/42
384 | f 78/81/42 77/80/42 35/102/42
385 | f 35/102/42 77/80/42 33/101/42
386 | f 79/82/42 78/81/42 37/103/42
387 | f 37/103/42 78/81/42 35/102/42
388 | f 80/83/42 79/82/42 39/104/42
389 | f 39/104/42 79/82/42 37/103/42
390 | f 62/84/42 80/83/42 2/105/42
391 | f 2/105/42 80/83/42 39/104/42
392 |
--------------------------------------------------------------------------------
/primitives/plane.obj:
--------------------------------------------------------------------------------
1 | # Blender v2.79 (sub 0) OBJ File: ''
2 | # www.blender.org
3 | o plane
4 | v -0.500000 -0.500000 -0.000000
5 | v 0.500000 -0.500000 -0.000000
6 | v -0.500000 0.500000 0.000000
7 | v 0.500000 0.500000 0.000000
8 | vt 0.000000 0.000000
9 | vt 1.000000 0.000000
10 | vt 0.000000 1.000000
11 | vt 1.000000 1.000000
12 | vn 0.0000 -0.0000 1.0000
13 | s 1
14 | f 1/1/1 2/2/1 3/3/1
15 | f 3/3/1 2/2/1 4/4/1
16 |
--------------------------------------------------------------------------------
/primitives/pyramid.obj:
--------------------------------------------------------------------------------
1 | # Blender v2.79 (sub 0) OBJ File: ''
2 | # www.blender.org
3 | o pyramid
4 | v -0.499995 0.000000 -0.499995
5 | v 0.499995 0.000000 -0.499995
6 | v -0.499995 -0.000000 0.499995
7 | v 0.499995 -0.000000 0.499995
8 | v 0.000000 0.707100 0.000000
9 | vt 0.250000 0.500000
10 | vt 0.375000 0.500000
11 | vt 0.500000 1.000000
12 | vt 0.500000 0.500000
13 | vt 0.625000 0.500000
14 | vt 0.750000 0.500000
15 | vt 0.500000 0.000000
16 | vt 0.750000 0.250000
17 | vt 0.250000 0.250000
18 | vn -0.8165 0.5774 0.0000
19 | vn 0.0000 0.5774 0.8165
20 | vn 0.8165 0.5774 0.0000
21 | vn 0.0000 0.5774 -0.8165
22 | vn 0.0000 -1.0000 -0.0000
23 | s off
24 | f 1/1/1 3/2/1 5/3/1
25 | f 3/2/2 4/4/2 5/3/2
26 | f 4/4/3 2/5/3 5/3/3
27 | f 2/5/4 1/6/4 5/3/4
28 | s 1
29 | f 1/7/5 2/8/5 3/9/5
30 | f 3/9/5 2/8/5 4/4/5
31 |
--------------------------------------------------------------------------------
/vr_export.py:
--------------------------------------------------------------------------------
1 | import os
2 | import io
3 | import shutil
4 | import gzip
5 | from contextlib import redirect_stdout
6 |
7 | import bpy
8 | from mathutils import Vector, Quaternion
9 |
10 | from .html import Tag
11 | from . import ipfs
12 |
13 | # boolean to string
14 | def b2s(b):
15 | return str(b).lower()
16 |
17 | # float to string
18 | def f2s(f):
19 | return "{0:.6f}".format(f)
20 |
21 | # vector to string
22 | def v2s(v):
23 | return " ".join("{0:.6f}".format(c) for c in v)
24 |
25 | # position to string
26 | def p2s(v):
27 | v = [v[0],v[2],-v[1]]
28 | return v2s(v)
29 |
30 | # "light" position to string
31 | # used in cases where inversing the Z would be an awful idea
32 | def lp2s(v):
33 | v = [v[0],v[2],v[1]]
34 | return v2s(v)
35 |
36 | # rotation to string
37 | def r2s(m):
38 | if bpy.app.version < (2, 80):
39 | return v2s(list(m*Vector([-1,0,0,0]))[:3])
40 | else:
41 | return v2s(list(m @ Vector([-1,0,0,0]))[:3])
42 |
43 | # rotation to string, room fwd edition
44 | def r2sr(m):
45 | if bpy.app.version < (2, 80):
46 | return v2s(list(m*Vector([0,0,-1,0]))[:3])
47 | else:
48 | return v2s(list(m @ Vector([0,0,-1,0]))[:3])
49 |
50 | # Insert rotation
51 | # Moved here from the original code in the MESH handler
52 | # Used for links based on placeholder planes.
53 | # Notably, I assume Euler X 90 YZ 0 is a standing link.
54 | # (Later) this turned to be somewhat wrong, fixing it now.
55 | # Code still here in case this setup is useful for something.
56 | #def ir(attr, m):
57 | # rot = [" ".join([str(f) for f in list(v.xyz)]) for v in m.normalized()]
58 | # attr += [("xdir", rot[0]), ("ydir", rot[1]), ("zdir", rot[2]),]
59 |
60 | # Yes, it's probably inefficient, but I already tried messing around
61 | # with the function seen in ir, and it was painful.
62 | # This one's used for text and links.
63 | def mt2(attr, m):
64 | m = m.normalized()
65 | if bpy.app.version < (2, 80):
66 | attr += [("xdir", p2s(list(m*Vector([1,0,0,0]))[:3]))]
67 | attr += [("ydir", p2s(list(m*Vector([0,1,0,0]))[:3]))]
68 | attr += [("zdir", p2s(list(m*Vector([0,0,1,0]))[:3]))]
69 | else:
70 | attr += [("xdir", p2s(list(m @ Vector([1,0,0,0]))[:3]))]
71 | attr += [("ydir", p2s(list(m @ Vector([0,1,0,0]))[:3]))]
72 | attr += [("zdir", p2s(list(m @ Vector([0,0,1,0]))[:3]))]
73 |
74 | # Here's one that's used for models.
75 | def mtm(attr, m):
76 | m = m.normalized()
77 | if bpy.app.version < (2, 80):
78 | attr += [("xdir", p2s(list(m*Vector([-1,0,0,0]))[:3]))]
79 | attr += [("ydir", p2s(list(m*Vector([0,0,1,0]))[:3]))]
80 | attr += [("zdir", p2s(list(m*Vector([0,-1,0,0]))[:3]))]
81 | else:
82 | attr += [("xdir", p2s(list(m @ Vector([-1,0,0,0]))[:3]))]
83 | attr += [("ydir", p2s(list(m @ Vector([0,0,1,0]))[:3]))]
84 | attr += [("zdir", p2s(list(m @ Vector([0,-1,0,0]))[:3]))]
85 |
86 | def gzip_compress(in_path, out_path):
87 | with open(in_path,'rb') as f_in:
88 | with gzip.open(out_path,'wb') as f_out:
89 | shutil.copyfileobj(f_in, f_out)
90 |
91 | def write_html(scene, filepath, path_mode, base_path=''):
92 |
93 | stdout = io.StringIO()
94 |
95 | world = scene.world
96 |
97 | doc = Tag("!DOCTYPE html", single=True)
98 |
99 | html = Tag("html")
100 | doc(html)
101 |
102 | head = Tag("head")
103 | head(Tag("meta", attr=[("charset","utf-8")], single=False))
104 | html(head)
105 |
106 | body = Tag("body")
107 | html(body)
108 |
109 | fire = Tag("FireBoxRoom")
110 | assets = Tag("Assets")
111 |
112 | attr=[
113 | ("gravity", f2s(scene.janus_room_gravity)),
114 | ("walk_speed", f2s(scene.janus_room_walkspeed)),
115 | ("run_speed", f2s(scene.janus_room_runspeed)),
116 | ("jump_velocity", f2s(scene.janus_room_jump)),
117 | ("near_dist", f2s(scene.janus_room_clipplane[0])),
118 | ("far_dist", f2s(scene.janus_room_clipplane[1])),
119 | ("teleport_min_dist", f2s(scene.janus_room_teleport[0])),
120 | ("teleport_max_dist", f2s(scene.janus_room_teleport[1])),
121 | ("default_sounds", b2s(scene.janus_room_defaultsounds)),
122 | ("cursor_visible", b2s(scene.janus_room_cursorvisible)),
123 | ("fog", b2s(scene.janus_room_fog)),
124 | ("fog_mode", scene.janus_room_fog_mode),
125 | ("fog_density", f2s(scene.janus_room_fog_density)),
126 | ("fog_start", f2s(scene.janus_room_fog_start)),
127 | ("fog_end", f2s(scene.janus_room_fog_end)),
128 | ("fog_col", v2s(scene.janus_room_fog_col)),
129 | ("locked", b2s(scene.janus_room_locked)),
130 | ]
131 |
132 | if scene.janus_server_default!=True:
133 | attr += [
134 | ("server",scene.janus_server),
135 | ("port",scene.janus_server_port),
136 | ]
137 |
138 | if scene.camera:
139 | attr += [
140 | ("pos", p2s(scene.camera.location)),
141 | ("fwd", r2sr(scene.camera.matrix_local)),
142 | ]
143 |
144 | if scene.janus_room!="None":
145 | attr += [
146 | ("use_local_asset",scene.janus_room),
147 | ("visible",b2s(scene.janus_room_visible)),
148 | ("col",v2s(scene.janus_room_color)),
149 | ]
150 |
151 | if scene.janus_room_skybox_active:
152 | attr += [
153 | ("skybox_left_id","sky_left"),
154 | ("skybox_right_id","sky_right"),
155 | ("skybox_front_id","sky_front"),
156 | ("skybox_back_id","sky_back"),
157 | ("skybox_up_id","sky_up"),
158 | ("skybox_down_id","sky_down"),
159 | ]
160 |
161 | sky_image = [(scene.janus_room_skybox_left,"sky_left"),(scene.janus_room_skybox_right,"sky_right"),(scene.janus_room_skybox_front,"sky_front"),(scene.janus_room_skybox_back,"sky_back"),(scene.janus_room_skybox_up,"sky_up"),(scene.janus_room_skybox_down,"sky_down")]
162 |
163 | for sky in sky_image:
164 | skyname = os.path.basename(sky[0])
165 | assetimage = Tag("AssetImage", attr=[("id",sky[1]), ("src",base_path+skyname)])
166 | if not assetimage in assets:
167 | assets(assetimage)
168 | shutil.copyfile(src=bpy.path.abspath(sky[0]), dst=os.path.join(filepath, skyname))
169 |
170 | if scene.janus_room_light_probes_active:
171 | attr += [
172 | ("cubemap_irradiance_id","irradiance"),
173 | ("cubemap_radiance_id","radiance"),
174 | ]
175 | probe_images = [(scene.janus_room_skybox_irradiance,"irradiance"), (scene.janus_room_skybox_radiance,"radiance")]
176 | for sky in probe_images:
177 | skyname = os.path.basename(sky[0])
178 | assetimage = Tag("AssetImage", attr=[("id",sky[1]), ("src",base_path+skyname)])
179 | if not assetimage in assets:
180 | assets(assetimage)
181 | shutil.copyfile(src=bpy.path.abspath(sky[0]), dst=os.path.join(filepath, skyname))
182 |
183 | if scene.janus_room_script_active:
184 | script_list = [scene.janus_room_script1,scene.janus_room_script2,scene.janus_room_script3,scene.janus_room_script4]
185 | for script_entry in script_list:
186 | if script_entry != "":
187 | scriptname = os.path.basename(script_entry)
188 | assetscript = Tag("AssetScript", attr=[("src",base_path+scriptname)])
189 | if not assetscript in assets:
190 | assets(assetscript)
191 | shutil.copyfile(src=bpy.path.abspath(script_entry), dst=os.path.join(filepath, scriptname))
192 |
193 | if scene.janus_room_shader_active:
194 | if scene.janus_room_shader_frag != "":
195 | fragname = os.path.basename(scene.janus_room_shader_frag)
196 | if scene.janus_room_shader_vert != "":
197 | vertname = os.path.basename(scene.janus_room_shader_vert)
198 | else:
199 | vertname = ""
200 | if fragname:
201 | attr += [("shader_id", fragname)]
202 | assetshader = Tag("AssetShader", attr=[("id",fragname),("src",base_path+fragname),("vertex_src",base_path+vertname)])
203 | if not assetshader in assets:
204 | assets(assetshader)
205 | if fragname:
206 | shutil.copyfile(src=bpy.path.abspath(scene.janus_room_shader_frag), dst=os.path.join(filepath, fragname))
207 | if vertname:
208 | shutil.copyfile(src=bpy.path.abspath(scene.janus_room_shader_vert), dst=os.path.join(filepath, vertname))
209 |
210 | room = Tag("Room", attr)
211 |
212 | useractive = None
213 | if bpy.app.version < (2, 80):
214 | useractive = scene.objects.active
215 | else:
216 | bpy.context.view_layer.objects.active
217 | userselect = bpy.context.selected_objects[:]
218 |
219 | exportedmeshes = []
220 | exportedsurfaces = []
221 |
222 | if scene.janus_unpack:
223 | bpy.ops.file.make_paths_relative()
224 | bpy.ops.file.unpack_all(method='USE_LOCAL')
225 | bpy.ops.file.make_paths_absolute()
226 |
227 | for o in bpy.data.objects:
228 | if o.type=="MESH":
229 | if o.janus_object_objtype == "JOT_OBJECT":
230 | # A mesh. If the user really wants us to, apply things to it.
231 | if bpy.app.version < (2, 80):
232 | scene.objects.active = o
233 | else:
234 | bpy.context.view_layer.objects.active = o
235 | for so in bpy.context.selected_objects:
236 | if bpy.app.version < (2, 80):
237 | so.select = False
238 | else:
239 | so.select_set(state=False)
240 | if bpy.app.version < (2, 80):
241 | o.select = True
242 | else:
243 | o.select_set(state=True)
244 |
245 | if scene.janus_apply_rot:
246 | try:
247 | with redirect_stdout(stdout):
248 | bpy.ops.object.transform_apply(rotation=True)
249 | except:
250 | pass
251 | if scene.janus_apply_scale:
252 | try:
253 | with redirect_stdout(stdout):
254 | bpy.ops.object.transform_apply(scale=True)
255 | except:
256 | pass
257 | if scene.janus_apply_pos:
258 | try:
259 | with redirect_stdout(stdout):
260 | bpy.ops.object.transform_apply(position=True)
261 | except:
262 | pass
263 | loc = o.location.copy()
264 | o.location = [0, 0, 0]
265 |
266 | oldrotmode = o.rotation_mode
267 | oldrotquat = o.rotation_quaternion.copy()
268 | oldroteu = o.rotation_euler.copy()
269 | oldrotax = [x for x in o.rotation_axis_angle]
270 |
271 | # note: scale may or may not actually be reverted, depends on what testing finds. It's 1:27 AM, so please don't bug me about it.
272 | # if NOT applying rotation/scale, then stop the exporters from doing annoying things like preserving rotation (which they do)
273 | # if applying rotation/scale, then the exporters can do whatever, since it's all meant to be baked into the file
274 | # it seems the local matrix disappears after this and doesn't come back when the parameters return, so grab it now
275 | rotmatrix = o.matrix_local.copy()
276 | if not scene.janus_apply_rot:
277 | o.rotation_mode = "QUATERNION"
278 | o.rotation_quaternion = Quaternion([1.0, 0.0, 0.0, 0.0])
279 |
280 | oldscale = o.scale.copy()
281 | if not scene.janus_apply_scale:
282 | o.scale = Vector([1, 1, 1])
283 |
284 | #bpy.ops.object.select_pattern(pattern=o.name, extend=False) # This apparently doesn't work on 2.78?
285 | # Things to hardcode in the name of accident prevention:
286 | # 1. Force export_scene.obj to use -Z Forward, Y Up, if it's currently using user defaults instead. [done]
287 | # 2. Figure out what's up with the COLLADA exporter (and force coordinate-related settings)
288 |
289 | if not o.data.name in exportedmeshes:
290 | epath = os.path.join(filepath, o.data.name+scene.janus_object_export)
291 | if scene.janus_object_export == '.obj':
292 | with redirect_stdout(stdout):
293 | bpy.ops.export_scene.obj(filepath=epath, use_selection=True, use_smooth_groups_bitflags=True, use_uvs=True, use_materials=True, use_mesh_modifiers=True,use_triangles=True, check_existing=False, use_normals=True, path_mode="COPY", axis_forward='-Z', axis_up='Y')
294 | gzip_compress(epath, epath+'.gz')
295 | os.remove(epath)
296 | elif scene.janus_object_export == '.dae':
297 | with redirect_stdout(stdout):
298 | # TODO differentiate between per-object and per-mesh properties
299 | if bpy.app.version < (2, 80):
300 | bpy.ops.wm.collada_export(filepath=epath, selected=True, check_existing=False, export_texture_type_selection='mat', apply_modifiers=True)
301 | else:
302 | bpy.ops.wm.collada_export(filepath=epath, selected=True, check_existing=False, apply_modifiers=True)
303 | gzip_compress(epath, epath+'.gz')
304 | os.remove(epath)
305 | elif scene.janus_object_export == '.gltf':
306 | with redirect_stdout(stdout):
307 | bpy.ops.export_scene.gltf(export_format='GLTF_SEPARATE', export_selected=True, export_apply=True, filepath=epath)
308 | gzip_compress(epath, epath+'.gz')
309 | os.remove(epath)
310 | if scene.janus_object_export==".obj":
311 | ob = Tag("AssetObject", attr=[("id", o.data.name), ("src",base_path+o.data.name+scene.janus_object_export+'.gz'), ("mtl",base_path+o.data.name+".mtl")])
312 | else:
313 | ob = Tag("AssetObject", attr=[("id", o.data.name), ("src",base_path+o.data.name+scene.janus_object_export+'.gz')])
314 | exportedmeshes.append(o.data.name)
315 | assets(ob)
316 |
317 | if not scene.janus_apply_rot:
318 | o.rotation_mode = oldrotmode
319 | o.rotation_axis_angle = oldrotax
320 | o.rotation_euler = oldroteu
321 | o.rotation_quaternion = oldrotquat
322 |
323 | if not scene.janus_apply_scale:
324 | o.scale = oldscale
325 |
326 | attr = [("id", o.data.name), ("locked", b2s(o.janus_object_locked)), ("cull_face", o.janus_object_cullface), ("visible", str(o.janus_object_visible).lower()),("col",v2s(o.janus_object_color) if o.janus_object_color_active else "1 1 1"), ("lighting", b2s(o.janus_object_lighting)),("collision_id", o.data.name if o.janus_object_collision else ""), ("pos", p2s(loc))]
327 |
328 | # The key is, *the model is already rotated, as far as I can tell, by the OBJ and Collada backends.*
329 | # Hence, the model has to be un-rotated first. That's why the dance above exists.
330 | if not scene.janus_apply_scale:
331 | attr += [("scale", lp2s(o.scale))]
332 |
333 | if not scene.janus_apply_rot:
334 | mtm(attr, rotmatrix)
335 |
336 | if o.janus_object_jsid:
337 | attr += [("js_id",o.janus_object_jsid)]
338 |
339 | if o.janus_object_websurface and o.janus_object_websurface_url:
340 | if not o.janus_object_websurface_url in exportedsurfaces:
341 | assets(Tag("AssetWebSurface", attr=[("id", o.janus_object_websurface_url), ("src", o.janus_object_websurface_url), ("width", o.janus_object_websurface_size[0]), ("height", o.janus_object_websurface_size[1])]))
342 | exportedsurfaces.append(o.janus_object_websurface_url)
343 | attr += [("websurface_id", o.janus_object_websurface_url)]
344 |
345 | if o.janus_object_shader_active:
346 | if o.janus_object_shader_frag != "":
347 | fragname = os.path.basename(o.janus_object_shader_frag)
348 | if o.janus_object_shader_vert != "":
349 | vertname = os.path.basename(o.janus_object_shader_vert)
350 | else:
351 | vertname = ""
352 | if fragname:
353 | assetshader = Tag("AssetShader", attr=[("id",fragname),("src",base_path+fragname),("vertex_src",base_path+vertname)])
354 | if not assetshader in assets:
355 | assets(assetshader)
356 | shutil.copyfile(src=bpy.path.abspath(o.janus_object_shader_frag), dst=os.path.join(filepath, fragname))
357 | if vertname != "":
358 | shutil.copyfile(src=bpy.path.abspath(o.janus_object_shader_vert), dst=os.path.join(filepath, vertname))
359 | attr += [("shader_id", fragname)]
360 |
361 | room(Tag("Object", single=False, attr=attr))
362 | o.location = loc
363 | elif o.janus_object_objtype == "JOT_LINK":
364 | # Link is a separate object type now, allowing plane placeholders to allow some semblance of visual editing.
365 | # portalaccounting deals with the fact Janus portals are centred at their bottom middle, not the centre like a plane placeholder
366 | portalaccounting = (o.matrix_local.normalized() * Vector([0.0, -o.scale.y, -0.1, 0.0])).xyz
367 | # leave an Empty marker for debug?
368 | # for now just ruin state
369 | # Scaling:
370 | # ideal input is 1.58, 1.77
371 | # ideal output is 3.06, 3.35, 1 approx???
372 | # note; actual ratios used are post-portal position adjustments.
373 | #
374 | attr = [("pos",p2s(o.location+portalaccounting)), ("url",o.janus_object_link_url), ("title",o.janus_object_link_name), ("col", v2s(o.color[:3]))]
375 | attr += [("scale",v2s(Vector([o.scale.x * 1.93, o.scale.y * 2.00, 1.0])))]
376 | mt2(attr, o.matrix_local)
377 | if o.janus_object_jsid:
378 | attr += [("js_id",o.janus_object_jsid)]
379 | if not o.janus_object_active:
380 | attr += [("active","false")]
381 | room(Tag("Link", attr=attr))
382 |
383 | elif o.type=="FONT":
384 |
385 | if o.data.body.startswith("http://") or o.data.body.startswith("https://"):
386 | # kept to make commit-splitting easier
387 | room(Tag("Link", attr=[("pos",p2s(o.location)), ("scale","1.8 3.2 1"), ("url",o.data.body), ("title",o.name), ("col", v2s(o.color[:3]))]))
388 | else:
389 | texttype = "Text" if o.data.body.find("\n")==-1 else "Paragraph"
390 | attr = [("pos",p2s(o.location)), ("scale","1.8 3.2 1"), ("title",o.name)]
391 | #attr += [("fwd", r2s(o.matrix_local))] # in case of emergency. Note that r2s is the wrong way around. Good luck!
392 | mt2(attr, o.matrix_local)
393 | text = Tag(texttype, attr=attr)
394 | text.sub.append(o.data.body)
395 | room(text)
396 |
397 | elif o.type=="SPEAKER":
398 |
399 | if o.janus_object_sound:
400 | name = os.path.basename(o.janus_object_sound)
401 | assetsound = Tag("AssetSound", attr=[("id", name), ("src",base_path+name)])
402 | if not assetsound in assets:
403 | assets(assetsound)
404 | shutil.copyfile(src=bpy.path.abspath(o.janus_object_sound), dst=os.path.join(filepath, name))
405 | sound = Tag("Sound", attr=[("id", name), ("js_id", o.janus_object_jsid), ("pos", p2s(o.location)), ("dist", f2s(o.janus_object_sound_dist)), ("rect", v2s(list(o.janus_object_sound_xy1)+list(o.janus_object_sound_xy2))), ("loop", b2s(o.janus_object_sound_loop)), ("play_once", b2s(o.janus_object_sound_once))])
406 | room(sound)
407 | elif o.type == 'LAMP':
408 | print(o.data.distance)
409 | print(o.janus_object_jsid)
410 | light = Tag("Light", attr=[("js_id", o.janus_object_jsid), ("col", v2s(o.data.color[:3])), ("pos", p2s(o.location)), ("light_range", f2s(o.data.distance*2.0)), ("light_exponent", f2s(o.data.distance)), ("light_intensity", f2s(o.data.energy*5.0)) ])
411 | room(light)
412 |
413 | if bpy.app.version < (2, 80):
414 | for so in bpy.context.selected_objects:
415 | so.select = False
416 | for so in userselect:
417 | so.select = True
418 | scene.objects.active = useractive
419 | else:
420 | for so in bpy.context.selected_objects:
421 | so.select_set(state=False)
422 | for so in userselect:
423 | so.select_set(state=True)
424 |
425 |
426 | bpy.context.view_layer.objects.active = useractive
427 |
428 | fire(assets)
429 | fire(room)
430 | body(fire)
431 | file = open(os.path.join(filepath,"index.html"), mode="w", encoding="utf8", newline="\n")
432 | fw = file.write
433 | doc.write(fw, indent="")
434 | file.close()
435 |
436 | def save(operator, context, filepath="", path_mode="AUTO", relpath="", base_path=''):
437 | write_html(context.scene, filepath, path_mode, base_path=base_path)
438 |
--------------------------------------------------------------------------------
/zipthis.py:
--------------------------------------------------------------------------------
1 | import os
2 |
3 | os.system('zip -r FireVR.zip FireVR -x \*.git\* -x FireVR/docs/\*')
4 | os.system("rm -f -r ~/.config/blender/2.78/scripts/addons/FireVR")
5 | os.system("cp -r ~/FireVR ~/.config/blender/2.78/scripts/addons/FireVR")
6 | os.system("~/blender-2.78a-linux-glibc211-x86_64/blender")
7 |
--------------------------------------------------------------------------------
|