· 6 years ago · Nov 29, 2019, 08:23 AM
1
2
3
4
5
6
7<!DOCTYPE html>
8<html lang="en">
9 <head>
10 <meta charset="utf-8">
11 <link rel="dns-prefetch" href="https://github.githubassets.com">
12 <link rel="dns-prefetch" href="https://avatars0.githubusercontent.com">
13 <link rel="dns-prefetch" href="https://avatars1.githubusercontent.com">
14 <link rel="dns-prefetch" href="https://avatars2.githubusercontent.com">
15 <link rel="dns-prefetch" href="https://avatars3.githubusercontent.com">
16 <link rel="dns-prefetch" href="https://github-cloud.s3.amazonaws.com">
17 <link rel="dns-prefetch" href="https://user-images.githubusercontent.com/">
18
19
20
21 <link crossorigin="anonymous" media="all" integrity="sha512-/YEVWs7BzxfKyUd6zVxjEQcXRWsLbcEjv045Rq8DSoipySmQblhVKxlXLva2GtNd5DhwCxHwW1RM0N9I7S2Vew==" rel="stylesheet" href="https://github.githubassets.com/assets/frameworks-481a47a96965f6706fb41bae0d14b09a.css" />
22 <link crossorigin="anonymous" media="all" integrity="sha512-xod5+iick6st6a0tvmfiqwCFLFTRzOkGLX0SAqY7SQFl0Q3sWxKUB2rm1Kw4Vz/57FMg7chtfVYeUB/Yr/xmFQ==" rel="stylesheet" href="https://github.githubassets.com/assets/site-d3c48f1b58ea95d9efb184fd4592b411.css" />
23 <link crossorigin="anonymous" media="all" integrity="sha512-xlKdcTpXrrd+rLG1h8yYl5yt/S94zWLil75KS5529Mf0/RdApUbGTKcFbY0OZMotEz3l11k0GqfDAhasayWehw==" rel="stylesheet" href="https://github.githubassets.com/assets/github-eabfbaded2e91939e805d1a3af34018a.css" />
24
25
26
27
28
29
30 <meta name="viewport" content="width=device-width">
31
32 <title>iqm/iqm_export.py at master · lsalzman/iqm · GitHub</title>
33 <meta name="description" content="Inter-Quake Model format development kit. Contribute to lsalzman/iqm development by creating an account on GitHub.">
34 <link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="GitHub">
35 <link rel="fluid-icon" href="https://github.com/fluidicon.png" title="GitHub">
36 <meta property="fb:app_id" content="1401488693436528">
37
38 <meta name="twitter:image:src" content="https://avatars3.githubusercontent.com/u/1456849?s=400&v=4" /><meta name="twitter:site" content="@github" /><meta name="twitter:card" content="summary" /><meta name="twitter:title" content="lsalzman/iqm" /><meta name="twitter:description" content="Inter-Quake Model format development kit. Contribute to lsalzman/iqm development by creating an account on GitHub." />
39 <meta property="og:image" content="https://avatars3.githubusercontent.com/u/1456849?s=400&v=4" /><meta property="og:site_name" content="GitHub" /><meta property="og:type" content="object" /><meta property="og:title" content="lsalzman/iqm" /><meta property="og:url" content="https://github.com/lsalzman/iqm" /><meta property="og:description" content="Inter-Quake Model format development kit. Contribute to lsalzman/iqm development by creating an account on GitHub." />
40
41 <link rel="assets" href="https://github.githubassets.com/">
42
43
44
45 <meta name="request-id" content="CADA:1415:2A2391:417330:5DE086C3" data-pjax-transient>
46
47
48
49
50 <meta name="selected-link" value="repo_source" data-pjax-transient>
51
52 <meta name="google-site-verification" content="KT5gs8h0wvaagLKAVWq8bbeNwnZZK1r1XQysX3xurLU">
53 <meta name="google-site-verification" content="ZzhVyEFwb7w3e0-uOTltm8Jsck2F5StVihD0exw2fsA">
54 <meta name="google-site-verification" content="GXs5KoUUkNCoaAZn7wPN-t01Pywp9M3sEjnt_3_ZWPc">
55
56 <meta name="octolytics-host" content="collector.githubapp.com" /><meta name="octolytics-app-id" content="github" /><meta name="octolytics-event-url" content="https://collector.githubapp.com/github-external/browser_event" /><meta name="octolytics-dimension-request_id" content="CADA:1415:2A2391:417330:5DE086C3" /><meta name="octolytics-dimension-region_edge" content="ap-southeast-2" /><meta name="octolytics-dimension-region_render" content="iad" /><meta name="octolytics-dimension-ga_id" content="" class="js-octo-ga-id" /><meta name="octolytics-dimension-visitor_id" content="1311773916756215468" />
57
58<meta name="analytics-location" content="/<user-name>/<repo-name>/blob/show" data-pjax-transient="true" />
59
60
61
62 <meta name="google-analytics" content="UA-3769691-2">
63
64
65<meta class="js-ga-set" name="dimension1" content="Logged Out">
66
67
68
69
70
71 <meta name="hostname" content="github.com">
72 <meta name="user-login" content="">
73
74 <meta name="expected-hostname" content="github.com">
75
76 <meta name="js-proxy-site-detection-payload" content="Nzc1NGRmNzYzNzk0ODQwZDdiZDBhNjhjODhmNWIyMTllY2U4NjRlNzkwZjhiMDFmMTI5NDZhNDhhZmQ5MmQ2Y3x7InJlbW90ZV9hZGRyZXNzIjoiMjAyLjkxLjIwNy4xODAiLCJyZXF1ZXN0X2lkIjoiQ0FEQToxNDE1OjJBMjM5MTo0MTczMzA6NURFMDg2QzMiLCJ0aW1lc3RhbXAiOjE1NzQ5OTU2NTgsImhvc3QiOiJnaXRodWIuY29tIn0=">
77
78 <meta name="enabled-features" content="MARKETPLACE_FEATURED_BLOG_POSTS,MARKETPLACE_INVOICED_BILLING,MARKETPLACE_SOCIAL_PROOF_CUSTOMERS,MARKETPLACE_TRENDING_SOCIAL_PROOF,MARKETPLACE_RECOMMENDATIONS,MARKETPLACE_PENDING_INSTALLATIONS">
79
80 <meta name="html-safe-nonce" content="68dc7ff7e74db2844034942335c03a5bae9d1dbb">
81
82 <meta http-equiv="x-pjax-version" content="5889f893dcaa7c2acb03cae96934b7a4">
83
84
85 <link href="https://github.com/lsalzman/iqm/commits/master.atom" rel="alternate" title="Recent Commits to iqm:master" type="application/atom+xml">
86
87 <meta name="go-import" content="github.com/lsalzman/iqm git https://github.com/lsalzman/iqm.git">
88
89 <meta name="octolytics-dimension-user_id" content="1456849" /><meta name="octolytics-dimension-user_login" content="lsalzman" /><meta name="octolytics-dimension-repository_id" content="4233172" /><meta name="octolytics-dimension-repository_nwo" content="lsalzman/iqm" /><meta name="octolytics-dimension-repository_public" content="true" /><meta name="octolytics-dimension-repository_is_fork" content="false" /><meta name="octolytics-dimension-repository_network_root_id" content="4233172" /><meta name="octolytics-dimension-repository_network_root_nwo" content="lsalzman/iqm" /><meta name="octolytics-dimension-repository_explore_github_marketplace_ci_cta_shown" content="false" />
90
91
92 <link rel="canonical" href="https://github.com/lsalzman/iqm/blob/master/blender-2.80/iqm_export.py" data-pjax-transient>
93
94
95 <meta name="browser-stats-url" content="https://api.github.com/_private/browser/stats">
96
97 <meta name="browser-errors-url" content="https://api.github.com/_private/browser/errors">
98
99 <link rel="mask-icon" href="https://github.githubassets.com/pinned-octocat.svg" color="#000000">
100 <link rel="icon" type="image/x-icon" class="js-site-favicon" href="https://github.githubassets.com/favicon.ico">
101
102<meta name="theme-color" content="#1e2327">
103
104
105
106
107
108 <link rel="manifest" href="/manifest.json" crossOrigin="use-credentials">
109
110 </head>
111
112 <body class="logged-out env-production page-responsive page-blob">
113
114
115 <div class="position-relative js-header-wrapper ">
116 <a href="#start-of-content" tabindex="1" class="px-2 py-4 bg-blue text-white show-on-focus js-skip-to-content">Skip to content</a>
117 <span class="Progress progress-pjax-loader position-fixed width-full js-pjax-loader-bar">
118 <span class="progress-pjax-loader-bar top-0 left-0" style="width: 0%;"></span>
119 </span>
120
121
122
123
124
125
126 <header class="Header-old header-logged-out js-details-container Details position-relative f4 py-2" role="banner">
127 <div class="container-lg d-lg-flex flex-items-center p-responsive">
128 <div class="d-flex flex-justify-between flex-items-center">
129 <a class="mr-4" href="https://github.com/" aria-label="Homepage" data-ga-click="(Logged out) Header, go to homepage, icon:logo-wordmark">
130 <svg height="32" class="octicon octicon-mark-github text-white" viewBox="0 0 16 16" version="1.1" width="32" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
131 </a>
132
133 <div class="d-lg-none css-truncate css-truncate-target width-fit p-2">
134
135 <svg class="octicon octicon-repo" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
136 <a class="Header-link" href="/lsalzman">lsalzman</a>
137 /
138 <a class="Header-link" href="/lsalzman/iqm">iqm</a>
139
140
141 </div>
142
143 <div class="d-flex flex-items-center">
144 <a href="/join?source=header-repo"
145 class="d-inline-block d-lg-none f5 text-white no-underline border border-gray-dark rounded-2 px-2 py-1 mr-3 mr-sm-5"
146 data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header","repository_id":null,"auth_type":"SIGN_UP","client_id":"305421165.1574995628","originating_request_id":"CADA:1415:2A2391:417330:5DE086C3","originating_url":"https://github.com/lsalzman/iqm/blob/master/blender-2.80/iqm_export.py","referrer":"https://github.com/lsalzman/iqm/tree/master/blender-2.80","user_id":null}}" data-hydro-click-hmac="bdc22e525d331534bfc93818e50074453784ce587290a722fd35f17ba188a7eb"
147 data-ga-click="(Logged out) Header, clicked Sign up, text:sign-up">
148 Sign up
149 </a>
150
151 <button class="btn-link d-lg-none mt-1 js-details-target" type="button" aria-label="Toggle navigation" aria-expanded="false">
152 <svg height="24" class="octicon octicon-three-bars text-white" viewBox="0 0 12 16" version="1.1" width="18" aria-hidden="true"><path fill-rule="evenodd" d="M11.41 9H.59C0 9 0 8.59 0 8c0-.59 0-1 .59-1H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1h.01zm0-4H.59C0 5 0 4.59 0 4c0-.59 0-1 .59-1H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1h.01zM.59 11H11.4c.59 0 .59.41.59 1 0 .59 0 1-.59 1H.59C0 13 0 12.59 0 12c0-.59 0-1 .59-1z"/></svg>
153 </button>
154 </div>
155 </div>
156
157 <div class="HeaderMenu HeaderMenu--logged-out position-fixed top-0 right-0 bottom-0 height-fit position-lg-relative d-lg-flex flex-justify-between flex-items-center flex-auto">
158 <div class="d-flex d-lg-none flex-justify-end border-bottom bg-gray-light p-3">
159 <button class="btn-link js-details-target" type="button" aria-label="Toggle navigation" aria-expanded="false">
160 <svg height="24" class="octicon octicon-x text-gray" viewBox="0 0 12 16" version="1.1" width="18" aria-hidden="true"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
161 </button>
162 </div>
163
164 <nav class="mt-0 px-3 px-lg-0 mb-5 mb-lg-0" aria-label="Global">
165 <ul class="d-lg-flex list-style-none">
166 <li class="d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center ">
167 <details class="HeaderMenu-details details-overlay details-reset width-full">
168 <summary class="HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block">
169 Why GitHub?
170 <svg x="0px" y="0px" viewBox="0 0 14 8" xml:space="preserve" fill="none" class="icon-chevon-down-mktg position-absolute position-lg-relative">
171 <path d="M1,1l6.2,6L13,1"></path>
172 </svg>
173 </summary>
174 <div class="dropdown-menu flex-auto rounded-1 bg-white px-0 mt-0 pb-4 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4">
175 <a href="/features" class="py-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover" data-ga-click="(Logged out) Header, go to Features">Features <span class="Bump-link-symbol float-right text-normal text-gray-light">→</span></a>
176 <ul class="list-style-none f5 pb-3">
177 <li class="edge-item-fix"><a href="/features/code-review/" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Code review">Code review</a></li>
178 <li class="edge-item-fix"><a href="/features/project-management/" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Project management">Project management</a></li>
179 <li class="edge-item-fix"><a href="/features/integrations" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Integrations">Integrations</a></li>
180 <li class="edge-item-fix"><a href="/features/actions" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Actions">Actions</a></li>
181 <li class="edge-item-fix"><a href="/features/packages" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to GitHub Packages">Packages</a></li>
182 <li class="edge-item-fix"><a href="/features/security" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Security">Security</a></li>
183 <li class="edge-item-fix"><a href="/features#team-management" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Team management">Team management</a></li>
184 <li class="edge-item-fix"><a href="/features#social-coding" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Social coding">Social coding</a></li>
185 <li class="edge-item-fix"><a href="/features#documentation" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Documentation">Documentation</a></li>
186 <li class="edge-item-fix"><a href="/features#code-hosting" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Code hosting">Code hosting</a></li>
187 </ul>
188
189 <ul class="list-style-none mb-0 border-lg-top pt-lg-3">
190 <li class="edge-item-fix"><a href="/customer-stories" class="py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover" data-ga-click="(Logged out) Header, go to Customer stories">Customer stories <span class="Bump-link-symbol float-right text-normal text-gray-light">→</span></a></li>
191 <li class="edge-item-fix"><a href="/security" class="py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover" data-ga-click="(Logged out) Header, go to Security">Security <span class="Bump-link-symbol float-right text-normal text-gray-light">→</span></a></li>
192 </ul>
193 </div>
194 </details>
195 </li>
196 <li class="border-bottom border-lg-bottom-0 mr-0 mr-lg-3">
197 <a href="/enterprise" class="HeaderMenu-link no-underline py-3 d-block d-lg-inline-block" data-ga-click="(Logged out) Header, go to Enterprise">Enterprise</a>
198 </li>
199
200 <li class="d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center ">
201 <details class="HeaderMenu-details details-overlay details-reset width-full">
202 <summary class="HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block">
203 Explore
204 <svg x="0px" y="0px" viewBox="0 0 14 8" xml:space="preserve" fill="none" class="icon-chevon-down-mktg position-absolute position-lg-relative">
205 <path d="M1,1l6.2,6L13,1"></path>
206 </svg>
207 </summary>
208
209 <div class="dropdown-menu flex-auto rounded-1 bg-white px-0 pt-2 pb-0 mt-0 pb-4 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4">
210 <ul class="list-style-none mb-3">
211 <li class="edge-item-fix"><a href="/explore" class="py-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover" data-ga-click="(Logged out) Header, go to Explore">Explore GitHub <span class="Bump-link-symbol float-right text-normal text-gray-light">→</span></a></li>
212 </ul>
213
214 <h4 class="text-gray-light text-normal text-mono f5 mb-2 border-lg-top pt-lg-3">Learn & contribute</h4>
215 <ul class="list-style-none mb-3">
216 <li class="edge-item-fix"><a href="/topics" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Topics">Topics</a></li>
217 <li class="edge-item-fix"><a href="/collections" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Collections">Collections</a></li>
218 <li class="edge-item-fix"><a href="/trending" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Trending">Trending</a></li>
219 <li class="edge-item-fix"><a href="https://lab.github.com/" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Learning lab">Learning Lab</a></li>
220 <li class="edge-item-fix"><a href="https://opensource.guide" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Open source guides">Open source guides</a></li>
221 </ul>
222
223 <h4 class="text-gray-light text-normal text-mono f5 mb-2 border-lg-top pt-lg-3">Connect with others</h4>
224 <ul class="list-style-none mb-0">
225 <li class="edge-item-fix"><a href="https://github.com/events" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Events">Events</a></li>
226 <li class="edge-item-fix"><a href="https://github.community" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Community forum">Community forum</a></li>
227 <li class="edge-item-fix"><a href="https://education.github.com" class="py-2 pb-0 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to GitHub Education">GitHub Education</a></li>
228 </ul>
229 </div>
230 </details>
231 </li>
232
233 <li class="border-bottom border-lg-bottom-0 mr-0 mr-lg-3">
234 <a href="/marketplace" class="HeaderMenu-link no-underline py-3 d-block d-lg-inline-block" data-ga-click="(Logged out) Header, go to Marketplace">Marketplace</a>
235 </li>
236
237 <li class="d-block d-lg-flex flex-lg-nowrap flex-lg-items-center border-bottom border-lg-bottom-0 mr-0 mr-lg-3 edge-item-fix position-relative flex-wrap flex-justify-between d-flex flex-items-center ">
238 <details class="HeaderMenu-details details-overlay details-reset width-full">
239 <summary class="HeaderMenu-summary HeaderMenu-link px-0 py-3 border-0 no-wrap d-block d-lg-inline-block">
240 Pricing
241 <svg x="0px" y="0px" viewBox="0 0 14 8" xml:space="preserve" fill="none" class="icon-chevon-down-mktg position-absolute position-lg-relative">
242 <path d="M1,1l6.2,6L13,1"></path>
243 </svg>
244 </summary>
245
246 <div class="dropdown-menu flex-auto rounded-1 bg-white px-0 pt-2 pb-4 mt-0 p-lg-4 position-relative position-lg-absolute left-0 left-lg-n4">
247 <a href="/pricing" class="pb-2 lh-condensed-ultra d-block link-gray-dark no-underline h5 Bump-link--hover" data-ga-click="(Logged out) Header, go to Pricing">Plans <span class="Bump-link-symbol float-right text-normal text-gray-light">→</span></a>
248
249 <ul class="list-style-none mb-3">
250 <li class="edge-item-fix"><a href="/pricing#feature-comparison" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Compare plans">Compare plans</a></li>
251 <li class="edge-item-fix"><a href="https://enterprise.github.com/contact" class="py-2 lh-condensed-ultra d-block link-gray no-underline f5" data-ga-click="(Logged out) Header, go to Contact Sales">Contact Sales</a></li>
252 </ul>
253
254 <ul class="list-style-none mb-0 border-lg-top pt-lg-3">
255 <li class="edge-item-fix"><a href="/nonprofit" class="py-2 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover" data-ga-click="(Logged out) Header, go to Nonprofits">Nonprofit <span class="Bump-link-symbol float-right text-normal text-gray-light">→</span></a></li>
256 <li class="edge-item-fix"><a href="https://education.github.com" class="py-2 pb-0 lh-condensed-ultra d-block no-underline link-gray-dark no-underline h5 Bump-link--hover" data-ga-click="(Logged out) Header, go to Education">Education <span class="Bump-link-symbol float-right text-normal text-gray-light">→</span></a></li>
257 </ul>
258 </div>
259 </details>
260 </li>
261 </ul>
262 </nav>
263
264 <div class="d-lg-flex flex-items-center px-3 px-lg-0 text-center text-lg-left">
265 <div class="d-lg-flex mb-3 mb-lg-0">
266 <div class="header-search flex-self-stretch flex-lg-self-auto mr-0 mr-lg-3 mb-3 mb-lg-0 scoped-search site-scoped-search js-site-search position-relative js-jump-to"
267 role="combobox"
268 aria-owns="jump-to-results"
269 aria-label="Search or jump to"
270 aria-haspopup="listbox"
271 aria-expanded="false"
272>
273 <div class="position-relative">
274 <!-- '"` --><!-- </textarea></xmp> --></option></form><form class="js-site-search-form" role="search" aria-label="Site" data-scope-type="Repository" data-scope-id="4233172" data-scoped-search-url="/lsalzman/iqm/search" data-unscoped-search-url="/search" action="/lsalzman/iqm/search" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="✓" />
275 <label class="form-control input-sm header-search-wrapper p-0 header-search-wrapper-jump-to position-relative d-flex flex-justify-between flex-items-center js-chromeless-input-container">
276 <input type="text"
277 class="form-control input-sm header-search-input jump-to-field js-jump-to-field js-site-search-focus js-site-search-field is-clearable"
278 data-hotkey="s,/"
279 name="q"
280 value=""
281 placeholder="Search"
282 data-unscoped-placeholder="Search GitHub"
283 data-scoped-placeholder="Search"
284 autocapitalize="off"
285 aria-autocomplete="list"
286 aria-controls="jump-to-results"
287 aria-label="Search"
288 data-jump-to-suggestions-path="/_graphql/GetSuggestedNavigationDestinations#csrf-token=isJ3tBRnSLIp9XZi6Xzdfxb3apUTRrpeJBeb/QeXjlLms18mjb+acT5VS/u96nhkNF0q1Zpl8if4ulVRFyyu6g=="
289 spellcheck="false"
290 autocomplete="off"
291 >
292 <input type="hidden" class="js-site-search-type-field" name="type" >
293 <img src="https://github.githubassets.com/images/search-key-slash.svg" alt="" class="mr-2 header-search-key-slash">
294
295 <div class="Box position-absolute overflow-hidden d-none jump-to-suggestions js-jump-to-suggestions-container">
296
297<ul class="d-none js-jump-to-suggestions-template-container">
298
299
300<li class="d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-suggestion" role="option">
301 <a tabindex="-1" class="no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2" href="">
302 <div class="jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none">
303 <svg height="16" width="16" class="octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none" title="Repository" aria-label="Repository" viewBox="0 0 12 16" version="1.1" role="img"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
304 <svg height="16" width="16" class="octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none" title="Project" aria-label="Project" viewBox="0 0 15 16" version="1.1" role="img"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z"/></svg>
305 <svg height="16" width="16" class="octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none" title="Search" aria-label="Search" viewBox="0 0 16 16" version="1.1" role="img"><path fill-rule="evenodd" d="M15.7 13.3l-3.81-3.83A5.93 5.93 0 0013 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 000-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z"/></svg>
306 </div>
307
308 <img class="avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none" alt="" aria-label="Team" src="" width="28" height="28">
309
310 <div class="jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target">
311 </div>
312
313 <div class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search">
314 <span class="js-jump-to-badge-search-text-default d-none" aria-label="in this repository">
315 In this repository
316 </span>
317 <span class="js-jump-to-badge-search-text-global d-none" aria-label="in all of GitHub">
318 All GitHub
319 </span>
320 <span aria-hidden="true" class="d-inline-block ml-1 v-align-middle">↵</span>
321 </div>
322
323 <div aria-hidden="true" class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump">
324 Jump to
325 <span class="d-inline-block ml-1 v-align-middle">↵</span>
326 </div>
327 </a>
328</li>
329
330</ul>
331
332<ul class="d-none js-jump-to-no-results-template-container">
333 <li class="d-flex flex-justify-center flex-items-center f5 d-none js-jump-to-suggestion p-2">
334 <span class="text-gray">No suggested jump to results</span>
335 </li>
336</ul>
337
338<ul id="jump-to-results" role="listbox" class="p-0 m-0 js-navigation-container jump-to-suggestions-results-container js-jump-to-suggestions-results-container">
339
340
341<li class="d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-scoped-search d-none" role="option">
342 <a tabindex="-1" class="no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2" href="">
343 <div class="jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none">
344 <svg height="16" width="16" class="octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none" title="Repository" aria-label="Repository" viewBox="0 0 12 16" version="1.1" role="img"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
345 <svg height="16" width="16" class="octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none" title="Project" aria-label="Project" viewBox="0 0 15 16" version="1.1" role="img"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z"/></svg>
346 <svg height="16" width="16" class="octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none" title="Search" aria-label="Search" viewBox="0 0 16 16" version="1.1" role="img"><path fill-rule="evenodd" d="M15.7 13.3l-3.81-3.83A5.93 5.93 0 0013 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 000-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z"/></svg>
347 </div>
348
349 <img class="avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none" alt="" aria-label="Team" src="" width="28" height="28">
350
351 <div class="jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target">
352 </div>
353
354 <div class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search">
355 <span class="js-jump-to-badge-search-text-default d-none" aria-label="in this repository">
356 In this repository
357 </span>
358 <span class="js-jump-to-badge-search-text-global d-none" aria-label="in all of GitHub">
359 All GitHub
360 </span>
361 <span aria-hidden="true" class="d-inline-block ml-1 v-align-middle">↵</span>
362 </div>
363
364 <div aria-hidden="true" class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump">
365 Jump to
366 <span class="d-inline-block ml-1 v-align-middle">↵</span>
367 </div>
368 </a>
369</li>
370
371
372
373<li class="d-flex flex-justify-start flex-items-center p-0 f5 navigation-item js-navigation-item js-jump-to-global-search d-none" role="option">
374 <a tabindex="-1" class="no-underline d-flex flex-auto flex-items-center jump-to-suggestions-path js-jump-to-suggestion-path js-navigation-open p-2" href="">
375 <div class="jump-to-octicon js-jump-to-octicon flex-shrink-0 mr-2 text-center d-none">
376 <svg height="16" width="16" class="octicon octicon-repo flex-shrink-0 js-jump-to-octicon-repo d-none" title="Repository" aria-label="Repository" viewBox="0 0 12 16" version="1.1" role="img"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
377 <svg height="16" width="16" class="octicon octicon-project flex-shrink-0 js-jump-to-octicon-project d-none" title="Project" aria-label="Project" viewBox="0 0 15 16" version="1.1" role="img"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z"/></svg>
378 <svg height="16" width="16" class="octicon octicon-search flex-shrink-0 js-jump-to-octicon-search d-none" title="Search" aria-label="Search" viewBox="0 0 16 16" version="1.1" role="img"><path fill-rule="evenodd" d="M15.7 13.3l-3.81-3.83A5.93 5.93 0 0013 6c0-3.31-2.69-6-6-6S1 2.69 1 6s2.69 6 6 6c1.3 0 2.48-.41 3.47-1.11l3.83 3.81c.19.2.45.3.7.3.25 0 .52-.09.7-.3a.996.996 0 000-1.41v.01zM7 10.7c-2.59 0-4.7-2.11-4.7-4.7 0-2.59 2.11-4.7 4.7-4.7 2.59 0 4.7 2.11 4.7 4.7 0 2.59-2.11 4.7-4.7 4.7z"/></svg>
379 </div>
380
381 <img class="avatar mr-2 flex-shrink-0 js-jump-to-suggestion-avatar d-none" alt="" aria-label="Team" src="" width="28" height="28">
382
383 <div class="jump-to-suggestion-name js-jump-to-suggestion-name flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target">
384 </div>
385
386 <div class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none js-jump-to-badge-search">
387 <span class="js-jump-to-badge-search-text-default d-none" aria-label="in this repository">
388 In this repository
389 </span>
390 <span class="js-jump-to-badge-search-text-global d-none" aria-label="in all of GitHub">
391 All GitHub
392 </span>
393 <span aria-hidden="true" class="d-inline-block ml-1 v-align-middle">↵</span>
394 </div>
395
396 <div aria-hidden="true" class="border rounded-1 flex-shrink-0 bg-gray px-1 text-gray-light ml-1 f6 d-none d-on-nav-focus js-jump-to-badge-jump">
397 Jump to
398 <span class="d-inline-block ml-1 v-align-middle">↵</span>
399 </div>
400 </a>
401</li>
402
403
404</ul>
405
406 </div>
407 </label>
408</form> </div>
409</div>
410
411 </div>
412
413 <a href="/login?return_to=%2Flsalzman%2Fiqm%2Fblob%2Fmaster%2Fblender-2.80%2Fiqm_export.py"
414 class="HeaderMenu-link no-underline mr-3"
415 data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","client_id":"305421165.1574995628","originating_request_id":"CADA:1415:2A2391:417330:5DE086C3","originating_url":"https://github.com/lsalzman/iqm/blob/master/blender-2.80/iqm_export.py","referrer":"https://github.com/lsalzman/iqm/tree/master/blender-2.80","user_id":null}}" data-hydro-click-hmac="3fc986c7ce00fbd7cad82252e15920455594ae8da9761a312a54a07d9a4d7d7e"
416 data-ga-click="(Logged out) Header, clicked Sign in, text:sign-in">
417 Sign in
418 </a>
419 <a href="/join?source=header-repo&source_repo=lsalzman%2Fiqm"
420 class="HeaderMenu-link d-inline-block no-underline border border-gray-dark rounded-1 px-2 py-1"
421 data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"site header menu","repository_id":null,"auth_type":"SIGN_UP","client_id":"305421165.1574995628","originating_request_id":"CADA:1415:2A2391:417330:5DE086C3","originating_url":"https://github.com/lsalzman/iqm/blob/master/blender-2.80/iqm_export.py","referrer":"https://github.com/lsalzman/iqm/tree/master/blender-2.80","user_id":null}}" data-hydro-click-hmac="3fc986c7ce00fbd7cad82252e15920455594ae8da9761a312a54a07d9a4d7d7e"
422 data-ga-click="(Logged out) Header, clicked Sign up, text:sign-up">
423 Sign up
424 </a>
425 </div>
426 </div>
427 </div>
428</header>
429
430 </div>
431
432 <div id="start-of-content" class="show-on-focus"></div>
433
434
435 <div id="js-flash-container">
436
437</div>
438
439
440
441 <div class="application-main " data-commit-hovercards-enabled>
442 <div itemscope itemtype="http://schema.org/SoftwareSourceCode" class="">
443 <main >
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459 <div class=" pagehead repohead instapaper_ignore readability-menu experiment-repo-nav pt-0 pt-lg-4 ">
460 <div class="repohead-details-container clearfix container-lg p-responsive d-none d-lg-block">
461
462 <ul class="pagehead-actions">
463
464
465
466
467 <li>
468
469 <a class="tooltipped tooltipped-s btn btn-sm btn-with-count" aria-label="You must be signed in to watch a repository" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"notification subscription menu watch","repository_id":null,"auth_type":"LOG_IN","client_id":"305421165.1574995628","originating_request_id":"CADA:1415:2A2391:417330:5DE086C3","originating_url":"https://github.com/lsalzman/iqm/blob/master/blender-2.80/iqm_export.py","referrer":"https://github.com/lsalzman/iqm/tree/master/blender-2.80","user_id":null}}" data-hydro-click-hmac="f77549712a84d03add0c9adf40e2653922267961a5baa2509c6b306f5c147992" href="/login?return_to=%2Flsalzman%2Fiqm">
470 <svg class="octicon octicon-eye v-align-text-bottom" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.06 2C3 2 0 8 0 8s3 6 8.06 6C13 14 16 8 16 8s-3-6-7.94-6zM8 12c-2.2 0-4-1.78-4-4 0-2.2 1.8-4 4-4 2.22 0 4 1.8 4 4 0 2.22-1.78 4-4 4zm2-4c0 1.11-.89 2-2 2-1.11 0-2-.89-2-2 0-1.11.89-2 2-2 1.11 0 2 .89 2 2z"/></svg>
471 Watch
472</a> <a class="social-count" href="/lsalzman/iqm/watchers"
473 aria-label="21 users are watching this repository">
474 21
475 </a>
476
477 </li>
478
479 <li>
480 <a class="btn btn-sm btn-with-count tooltipped tooltipped-s" aria-label="You must be signed in to star a repository" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"star button","repository_id":4233172,"auth_type":"LOG_IN","client_id":"305421165.1574995628","originating_request_id":"CADA:1415:2A2391:417330:5DE086C3","originating_url":"https://github.com/lsalzman/iqm/blob/master/blender-2.80/iqm_export.py","referrer":"https://github.com/lsalzman/iqm/tree/master/blender-2.80","user_id":null}}" data-hydro-click-hmac="36c14b7c8f24dad2ee7781c4909f74acb562c37c0dc7be4215ce9133ca1c8ee8" href="/login?return_to=%2Flsalzman%2Fiqm">
481 <svg class="octicon octicon-star v-align-text-bottom" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M14 6l-4.9-.64L7 1 4.9 5.36 0 6l3.6 3.26L2.67 14 7 11.67 11.33 14l-.93-4.74L14 6z"/></svg>
482 Star
483</a>
484 <a class="social-count js-social-count" href="/lsalzman/iqm/stargazers"
485 aria-label="135 users starred this repository">
486 135
487 </a>
488
489 </li>
490
491 <li>
492 <a class="btn btn-sm btn-with-count tooltipped tooltipped-s" aria-label="You must be signed in to fork a repository" rel="nofollow" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"repo details fork button","repository_id":4233172,"auth_type":"LOG_IN","client_id":"305421165.1574995628","originating_request_id":"CADA:1415:2A2391:417330:5DE086C3","originating_url":"https://github.com/lsalzman/iqm/blob/master/blender-2.80/iqm_export.py","referrer":"https://github.com/lsalzman/iqm/tree/master/blender-2.80","user_id":null}}" data-hydro-click-hmac="0dc6b85c65f93c524b5cfc49f621c6ecf926c7364c086400064f3facd5a89ebe" href="/login?return_to=%2Flsalzman%2Fiqm">
493 <svg class="octicon octicon-repo-forked v-align-text-bottom" viewBox="0 0 10 16" version="1.1" width="10" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8 1a1.993 1.993 0 00-1 3.72V6L5 8 3 6V4.72A1.993 1.993 0 002 1a1.993 1.993 0 00-1 3.72V6.5l3 3v1.78A1.993 1.993 0 005 15a1.993 1.993 0 001-3.72V9.5l3-3V4.72A1.993 1.993 0 008 1zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3 10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zm3-10c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z"/></svg>
494 Fork
495</a>
496 <a href="/lsalzman/iqm/network/members" class="social-count"
497 aria-label="33 users forked this repository">
498 33
499 </a>
500 </li>
501</ul>
502
503 <h1 class="public ">
504 <svg class="octicon octicon-repo" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M4 9H3V8h1v1zm0-3H3v1h1V6zm0-2H3v1h1V4zm0-2H3v1h1V2zm8-1v12c0 .55-.45 1-1 1H6v2l-1.5-1.5L3 16v-2H1c-.55 0-1-.45-1-1V1c0-.55.45-1 1-1h10c.55 0 1 .45 1 1zm-1 10H1v2h2v-1h3v1h5v-2zm0-10H2v9h9V1z"/></svg>
505 <span class="author" itemprop="author"><a class="url fn" rel="author" data-hovercard-type="user" data-hovercard-url="/users/lsalzman/hovercard" data-octo-click="hovercard-link-click" data-octo-dimensions="link_type:self" href="/lsalzman">lsalzman</a></span><!--
506--><span class="path-divider">/</span><!--
507--><strong itemprop="name"><a data-pjax="#js-repo-pjax-container" href="/lsalzman/iqm">iqm</a></strong>
508
509
510</h1>
511
512 </div>
513
514<nav class="hx_reponav reponav js-repo-nav js-sidenav-container-pjax container-lg p-responsive d-none d-lg-block"
515 itemscope
516 itemtype="http://schema.org/BreadcrumbList"
517 aria-label="Repository"
518 data-pjax="#js-repo-pjax-container">
519
520 <span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
521 <a class="js-selected-navigation-item selected reponav-item" itemprop="url" data-hotkey="g c" aria-current="page" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages /lsalzman/iqm" href="/lsalzman/iqm">
522 <svg class="octicon octicon-code" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M9.5 3L8 4.5 11.5 8 8 11.5 9.5 13 14 8 9.5 3zm-5 0L0 8l4.5 5L6 11.5 2.5 8 6 4.5 4.5 3z"/></svg>
523 <span itemprop="name">Code</span>
524 <meta itemprop="position" content="1">
525</a> </span>
526
527 <span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
528 <a itemprop="url" data-hotkey="g i" class="js-selected-navigation-item reponav-item" data-selected-links="repo_issues repo_labels repo_milestones /lsalzman/iqm/issues" href="/lsalzman/iqm/issues">
529 <svg class="octicon octicon-issue-opened" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 011.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"/></svg>
530 <span itemprop="name">Issues</span>
531 <span class="Counter">17</span>
532 <meta itemprop="position" content="2">
533</a> </span>
534
535 <span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
536 <a data-hotkey="g p" data-skip-pjax="true" itemprop="url" class="js-selected-navigation-item reponav-item" data-selected-links="repo_pulls checks /lsalzman/iqm/pulls" href="/lsalzman/iqm/pulls">
537 <svg class="octicon octicon-git-pull-request" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M11 11.28V5c-.03-.78-.34-1.47-.94-2.06C9.46 2.35 8.78 2.03 8 2H7V0L4 3l3 3V4h1c.27.02.48.11.69.31.21.2.3.42.31.69v6.28A1.993 1.993 0 0010 15a1.993 1.993 0 001-3.72zm-1 2.92c-.66 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2zM4 3c0-1.11-.89-2-2-2a1.993 1.993 0 00-1 3.72v6.56A1.993 1.993 0 002 15a1.993 1.993 0 001-3.72V4.72c.59-.34 1-.98 1-1.72zm-.8 10c0 .66-.55 1.2-1.2 1.2-.65 0-1.2-.55-1.2-1.2 0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2zM2 4.2C1.34 4.2.8 3.65.8 3c0-.65.55-1.2 1.2-1.2.65 0 1.2.55 1.2 1.2 0 .65-.55 1.2-1.2 1.2z"/></svg>
538 <span itemprop="name">Pull requests</span>
539 <span class="Counter">3</span>
540 <meta itemprop="position" content="3">
541</a> </span>
542
543
544 <a data-hotkey="g b" class="js-selected-navigation-item reponav-item" data-selected-links="repo_projects new_repo_project repo_project /lsalzman/iqm/projects" href="/lsalzman/iqm/projects">
545 <svg class="octicon octicon-project" viewBox="0 0 15 16" version="1.1" width="15" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M10 12h3V2h-3v10zm-4-2h3V2H6v8zm-4 4h3V2H2v12zm-1 1h13V1H1v14zM14 0H1a1 1 0 00-1 1v14a1 1 0 001 1h13a1 1 0 001-1V1a1 1 0 00-1-1z"/></svg>
546 Projects
547 <span class="Counter" >0</span>
548</a>
549
550
551 <a data-skip-pjax="true" class="js-selected-navigation-item reponav-item" data-selected-links="security alerts policy code_scanning /lsalzman/iqm/security/advisories" href="/lsalzman/iqm/security/advisories">
552 <svg class="octicon octicon-shield" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M0 2l7-2 7 2v6.02C14 12.69 8.69 16 7 16c-1.69 0-7-3.31-7-7.98V2zm1 .75L7 1l6 1.75v5.268C13 12.104 8.449 15 7 15c-1.449 0-6-2.896-6-6.982V2.75zm1 .75L7 2v12c-1.207 0-5-2.482-5-5.985V3.5z"/></svg>
553 Security
554</a>
555 <a class="js-selected-navigation-item reponav-item" data-selected-links="repo_graphs repo_contributors dependency_graph pulse people /lsalzman/iqm/pulse" href="/lsalzman/iqm/pulse">
556 <svg class="octicon octicon-graph" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M16 14v1H0V0h1v14h15zM5 13H3V8h2v5zm4 0H7V3h2v10zm4 0h-2V6h2v7z"/></svg>
557 Insights
558</a>
559
560</nav>
561
562 <div class="reponav-wrapper reponav-small d-lg-none">
563 <nav class="reponav js-reponav text-center no-wrap"
564 itemscope
565 itemtype="http://schema.org/BreadcrumbList">
566
567 <span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
568 <a class="js-selected-navigation-item selected reponav-item" itemprop="url" aria-current="page" data-selected-links="repo_source repo_downloads repo_commits repo_releases repo_tags repo_branches repo_packages /lsalzman/iqm" href="/lsalzman/iqm">
569 <span itemprop="name">Code</span>
570 <meta itemprop="position" content="1">
571</a> </span>
572
573 <span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
574 <a itemprop="url" class="js-selected-navigation-item reponav-item" data-selected-links="repo_issues repo_labels repo_milestones /lsalzman/iqm/issues" href="/lsalzman/iqm/issues">
575 <span itemprop="name">Issues</span>
576 <span class="Counter">17</span>
577 <meta itemprop="position" content="2">
578</a> </span>
579
580 <span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
581 <a itemprop="url" class="js-selected-navigation-item reponav-item" data-selected-links="repo_pulls checks /lsalzman/iqm/pulls" href="/lsalzman/iqm/pulls">
582 <span itemprop="name">Pull requests</span>
583 <span class="Counter">3</span>
584 <meta itemprop="position" content="3">
585</a> </span>
586
587 <span itemscope itemtype="http://schema.org/ListItem" itemprop="itemListElement">
588 <a itemprop="url" class="js-selected-navigation-item reponav-item" data-selected-links="repo_projects new_repo_project repo_project /lsalzman/iqm/projects" href="/lsalzman/iqm/projects">
589 <span itemprop="name">Projects</span>
590 <span class="Counter">0</span>
591 <meta itemprop="position" content="4">
592</a> </span>
593
594
595 <a itemprop="url" class="js-selected-navigation-item reponav-item" data-selected-links="security alerts policy code_scanning /lsalzman/iqm/security/advisories" href="/lsalzman/iqm/security/advisories">
596 <span itemprop="name">Security</span>
597 <meta itemprop="position" content="6">
598</a>
599 <a class="js-selected-navigation-item reponav-item" data-selected-links="pulse /lsalzman/iqm/pulse" href="/lsalzman/iqm/pulse">
600 Pulse
601</a>
602
603 </nav>
604</div>
605
606
607 </div>
608<div class="container-lg clearfix new-discussion-timeline experiment-repo-nav p-responsive">
609 <div class="repository-content ">
610
611
612
613
614
615
616
617
618 <a class="d-none js-permalink-shortcut" data-hotkey="y" href="/lsalzman/iqm/blob/33d7a85ae241924a9317124b5fcada48d8e928d2/blender-2.80/iqm_export.py">Permalink</a>
619
620 <!-- blob contrib key: blob_contributors:v21:40b894b7b99dc3a44071f7cd938ac2e3 -->
621 <div class="signup-prompt-bg rounded-1">
622 <div class="signup-prompt p-4 text-center mb-4 rounded-1">
623 <div class="position-relative">
624 <!-- '"` --><!-- </textarea></xmp> --></option></form><form action="/prompt_dismissals/signup" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓" /><input type="hidden" name="_method" value="put" /><input type="hidden" name="authenticity_token" value="fbI8DwMfaeaUNfrokXUGCiB2yQ9I4TcwesUqsJvPyVpeGGXOsTZYzEsxZb3Gmf/ypquIYYYTUMBco6VYic2xiQ==" />
625 <button type="submit" class="position-absolute top-0 right-0 btn-link link-gray" data-ga-click="(Logged out) Sign up prompt, clicked Dismiss, text:dismiss">
626 Dismiss
627 </button>
628</form> <h3 class="pt-2">Join GitHub today</h3>
629 <p class="col-6 mx-auto">GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.</p>
630 <a class="btn btn-primary" data-hydro-click="{"event_type":"authentication.click","payload":{"location_in_page":"files signup prompt","repository_id":null,"auth_type":"SIGN_UP","client_id":"305421165.1574995628","originating_request_id":"CADA:1415:2A2391:417330:5DE086C3","originating_url":"https://github.com/lsalzman/iqm/blob/master/blender-2.80/iqm_export.py","referrer":"https://github.com/lsalzman/iqm/tree/master/blender-2.80","user_id":null}}" data-hydro-click-hmac="ae7eda857457f90040b0489513af99b5512bdccb61595787c4e718d950f27aa8" data-ga-click="(Logged out) Sign up prompt, clicked Sign up, text:sign-up" href="/join?source=prompt-blob-show&source_repo=lsalzman%2Fiqm">Sign up</a>
631 </div>
632 </div>
633 </div>
634
635
636 <div class="d-flex flex-items-start flex-shrink-0 pb-3 flex-column flex-md-row">
637 <span class="d-flex flex-justify-between width-full width-md-auto">
638
639<details class="details-reset details-overlay select-menu branch-select-menu hx_rsm" id="branch-select-menu">
640 <summary class="btn btn-sm select-menu-button css-truncate"
641 data-hotkey="w"
642 title="Switch branches or tags">
643 <i>Branch:</i>
644 <span class="css-truncate-target" data-menu-button>master</span>
645 </summary>
646
647 <details-menu class="select-menu-modal hx_rsm-modal position-absolute" style="z-index: 99;" src="/lsalzman/iqm/ref-list/master/blender-2.80/iqm_export.py?source_action=show&source_controller=blob" preload>
648 <include-fragment class="select-menu-loading-overlay anim-pulse">
649 <svg height="32" class="octicon octicon-octoface" viewBox="0 0 16 16" version="1.1" width="32" aria-hidden="true"><path fill-rule="evenodd" d="M14.7 5.34c.13-.32.55-1.59-.13-3.31 0 0-1.05-.33-3.44 1.3-1-.28-2.07-.32-3.13-.32s-2.13.04-3.13.32c-2.39-1.64-3.44-1.3-3.44-1.3-.68 1.72-.26 2.99-.13 3.31C.49 6.21 0 7.33 0 8.69 0 13.84 3.33 15 7.98 15S16 13.84 16 8.69c0-1.36-.49-2.48-1.3-3.35zM8 14.02c-3.3 0-5.98-.15-5.98-3.35 0-.76.38-1.48 1.02-2.07 1.07-.98 2.9-.46 4.96-.46 2.07 0 3.88-.52 4.96.46.65.59 1.02 1.3 1.02 2.07 0 3.19-2.68 3.35-5.98 3.35zM5.49 9.01c-.66 0-1.2.8-1.2 1.78s.54 1.79 1.2 1.79c.66 0 1.2-.8 1.2-1.79s-.54-1.78-1.2-1.78zm5.02 0c-.66 0-1.2.79-1.2 1.78s.54 1.79 1.2 1.79c.66 0 1.2-.8 1.2-1.79s-.53-1.78-1.2-1.78z"/></svg>
650 </include-fragment>
651 </details-menu>
652</details>
653
654 <div class="BtnGroup flex-shrink-0 d-md-none">
655 <a href="/lsalzman/iqm/find/master"
656 class="js-pjax-capture-input btn btn-sm BtnGroup-item"
657 data-pjax
658 data-hotkey="t">
659 Find file
660 </a>
661 <clipboard-copy value="blender-2.80/iqm_export.py" class="btn btn-sm BtnGroup-item">
662 Copy path
663 </clipboard-copy>
664 </div>
665 </span>
666 <h2 id="blob-path" class="breadcrumb flex-auto min-width-0 text-normal flex-md-self-center ml-md-2 mr-md-3 my-2 my-md-0">
667 <span class="js-repo-root text-bold"><span class="js-path-segment"><a data-pjax="true" href="/lsalzman/iqm"><span>iqm</span></a></span></span><span class="separator">/</span><span class="js-path-segment"><a data-pjax="true" href="/lsalzman/iqm/tree/master/blender-2.80"><span>blender-2.80</span></a></span><span class="separator">/</span><strong class="final-path">iqm_export.py</strong>
668 </h2>
669
670 <div class="BtnGroup flex-shrink-0 d-none d-md-inline-block">
671 <a href="/lsalzman/iqm/find/master"
672 class="js-pjax-capture-input btn btn-sm BtnGroup-item"
673 data-pjax
674 data-hotkey="t">
675 Find file
676 </a>
677 <clipboard-copy value="blender-2.80/iqm_export.py" class="btn btn-sm BtnGroup-item">
678 Copy path
679 </clipboard-copy>
680 </div>
681 </div>
682
683
684
685
686
687 <include-fragment src="/lsalzman/iqm/contributors/master/blender-2.80/iqm_export.py" class="Box Box--condensed commit-loader">
688 <div class="Box-body bg-blue-light f6">
689 Fetching contributors…
690 </div>
691
692 <div class="Box-body d-flex flex-items-center" >
693 <img alt="" class="loader-loading mr-2" src="https://github.githubassets.com/images/spinners/octocat-spinner-32-EAF2F5.gif" width="16" height="16" />
694 <span class="text-red h6 loader-error">Cannot retrieve contributors at this time</span>
695 </div>
696</include-fragment>
697
698
699
700
701 <div class="Box mt-3 position-relative">
702
703<div class="Box-header py-2 d-flex flex-column flex-shrink-0 flex-md-row flex-md-items-center">
704 <div class="text-mono f6 flex-auto pr-3 flex-order-2 flex-md-order-1 mt-2 mt-md-0">
705
706 1138 lines (1036 sloc)
707 <span class="file-info-divider"></span>
708 47.6 KB
709 </div>
710
711 <div class="d-flex py-1 py-md-0 flex-auto flex-order-1 flex-md-order-2 flex-sm-grow-0 flex-justify-between">
712
713 <div class="BtnGroup">
714 <a id="raw-url" class="btn btn-sm BtnGroup-item" href="/lsalzman/iqm/raw/master/blender-2.80/iqm_export.py">Raw</a>
715 <a class="btn btn-sm js-update-url-with-hash BtnGroup-item" data-hotkey="b" href="/lsalzman/iqm/blame/master/blender-2.80/iqm_export.py">Blame</a>
716 <a rel="nofollow" class="btn btn-sm BtnGroup-item" href="/lsalzman/iqm/commits/master/blender-2.80/iqm_export.py">History</a>
717 </div>
718
719
720 <div>
721
722 <button type="button" class="btn-octicon disabled tooltipped tooltipped-nw"
723 aria-label="You must be signed in to make or propose changes">
724 <svg class="octicon octicon-pencil" viewBox="0 0 14 16" version="1.1" width="14" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M0 12v3h3l8-8-3-3-8 8zm3 2H1v-2h1v1h1v1zm10.3-9.3L12 6 9 3l1.3-1.3a.996.996 0 011.41 0l1.59 1.59c.39.39.39 1.02 0 1.41z"/></svg>
725 </button>
726 <button type="button" class="btn-octicon btn-octicon-danger disabled tooltipped tooltipped-nw"
727 aria-label="You must be signed in to make or propose changes">
728 <svg class="octicon octicon-trashcan" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M11 2H9c0-.55-.45-1-1-1H5c-.55 0-1 .45-1 1H2c-.55 0-1 .45-1 1v1c0 .55.45 1 1 1v9c0 .55.45 1 1 1h7c.55 0 1-.45 1-1V5c.55 0 1-.45 1-1V3c0-.55-.45-1-1-1zm-1 12H3V5h1v8h1V5h1v8h1V5h1v8h1V5h1v9zm1-10H2V3h9v1z"/></svg>
729 </button>
730 </div>
731 </div>
732</div>
733
734
735
736
737
738
739 <div itemprop="text" class="Box-body p-0 blob-wrapper data type-python ">
740
741<table class="highlight tab-size js-file-line-container" data-tab-size="8">
742 <tr>
743 <td id="L1" class="blob-num js-line-number" data-line-number="1"></td>
744 <td id="LC1" class="blob-code blob-code-inner js-file-line"><span class="pl-c"><span class="pl-c">#</span> This script is licensed as public domain.</span></td>
745 </tr>
746 <tr>
747 <td id="L2" class="blob-num js-line-number" data-line-number="2"></td>
748 <td id="LC2" class="blob-code blob-code-inner js-file-line">
749</td>
750 </tr>
751 <tr>
752 <td id="L3" class="blob-num js-line-number" data-line-number="3"></td>
753 <td id="LC3" class="blob-code blob-code-inner js-file-line">bl_info <span class="pl-k">=</span> {</td>
754 </tr>
755 <tr>
756 <td id="L4" class="blob-num js-line-number" data-line-number="4"></td>
757 <td id="LC4" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">"</span>name<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>Export Inter-Quake Model (.iqm/.iqe)<span class="pl-pds">"</span></span>,</td>
758 </tr>
759 <tr>
760 <td id="L5" class="blob-num js-line-number" data-line-number="5"></td>
761 <td id="LC5" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">"</span>author<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>Lee Salzman<span class="pl-pds">"</span></span>,</td>
762 </tr>
763 <tr>
764 <td id="L6" class="blob-num js-line-number" data-line-number="6"></td>
765 <td id="LC6" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">"</span>version<span class="pl-pds">"</span></span>: (<span class="pl-c1">2019</span>, <span class="pl-c1">4</span>, <span class="pl-c1">24</span>),</td>
766 </tr>
767 <tr>
768 <td id="L7" class="blob-num js-line-number" data-line-number="7"></td>
769 <td id="LC7" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">"</span>blender<span class="pl-pds">"</span></span>: (<span class="pl-c1">2</span>, <span class="pl-c1">80</span>, <span class="pl-c1">0</span>),</td>
770 </tr>
771 <tr>
772 <td id="L8" class="blob-num js-line-number" data-line-number="8"></td>
773 <td id="LC8" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">"</span>location<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>File > Export > Inter-Quake Model<span class="pl-pds">"</span></span>,</td>
774 </tr>
775 <tr>
776 <td id="L9" class="blob-num js-line-number" data-line-number="9"></td>
777 <td id="LC9" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">"</span>description<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>Export to the Inter-Quake Model format (.iqm/.iqe)<span class="pl-pds">"</span></span>,</td>
778 </tr>
779 <tr>
780 <td id="L10" class="blob-num js-line-number" data-line-number="10"></td>
781 <td id="LC10" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">"</span>warning<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>,</td>
782 </tr>
783 <tr>
784 <td id="L11" class="blob-num js-line-number" data-line-number="11"></td>
785 <td id="LC11" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">"</span>wiki_url<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>,</td>
786 </tr>
787 <tr>
788 <td id="L12" class="blob-num js-line-number" data-line-number="12"></td>
789 <td id="LC12" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">"</span>tracker_url<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>,</td>
790 </tr>
791 <tr>
792 <td id="L13" class="blob-num js-line-number" data-line-number="13"></td>
793 <td id="LC13" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">"</span>category<span class="pl-pds">"</span></span>: <span class="pl-s"><span class="pl-pds">"</span>Import-Export<span class="pl-pds">"</span></span>}</td>
794 </tr>
795 <tr>
796 <td id="L14" class="blob-num js-line-number" data-line-number="14"></td>
797 <td id="LC14" class="blob-code blob-code-inner js-file-line">
798</td>
799 </tr>
800 <tr>
801 <td id="L15" class="blob-num js-line-number" data-line-number="15"></td>
802 <td id="LC15" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> os, struct, math</td>
803 </tr>
804 <tr>
805 <td id="L16" class="blob-num js-line-number" data-line-number="16"></td>
806 <td id="LC16" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> mathutils</td>
807 </tr>
808 <tr>
809 <td id="L17" class="blob-num js-line-number" data-line-number="17"></td>
810 <td id="LC17" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> bpy</td>
811 </tr>
812 <tr>
813 <td id="L18" class="blob-num js-line-number" data-line-number="18"></td>
814 <td id="LC18" class="blob-code blob-code-inner js-file-line"><span class="pl-k">import</span> bpy_extras.io_utils</td>
815 </tr>
816 <tr>
817 <td id="L19" class="blob-num js-line-number" data-line-number="19"></td>
818 <td id="LC19" class="blob-code blob-code-inner js-file-line">
819</td>
820 </tr>
821 <tr>
822 <td id="L20" class="blob-num js-line-number" data-line-number="20"></td>
823 <td id="LC20" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_POSITION</span> <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
824 </tr>
825 <tr>
826 <td id="L21" class="blob-num js-line-number" data-line-number="21"></td>
827 <td id="LC21" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_TEXCOORD</span> <span class="pl-k">=</span> <span class="pl-c1">1</span></td>
828 </tr>
829 <tr>
830 <td id="L22" class="blob-num js-line-number" data-line-number="22"></td>
831 <td id="LC22" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_NORMAL</span> <span class="pl-k">=</span> <span class="pl-c1">2</span></td>
832 </tr>
833 <tr>
834 <td id="L23" class="blob-num js-line-number" data-line-number="23"></td>
835 <td id="LC23" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_TANGENT</span> <span class="pl-k">=</span> <span class="pl-c1">3</span></td>
836 </tr>
837 <tr>
838 <td id="L24" class="blob-num js-line-number" data-line-number="24"></td>
839 <td id="LC24" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_BLENDINDEXES</span> <span class="pl-k">=</span> <span class="pl-c1">4</span></td>
840 </tr>
841 <tr>
842 <td id="L25" class="blob-num js-line-number" data-line-number="25"></td>
843 <td id="LC25" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_BLENDWEIGHTS</span> <span class="pl-k">=</span> <span class="pl-c1">5</span></td>
844 </tr>
845 <tr>
846 <td id="L26" class="blob-num js-line-number" data-line-number="26"></td>
847 <td id="LC26" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_COLOR</span> <span class="pl-k">=</span> <span class="pl-c1">6</span></td>
848 </tr>
849 <tr>
850 <td id="L27" class="blob-num js-line-number" data-line-number="27"></td>
851 <td id="LC27" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_CUSTOM</span> <span class="pl-k">=</span> <span class="pl-c1"><span class="pl-k">0x</span>10</span></td>
852 </tr>
853 <tr>
854 <td id="L28" class="blob-num js-line-number" data-line-number="28"></td>
855 <td id="LC28" class="blob-code blob-code-inner js-file-line">
856</td>
857 </tr>
858 <tr>
859 <td id="L29" class="blob-num js-line-number" data-line-number="29"></td>
860 <td id="LC29" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_BYTE</span> <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
861 </tr>
862 <tr>
863 <td id="L30" class="blob-num js-line-number" data-line-number="30"></td>
864 <td id="LC30" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_UBYTE</span> <span class="pl-k">=</span> <span class="pl-c1">1</span></td>
865 </tr>
866 <tr>
867 <td id="L31" class="blob-num js-line-number" data-line-number="31"></td>
868 <td id="LC31" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_SHORT</span> <span class="pl-k">=</span> <span class="pl-c1">2</span></td>
869 </tr>
870 <tr>
871 <td id="L32" class="blob-num js-line-number" data-line-number="32"></td>
872 <td id="LC32" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_USHORT</span> <span class="pl-k">=</span> <span class="pl-c1">3</span></td>
873 </tr>
874 <tr>
875 <td id="L33" class="blob-num js-line-number" data-line-number="33"></td>
876 <td id="LC33" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_INT</span> <span class="pl-k">=</span> <span class="pl-c1">4</span></td>
877 </tr>
878 <tr>
879 <td id="L34" class="blob-num js-line-number" data-line-number="34"></td>
880 <td id="LC34" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_UINT</span> <span class="pl-k">=</span> <span class="pl-c1">5</span></td>
881 </tr>
882 <tr>
883 <td id="L35" class="blob-num js-line-number" data-line-number="35"></td>
884 <td id="LC35" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_HALF</span> <span class="pl-k">=</span> <span class="pl-c1">6</span></td>
885 </tr>
886 <tr>
887 <td id="L36" class="blob-num js-line-number" data-line-number="36"></td>
888 <td id="LC36" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_FLOAT</span> <span class="pl-k">=</span> <span class="pl-c1">7</span></td>
889 </tr>
890 <tr>
891 <td id="L37" class="blob-num js-line-number" data-line-number="37"></td>
892 <td id="LC37" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_DOUBLE</span> <span class="pl-k">=</span> <span class="pl-c1">8</span></td>
893 </tr>
894 <tr>
895 <td id="L38" class="blob-num js-line-number" data-line-number="38"></td>
896 <td id="LC38" class="blob-code blob-code-inner js-file-line">
897</td>
898 </tr>
899 <tr>
900 <td id="L39" class="blob-num js-line-number" data-line-number="39"></td>
901 <td id="LC39" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_LOOP</span> <span class="pl-k">=</span> <span class="pl-c1">1</span></td>
902 </tr>
903 <tr>
904 <td id="L40" class="blob-num js-line-number" data-line-number="40"></td>
905 <td id="LC40" class="blob-code blob-code-inner js-file-line">
906</td>
907 </tr>
908 <tr>
909 <td id="L41" class="blob-num js-line-number" data-line-number="41"></td>
910 <td id="LC41" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_HEADER</span> <span class="pl-k">=</span> struct.Struct(<span class="pl-s"><span class="pl-pds">'</span><16s27I<span class="pl-pds">'</span></span>)</td>
911 </tr>
912 <tr>
913 <td id="L42" class="blob-num js-line-number" data-line-number="42"></td>
914 <td id="LC42" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_MESH</span> <span class="pl-k">=</span> struct.Struct(<span class="pl-s"><span class="pl-pds">'</span><6I<span class="pl-pds">'</span></span>)</td>
915 </tr>
916 <tr>
917 <td id="L43" class="blob-num js-line-number" data-line-number="43"></td>
918 <td id="LC43" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_TRIANGLE</span> <span class="pl-k">=</span> struct.Struct(<span class="pl-s"><span class="pl-pds">'</span><3I<span class="pl-pds">'</span></span>)</td>
919 </tr>
920 <tr>
921 <td id="L44" class="blob-num js-line-number" data-line-number="44"></td>
922 <td id="LC44" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_JOINT</span> <span class="pl-k">=</span> struct.Struct(<span class="pl-s"><span class="pl-pds">'</span><Ii10f<span class="pl-pds">'</span></span>)</td>
923 </tr>
924 <tr>
925 <td id="L45" class="blob-num js-line-number" data-line-number="45"></td>
926 <td id="LC45" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_POSE</span> <span class="pl-k">=</span> struct.Struct(<span class="pl-s"><span class="pl-pds">'</span><iI20f<span class="pl-pds">'</span></span>)</td>
927 </tr>
928 <tr>
929 <td id="L46" class="blob-num js-line-number" data-line-number="46"></td>
930 <td id="LC46" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_ANIMATION</span> <span class="pl-k">=</span> struct.Struct(<span class="pl-s"><span class="pl-pds">'</span><3IfI<span class="pl-pds">'</span></span>)</td>
931 </tr>
932 <tr>
933 <td id="L47" class="blob-num js-line-number" data-line-number="47"></td>
934 <td id="LC47" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_VERTEXARRAY</span> <span class="pl-k">=</span> struct.Struct(<span class="pl-s"><span class="pl-pds">'</span><5I<span class="pl-pds">'</span></span>)</td>
935 </tr>
936 <tr>
937 <td id="L48" class="blob-num js-line-number" data-line-number="48"></td>
938 <td id="LC48" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">IQM_BOUNDS</span> <span class="pl-k">=</span> struct.Struct(<span class="pl-s"><span class="pl-pds">'</span><8f<span class="pl-pds">'</span></span>)</td>
939 </tr>
940 <tr>
941 <td id="L49" class="blob-num js-line-number" data-line-number="49"></td>
942 <td id="LC49" class="blob-code blob-code-inner js-file-line">
943</td>
944 </tr>
945 <tr>
946 <td id="L50" class="blob-num js-line-number" data-line-number="50"></td>
947 <td id="LC50" class="blob-code blob-code-inner js-file-line"><span class="pl-c1">MAXVCACHE</span> <span class="pl-k">=</span> <span class="pl-c1">32</span></td>
948 </tr>
949 <tr>
950 <td id="L51" class="blob-num js-line-number" data-line-number="51"></td>
951 <td id="LC51" class="blob-code blob-code-inner js-file-line">
952</td>
953 </tr>
954 <tr>
955 <td id="L52" class="blob-num js-line-number" data-line-number="52"></td>
956 <td id="LC52" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-en">Vertex</span>:</td>
957 </tr>
958 <tr>
959 <td id="L53" class="blob-num js-line-number" data-line-number="53"></td>
960 <td id="LC53" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-c1">__init__</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">index</span>, <span class="pl-smi">coord</span>, <span class="pl-smi">normal</span>, <span class="pl-smi">uv</span>, <span class="pl-smi">weights</span>, <span class="pl-smi">color</span>):</td>
961 </tr>
962 <tr>
963 <td id="L54" class="blob-num js-line-number" data-line-number="54"></td>
964 <td id="LC54" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.index <span class="pl-k">=</span> index</td>
965 </tr>
966 <tr>
967 <td id="L55" class="blob-num js-line-number" data-line-number="55"></td>
968 <td id="LC55" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.coord <span class="pl-k">=</span> coord</td>
969 </tr>
970 <tr>
971 <td id="L56" class="blob-num js-line-number" data-line-number="56"></td>
972 <td id="LC56" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.normal <span class="pl-k">=</span> normal</td>
973 </tr>
974 <tr>
975 <td id="L57" class="blob-num js-line-number" data-line-number="57"></td>
976 <td id="LC57" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.uv <span class="pl-k">=</span> uv</td>
977 </tr>
978 <tr>
979 <td id="L58" class="blob-num js-line-number" data-line-number="58"></td>
980 <td id="LC58" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.weights <span class="pl-k">=</span> weights</td>
981 </tr>
982 <tr>
983 <td id="L59" class="blob-num js-line-number" data-line-number="59"></td>
984 <td id="LC59" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.color <span class="pl-k">=</span> color</td>
985 </tr>
986 <tr>
987 <td id="L60" class="blob-num js-line-number" data-line-number="60"></td>
988 <td id="LC60" class="blob-code blob-code-inner js-file-line">
989</td>
990 </tr>
991 <tr>
992 <td id="L61" class="blob-num js-line-number" data-line-number="61"></td>
993 <td id="LC61" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">normalizeWeights</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>):</td>
994 </tr>
995 <tr>
996 <td id="L62" class="blob-num js-line-number" data-line-number="62"></td>
997 <td id="LC62" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"><span class="pl-c">#</span> renormalizes all weights such that they add up to 255</span></td>
998 </tr>
999 <tr>
1000 <td id="L63" class="blob-num js-line-number" data-line-number="63"></td>
1001 <td id="LC63" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"><span class="pl-c">#</span> the list is chopped/padded to exactly 4 weights if necessary</span></td>
1002 </tr>
1003 <tr>
1004 <td id="L64" class="blob-num js-line-number" data-line-number="64"></td>
1005 <td id="LC64" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> <span class="pl-c1">self</span>.weights:</td>
1006 </tr>
1007 <tr>
1008 <td id="L65" class="blob-num js-line-number" data-line-number="65"></td>
1009 <td id="LC65" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.weights <span class="pl-k">=</span> [ (<span class="pl-c1">0</span>, <span class="pl-c1">0</span>), (<span class="pl-c1">0</span>, <span class="pl-c1">0</span>), (<span class="pl-c1">0</span>, <span class="pl-c1">0</span>), (<span class="pl-c1">0</span>, <span class="pl-c1">0</span>) ]</td>
1010 </tr>
1011 <tr>
1012 <td id="L66" class="blob-num js-line-number" data-line-number="66"></td>
1013 <td id="LC66" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span></td>
1014 </tr>
1015 <tr>
1016 <td id="L67" class="blob-num js-line-number" data-line-number="67"></td>
1017 <td id="LC67" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.weights.sort(<span class="pl-v">key</span> <span class="pl-k">=</span> <span class="pl-k">lambda</span> <span class="pl-smi">weight</span>: weight[<span class="pl-c1">0</span>], <span class="pl-v">reverse</span><span class="pl-k">=</span><span class="pl-c1">True</span>)</td>
1018 </tr>
1019 <tr>
1020 <td id="L68" class="blob-num js-line-number" data-line-number="68"></td>
1021 <td id="LC68" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.weights) <span class="pl-k">></span> <span class="pl-c1">4</span>: </td>
1022 </tr>
1023 <tr>
1024 <td id="L69" class="blob-num js-line-number" data-line-number="69"></td>
1025 <td id="LC69" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">del</span> <span class="pl-c1">self</span>.weights[<span class="pl-c1">4</span>:]</td>
1026 </tr>
1027 <tr>
1028 <td id="L70" class="blob-num js-line-number" data-line-number="70"></td>
1029 <td id="LC70" class="blob-code blob-code-inner js-file-line"> totalweight <span class="pl-k">=</span> <span class="pl-c1">sum</span>([ weight <span class="pl-k">for</span> (weight, bone) <span class="pl-k">in</span> <span class="pl-c1">self</span>.weights])</td>
1030 </tr>
1031 <tr>
1032 <td id="L71" class="blob-num js-line-number" data-line-number="71"></td>
1033 <td id="LC71" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> totalweight <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
1034 </tr>
1035 <tr>
1036 <td id="L72" class="blob-num js-line-number" data-line-number="72"></td>
1037 <td id="LC72" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.weights <span class="pl-k">=</span> [ (<span class="pl-c1">int</span>(<span class="pl-c1">round</span>(weight <span class="pl-k">*</span> <span class="pl-c1">255.0</span> <span class="pl-k">/</span> totalweight)), bone) <span class="pl-k">for</span> (weight, bone) <span class="pl-k">in</span> <span class="pl-c1">self</span>.weights]</td>
1038 </tr>
1039 <tr>
1040 <td id="L73" class="blob-num js-line-number" data-line-number="73"></td>
1041 <td id="LC73" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">while</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.weights) <span class="pl-k">></span> <span class="pl-c1">1</span> <span class="pl-k">and</span> <span class="pl-c1">self</span>.weights[<span class="pl-k">-</span><span class="pl-c1">1</span>][<span class="pl-c1">0</span>] <span class="pl-k"><=</span> <span class="pl-c1">0</span>:</td>
1042 </tr>
1043 <tr>
1044 <td id="L74" class="blob-num js-line-number" data-line-number="74"></td>
1045 <td id="LC74" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.weights.pop()</td>
1046 </tr>
1047 <tr>
1048 <td id="L75" class="blob-num js-line-number" data-line-number="75"></td>
1049 <td id="LC75" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
1050 </tr>
1051 <tr>
1052 <td id="L76" class="blob-num js-line-number" data-line-number="76"></td>
1053 <td id="LC76" class="blob-code blob-code-inner js-file-line"> totalweight <span class="pl-k">=</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.weights)</td>
1054 </tr>
1055 <tr>
1056 <td id="L77" class="blob-num js-line-number" data-line-number="77"></td>
1057 <td id="LC77" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.weights <span class="pl-k">=</span> [ (<span class="pl-c1">int</span>(<span class="pl-c1">round</span>(<span class="pl-c1">255.0</span> <span class="pl-k">/</span> totalweight)), bone) <span class="pl-k">for</span> (weight, bone) <span class="pl-k">in</span> <span class="pl-c1">self</span>.weights]</td>
1058 </tr>
1059 <tr>
1060 <td id="L78" class="blob-num js-line-number" data-line-number="78"></td>
1061 <td id="LC78" class="blob-code blob-code-inner js-file-line"> totalweight <span class="pl-k">=</span> <span class="pl-c1">sum</span>([ weight <span class="pl-k">for</span> (weight, bone) <span class="pl-k">in</span> <span class="pl-c1">self</span>.weights])</td>
1062 </tr>
1063 <tr>
1064 <td id="L79" class="blob-num js-line-number" data-line-number="79"></td>
1065 <td id="LC79" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">while</span> totalweight <span class="pl-k">!=</span> <span class="pl-c1">255</span>:</td>
1066 </tr>
1067 <tr>
1068 <td id="L80" class="blob-num js-line-number" data-line-number="80"></td>
1069 <td id="LC80" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, (weight, bone) <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(<span class="pl-c1">self</span>.weights):</td>
1070 </tr>
1071 <tr>
1072 <td id="L81" class="blob-num js-line-number" data-line-number="81"></td>
1073 <td id="LC81" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> totalweight <span class="pl-k">></span> <span class="pl-c1">255</span> <span class="pl-k">and</span> weight <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
1074 </tr>
1075 <tr>
1076 <td id="L82" class="blob-num js-line-number" data-line-number="82"></td>
1077 <td id="LC82" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.weights[i] <span class="pl-k">=</span> (weight <span class="pl-k">-</span> <span class="pl-c1">1</span>, bone)</td>
1078 </tr>
1079 <tr>
1080 <td id="L83" class="blob-num js-line-number" data-line-number="83"></td>
1081 <td id="LC83" class="blob-code blob-code-inner js-file-line"> totalweight <span class="pl-k">-=</span> <span class="pl-c1">1</span></td>
1082 </tr>
1083 <tr>
1084 <td id="L84" class="blob-num js-line-number" data-line-number="84"></td>
1085 <td id="LC84" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">elif</span> totalweight <span class="pl-k"><</span> <span class="pl-c1">255</span> <span class="pl-k">and</span> weight <span class="pl-k"><</span> <span class="pl-c1">255</span>:</td>
1086 </tr>
1087 <tr>
1088 <td id="L85" class="blob-num js-line-number" data-line-number="85"></td>
1089 <td id="LC85" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.weights[i] <span class="pl-k">=</span> (weight <span class="pl-k">+</span> <span class="pl-c1">1</span>, bone)</td>
1090 </tr>
1091 <tr>
1092 <td id="L86" class="blob-num js-line-number" data-line-number="86"></td>
1093 <td id="LC86" class="blob-code blob-code-inner js-file-line"> totalweight <span class="pl-k">+=</span> <span class="pl-c1">1</span></td>
1094 </tr>
1095 <tr>
1096 <td id="L87" class="blob-num js-line-number" data-line-number="87"></td>
1097 <td id="LC87" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">while</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.weights) <span class="pl-k"><</span> <span class="pl-c1">4</span>:</td>
1098 </tr>
1099 <tr>
1100 <td id="L88" class="blob-num js-line-number" data-line-number="88"></td>
1101 <td id="LC88" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.weights.append((<span class="pl-c1">0</span>, <span class="pl-c1">self</span>.weights[<span class="pl-k">-</span><span class="pl-c1">1</span>][<span class="pl-c1">1</span>]))</td>
1102 </tr>
1103 <tr>
1104 <td id="L89" class="blob-num js-line-number" data-line-number="89"></td>
1105 <td id="LC89" class="blob-code blob-code-inner js-file-line">
1106</td>
1107 </tr>
1108 <tr>
1109 <td id="L90" class="blob-num js-line-number" data-line-number="90"></td>
1110 <td id="LC90" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">calcScore</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>):</td>
1111 </tr>
1112 <tr>
1113 <td id="L91" class="blob-num js-line-number" data-line-number="91"></td>
1114 <td id="LC91" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.uses:</td>
1115 </tr>
1116 <tr>
1117 <td id="L92" class="blob-num js-line-number" data-line-number="92"></td>
1118 <td id="LC92" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.score <span class="pl-k">=</span> <span class="pl-c1">2.0</span> <span class="pl-k">*</span> <span class="pl-c1">pow</span>(<span class="pl-c1">len</span>(<span class="pl-c1">self</span>.uses), <span class="pl-k">-</span><span class="pl-c1">0.5</span>)</td>
1119 </tr>
1120 <tr>
1121 <td id="L93" class="blob-num js-line-number" data-line-number="93"></td>
1122 <td id="LC93" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.cacherank <span class="pl-k">>=</span> <span class="pl-c1">3</span>:</td>
1123 </tr>
1124 <tr>
1125 <td id="L94" class="blob-num js-line-number" data-line-number="94"></td>
1126 <td id="LC94" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.score <span class="pl-k">+=</span> <span class="pl-c1">pow</span>(<span class="pl-c1">1.0</span> <span class="pl-k">-</span> <span class="pl-c1">float</span>(<span class="pl-c1">self</span>.cacherank <span class="pl-k">-</span> <span class="pl-c1">3</span>)<span class="pl-k">/</span><span class="pl-c1">MAXVCACHE</span>, <span class="pl-c1">1.5</span>)</td>
1127 </tr>
1128 <tr>
1129 <td id="L95" class="blob-num js-line-number" data-line-number="95"></td>
1130 <td id="LC95" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">elif</span> <span class="pl-c1">self</span>.cacherank <span class="pl-k">>=</span> <span class="pl-c1">0</span>:</td>
1131 </tr>
1132 <tr>
1133 <td id="L96" class="blob-num js-line-number" data-line-number="96"></td>
1134 <td id="LC96" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.score <span class="pl-k">+=</span> <span class="pl-c1">0.75</span></td>
1135 </tr>
1136 <tr>
1137 <td id="L97" class="blob-num js-line-number" data-line-number="97"></td>
1138 <td id="LC97" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
1139 </tr>
1140 <tr>
1141 <td id="L98" class="blob-num js-line-number" data-line-number="98"></td>
1142 <td id="LC98" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.score <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1.0</span></td>
1143 </tr>
1144 <tr>
1145 <td id="L99" class="blob-num js-line-number" data-line-number="99"></td>
1146 <td id="LC99" class="blob-code blob-code-inner js-file-line">
1147</td>
1148 </tr>
1149 <tr>
1150 <td id="L100" class="blob-num js-line-number" data-line-number="100"></td>
1151 <td id="LC100" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">neighborKey</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">other</span>):</td>
1152 </tr>
1153 <tr>
1154 <td id="L101" class="blob-num js-line-number" data-line-number="101"></td>
1155 <td id="LC101" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.coord <span class="pl-k"><</span> other.coord:</td>
1156 </tr>
1157 <tr>
1158 <td id="L102" class="blob-num js-line-number" data-line-number="102"></td>
1159 <td id="LC102" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> (<span class="pl-c1">self</span>.coord.x, <span class="pl-c1">self</span>.coord.y, <span class="pl-c1">self</span>.coord.z, other.coord.x, other.coord.y, other.coord.z, <span class="pl-c1">tuple</span>(<span class="pl-c1">self</span>.weights), <span class="pl-c1">tuple</span>(other.weights))</td>
1160 </tr>
1161 <tr>
1162 <td id="L103" class="blob-num js-line-number" data-line-number="103"></td>
1163 <td id="LC103" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
1164 </tr>
1165 <tr>
1166 <td id="L104" class="blob-num js-line-number" data-line-number="104"></td>
1167 <td id="LC104" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> (other.coord.x, other.coord.y, other.coord.z, <span class="pl-c1">self</span>.coord.x, <span class="pl-c1">self</span>.coord.y, <span class="pl-c1">self</span>.coord.z, <span class="pl-c1">tuple</span>(other.weights), <span class="pl-c1">tuple</span>(<span class="pl-c1">self</span>.weights)) </td>
1168 </tr>
1169 <tr>
1170 <td id="L105" class="blob-num js-line-number" data-line-number="105"></td>
1171 <td id="LC105" class="blob-code blob-code-inner js-file-line"> </td>
1172 </tr>
1173 <tr>
1174 <td id="L106" class="blob-num js-line-number" data-line-number="106"></td>
1175 <td id="LC106" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-c1">__hash__</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>):</td>
1176 </tr>
1177 <tr>
1178 <td id="L107" class="blob-num js-line-number" data-line-number="107"></td>
1179 <td id="LC107" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-c1">self</span>.index</td>
1180 </tr>
1181 <tr>
1182 <td id="L108" class="blob-num js-line-number" data-line-number="108"></td>
1183 <td id="LC108" class="blob-code blob-code-inner js-file-line">
1184</td>
1185 </tr>
1186 <tr>
1187 <td id="L109" class="blob-num js-line-number" data-line-number="109"></td>
1188 <td id="LC109" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-c1">__eq__</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">v</span>):</td>
1189 </tr>
1190 <tr>
1191 <td id="L110" class="blob-num js-line-number" data-line-number="110"></td>
1192 <td id="LC110" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-c1">self</span>.coord <span class="pl-k">==</span> v.coord <span class="pl-k">and</span> <span class="pl-c1">self</span>.normal <span class="pl-k">==</span> v.normal <span class="pl-k">and</span> <span class="pl-c1">self</span>.uv <span class="pl-k">==</span> v.uv <span class="pl-k">and</span> <span class="pl-c1">self</span>.weights <span class="pl-k">==</span> v.weights <span class="pl-k">and</span> <span class="pl-c1">self</span>.color <span class="pl-k">==</span> v.color</td>
1193 </tr>
1194 <tr>
1195 <td id="L111" class="blob-num js-line-number" data-line-number="111"></td>
1196 <td id="LC111" class="blob-code blob-code-inner js-file-line">
1197</td>
1198 </tr>
1199 <tr>
1200 <td id="L112" class="blob-num js-line-number" data-line-number="112"></td>
1201 <td id="LC112" class="blob-code blob-code-inner js-file-line">
1202</td>
1203 </tr>
1204 <tr>
1205 <td id="L113" class="blob-num js-line-number" data-line-number="113"></td>
1206 <td id="LC113" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-en">Mesh</span>:</td>
1207 </tr>
1208 <tr>
1209 <td id="L114" class="blob-num js-line-number" data-line-number="114"></td>
1210 <td id="LC114" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-c1">__init__</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">name</span>, <span class="pl-smi">material</span>, <span class="pl-smi">verts</span>):</td>
1211 </tr>
1212 <tr>
1213 <td id="L115" class="blob-num js-line-number" data-line-number="115"></td>
1214 <td id="LC115" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.name <span class="pl-k">=</span> name</td>
1215 </tr>
1216 <tr>
1217 <td id="L116" class="blob-num js-line-number" data-line-number="116"></td>
1218 <td id="LC116" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.material <span class="pl-k">=</span> material</td>
1219 </tr>
1220 <tr>
1221 <td id="L117" class="blob-num js-line-number" data-line-number="117"></td>
1222 <td id="LC117" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.verts <span class="pl-k">=</span> [ <span class="pl-c1">None</span> <span class="pl-k">for</span> v <span class="pl-k">in</span> verts ]</td>
1223 </tr>
1224 <tr>
1225 <td id="L118" class="blob-num js-line-number" data-line-number="118"></td>
1226 <td id="LC118" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.vertmap <span class="pl-k">=</span> {}</td>
1227 </tr>
1228 <tr>
1229 <td id="L119" class="blob-num js-line-number" data-line-number="119"></td>
1230 <td id="LC119" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.tris <span class="pl-k">=</span> []</td>
1231 </tr>
1232 <tr>
1233 <td id="L120" class="blob-num js-line-number" data-line-number="120"></td>
1234 <td id="LC120" class="blob-code blob-code-inner js-file-line"> </td>
1235 </tr>
1236 <tr>
1237 <td id="L121" class="blob-num js-line-number" data-line-number="121"></td>
1238 <td id="LC121" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">calcTangents</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>):</td>
1239 </tr>
1240 <tr>
1241 <td id="L122" class="blob-num js-line-number" data-line-number="122"></td>
1242 <td id="LC122" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"><span class="pl-c">#</span> See "Tangent Space Calculation" at http://www.terathon.com/code/tangent.html</span></td>
1243 </tr>
1244 <tr>
1245 <td id="L123" class="blob-num js-line-number" data-line-number="123"></td>
1246 <td id="LC123" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> <span class="pl-c1">self</span>.verts:</td>
1247 </tr>
1248 <tr>
1249 <td id="L124" class="blob-num js-line-number" data-line-number="124"></td>
1250 <td id="LC124" class="blob-code blob-code-inner js-file-line"> v.tangent <span class="pl-k">=</span> mathutils.Vector((<span class="pl-c1">0.0</span>, <span class="pl-c1">0.0</span>, <span class="pl-c1">0.0</span>))</td>
1251 </tr>
1252 <tr>
1253 <td id="L125" class="blob-num js-line-number" data-line-number="125"></td>
1254 <td id="LC125" class="blob-code blob-code-inner js-file-line"> v.bitangent <span class="pl-k">=</span> mathutils.Vector((<span class="pl-c1">0.0</span>, <span class="pl-c1">0.0</span>, <span class="pl-c1">0.0</span>))</td>
1255 </tr>
1256 <tr>
1257 <td id="L126" class="blob-num js-line-number" data-line-number="126"></td>
1258 <td id="LC126" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> (v0, v1, v2) <span class="pl-k">in</span> <span class="pl-c1">self</span>.tris:</td>
1259 </tr>
1260 <tr>
1261 <td id="L127" class="blob-num js-line-number" data-line-number="127"></td>
1262 <td id="LC127" class="blob-code blob-code-inner js-file-line"> dco1 <span class="pl-k">=</span> v1.coord <span class="pl-k">-</span> v0.coord</td>
1263 </tr>
1264 <tr>
1265 <td id="L128" class="blob-num js-line-number" data-line-number="128"></td>
1266 <td id="LC128" class="blob-code blob-code-inner js-file-line"> dco2 <span class="pl-k">=</span> v2.coord <span class="pl-k">-</span> v0.coord</td>
1267 </tr>
1268 <tr>
1269 <td id="L129" class="blob-num js-line-number" data-line-number="129"></td>
1270 <td id="LC129" class="blob-code blob-code-inner js-file-line"> duv1 <span class="pl-k">=</span> v1.uv <span class="pl-k">-</span> v0.uv</td>
1271 </tr>
1272 <tr>
1273 <td id="L130" class="blob-num js-line-number" data-line-number="130"></td>
1274 <td id="LC130" class="blob-code blob-code-inner js-file-line"> duv2 <span class="pl-k">=</span> v2.uv <span class="pl-k">-</span> v0.uv</td>
1275 </tr>
1276 <tr>
1277 <td id="L131" class="blob-num js-line-number" data-line-number="131"></td>
1278 <td id="LC131" class="blob-code blob-code-inner js-file-line"> tangent <span class="pl-k">=</span> dco2<span class="pl-k">*</span>duv1.y <span class="pl-k">-</span> dco1<span class="pl-k">*</span>duv2.y</td>
1279 </tr>
1280 <tr>
1281 <td id="L132" class="blob-num js-line-number" data-line-number="132"></td>
1282 <td id="LC132" class="blob-code blob-code-inner js-file-line"> bitangent <span class="pl-k">=</span> dco2<span class="pl-k">*</span>duv1.x <span class="pl-k">-</span> dco1<span class="pl-k">*</span>duv2.x</td>
1283 </tr>
1284 <tr>
1285 <td id="L133" class="blob-num js-line-number" data-line-number="133"></td>
1286 <td id="LC133" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> dco2.cross(dco1).dot(bitangent.cross(tangent)) <span class="pl-k"><</span> <span class="pl-c1">0</span>:</td>
1287 </tr>
1288 <tr>
1289 <td id="L134" class="blob-num js-line-number" data-line-number="134"></td>
1290 <td id="LC134" class="blob-code blob-code-inner js-file-line"> tangent.negate()</td>
1291 </tr>
1292 <tr>
1293 <td id="L135" class="blob-num js-line-number" data-line-number="135"></td>
1294 <td id="LC135" class="blob-code blob-code-inner js-file-line"> bitangent.negate()</td>
1295 </tr>
1296 <tr>
1297 <td id="L136" class="blob-num js-line-number" data-line-number="136"></td>
1298 <td id="LC136" class="blob-code blob-code-inner js-file-line"> v0.tangent <span class="pl-k">+=</span> tangent</td>
1299 </tr>
1300 <tr>
1301 <td id="L137" class="blob-num js-line-number" data-line-number="137"></td>
1302 <td id="LC137" class="blob-code blob-code-inner js-file-line"> v1.tangent <span class="pl-k">+=</span> tangent</td>
1303 </tr>
1304 <tr>
1305 <td id="L138" class="blob-num js-line-number" data-line-number="138"></td>
1306 <td id="LC138" class="blob-code blob-code-inner js-file-line"> v2.tangent <span class="pl-k">+=</span> tangent</td>
1307 </tr>
1308 <tr>
1309 <td id="L139" class="blob-num js-line-number" data-line-number="139"></td>
1310 <td id="LC139" class="blob-code blob-code-inner js-file-line"> v0.bitangent <span class="pl-k">+=</span> bitangent</td>
1311 </tr>
1312 <tr>
1313 <td id="L140" class="blob-num js-line-number" data-line-number="140"></td>
1314 <td id="LC140" class="blob-code blob-code-inner js-file-line"> v1.bitangent <span class="pl-k">+=</span> bitangent</td>
1315 </tr>
1316 <tr>
1317 <td id="L141" class="blob-num js-line-number" data-line-number="141"></td>
1318 <td id="LC141" class="blob-code blob-code-inner js-file-line"> v2.bitangent <span class="pl-k">+=</span> bitangent</td>
1319 </tr>
1320 <tr>
1321 <td id="L142" class="blob-num js-line-number" data-line-number="142"></td>
1322 <td id="LC142" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> <span class="pl-c1">self</span>.verts: </td>
1323 </tr>
1324 <tr>
1325 <td id="L143" class="blob-num js-line-number" data-line-number="143"></td>
1326 <td id="LC143" class="blob-code blob-code-inner js-file-line"> v.tangent <span class="pl-k">=</span> v.tangent <span class="pl-k">-</span> v.normal<span class="pl-k">*</span>v.tangent.dot(v.normal)</td>
1327 </tr>
1328 <tr>
1329 <td id="L144" class="blob-num js-line-number" data-line-number="144"></td>
1330 <td id="LC144" class="blob-code blob-code-inner js-file-line"> v.tangent.normalize()</td>
1331 </tr>
1332 <tr>
1333 <td id="L145" class="blob-num js-line-number" data-line-number="145"></td>
1334 <td id="LC145" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> v.normal.cross(v.tangent).dot(v.bitangent) <span class="pl-k"><</span> <span class="pl-c1">0</span>:</td>
1335 </tr>
1336 <tr>
1337 <td id="L146" class="blob-num js-line-number" data-line-number="146"></td>
1338 <td id="LC146" class="blob-code blob-code-inner js-file-line"> v.bitangent <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1.0</span></td>
1339 </tr>
1340 <tr>
1341 <td id="L147" class="blob-num js-line-number" data-line-number="147"></td>
1342 <td id="LC147" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
1343 </tr>
1344 <tr>
1345 <td id="L148" class="blob-num js-line-number" data-line-number="148"></td>
1346 <td id="LC148" class="blob-code blob-code-inner js-file-line"> v.bitangent <span class="pl-k">=</span> <span class="pl-c1">1.0</span></td>
1347 </tr>
1348 <tr>
1349 <td id="L149" class="blob-num js-line-number" data-line-number="149"></td>
1350 <td id="LC149" class="blob-code blob-code-inner js-file-line"> </td>
1351 </tr>
1352 <tr>
1353 <td id="L150" class="blob-num js-line-number" data-line-number="150"></td>
1354 <td id="LC150" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">optimize</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>):</td>
1355 </tr>
1356 <tr>
1357 <td id="L151" class="blob-num js-line-number" data-line-number="151"></td>
1358 <td id="LC151" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"><span class="pl-c">#</span> Linear-speed vertex cache optimization algorithm by Tom Forsyth</span></td>
1359 </tr>
1360 <tr>
1361 <td id="L152" class="blob-num js-line-number" data-line-number="152"></td>
1362 <td id="LC152" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> <span class="pl-c1">self</span>.verts:</td>
1363 </tr>
1364 <tr>
1365 <td id="L153" class="blob-num js-line-number" data-line-number="153"></td>
1366 <td id="LC153" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> v:</td>
1367 </tr>
1368 <tr>
1369 <td id="L154" class="blob-num js-line-number" data-line-number="154"></td>
1370 <td id="LC154" class="blob-code blob-code-inner js-file-line"> v.index <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
1371 </tr>
1372 <tr>
1373 <td id="L155" class="blob-num js-line-number" data-line-number="155"></td>
1374 <td id="LC155" class="blob-code blob-code-inner js-file-line"> v.uses <span class="pl-k">=</span> []</td>
1375 </tr>
1376 <tr>
1377 <td id="L156" class="blob-num js-line-number" data-line-number="156"></td>
1378 <td id="LC156" class="blob-code blob-code-inner js-file-line"> v.cacherank <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
1379 </tr>
1380 <tr>
1381 <td id="L157" class="blob-num js-line-number" data-line-number="157"></td>
1382 <td id="LC157" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, (v0, v1, v2) <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(<span class="pl-c1">self</span>.tris):</td>
1383 </tr>
1384 <tr>
1385 <td id="L158" class="blob-num js-line-number" data-line-number="158"></td>
1386 <td id="LC158" class="blob-code blob-code-inner js-file-line"> v0.uses.append(i)</td>
1387 </tr>
1388 <tr>
1389 <td id="L159" class="blob-num js-line-number" data-line-number="159"></td>
1390 <td id="LC159" class="blob-code blob-code-inner js-file-line"> v1.uses.append(i)</td>
1391 </tr>
1392 <tr>
1393 <td id="L160" class="blob-num js-line-number" data-line-number="160"></td>
1394 <td id="LC160" class="blob-code blob-code-inner js-file-line"> v2.uses.append(i)</td>
1395 </tr>
1396 <tr>
1397 <td id="L161" class="blob-num js-line-number" data-line-number="161"></td>
1398 <td id="LC161" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> <span class="pl-c1">self</span>.verts:</td>
1399 </tr>
1400 <tr>
1401 <td id="L162" class="blob-num js-line-number" data-line-number="162"></td>
1402 <td id="LC162" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> v:</td>
1403 </tr>
1404 <tr>
1405 <td id="L163" class="blob-num js-line-number" data-line-number="163"></td>
1406 <td id="LC163" class="blob-code blob-code-inner js-file-line"> v.calcScore()</td>
1407 </tr>
1408 <tr>
1409 <td id="L164" class="blob-num js-line-number" data-line-number="164"></td>
1410 <td id="LC164" class="blob-code blob-code-inner js-file-line">
1411</td>
1412 </tr>
1413 <tr>
1414 <td id="L165" class="blob-num js-line-number" data-line-number="165"></td>
1415 <td id="LC165" class="blob-code blob-code-inner js-file-line"> besttri <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
1416 </tr>
1417 <tr>
1418 <td id="L166" class="blob-num js-line-number" data-line-number="166"></td>
1419 <td id="LC166" class="blob-code blob-code-inner js-file-line"> bestscore <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">42.0</span></td>
1420 </tr>
1421 <tr>
1422 <td id="L167" class="blob-num js-line-number" data-line-number="167"></td>
1423 <td id="LC167" class="blob-code blob-code-inner js-file-line"> scores <span class="pl-k">=</span> []</td>
1424 </tr>
1425 <tr>
1426 <td id="L168" class="blob-num js-line-number" data-line-number="168"></td>
1427 <td id="LC168" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, (v0, v1, v2) <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(<span class="pl-c1">self</span>.tris): </td>
1428 </tr>
1429 <tr>
1430 <td id="L169" class="blob-num js-line-number" data-line-number="169"></td>
1431 <td id="LC169" class="blob-code blob-code-inner js-file-line"> scores.append(v0.score <span class="pl-k">+</span> v1.score <span class="pl-k">+</span> v2.score)</td>
1432 </tr>
1433 <tr>
1434 <td id="L170" class="blob-num js-line-number" data-line-number="170"></td>
1435 <td id="LC170" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> scores[i] <span class="pl-k">></span> bestscore:</td>
1436 </tr>
1437 <tr>
1438 <td id="L171" class="blob-num js-line-number" data-line-number="171"></td>
1439 <td id="LC171" class="blob-code blob-code-inner js-file-line"> besttri <span class="pl-k">=</span> i</td>
1440 </tr>
1441 <tr>
1442 <td id="L172" class="blob-num js-line-number" data-line-number="172"></td>
1443 <td id="LC172" class="blob-code blob-code-inner js-file-line"> bestscore <span class="pl-k">=</span> scores[i]</td>
1444 </tr>
1445 <tr>
1446 <td id="L173" class="blob-num js-line-number" data-line-number="173"></td>
1447 <td id="LC173" class="blob-code blob-code-inner js-file-line">
1448</td>
1449 </tr>
1450 <tr>
1451 <td id="L174" class="blob-num js-line-number" data-line-number="174"></td>
1452 <td id="LC174" class="blob-code blob-code-inner js-file-line"> vertloads <span class="pl-k">=</span> <span class="pl-c1">0</span> <span class="pl-c"><span class="pl-c">#</span> debug info</span></td>
1453 </tr>
1454 <tr>
1455 <td id="L175" class="blob-num js-line-number" data-line-number="175"></td>
1456 <td id="LC175" class="blob-code blob-code-inner js-file-line"> vertschedule <span class="pl-k">=</span> []</td>
1457 </tr>
1458 <tr>
1459 <td id="L176" class="blob-num js-line-number" data-line-number="176"></td>
1460 <td id="LC176" class="blob-code blob-code-inner js-file-line"> trischedule <span class="pl-k">=</span> []</td>
1461 </tr>
1462 <tr>
1463 <td id="L177" class="blob-num js-line-number" data-line-number="177"></td>
1464 <td id="LC177" class="blob-code blob-code-inner js-file-line"> vcache <span class="pl-k">=</span> []</td>
1465 </tr>
1466 <tr>
1467 <td id="L178" class="blob-num js-line-number" data-line-number="178"></td>
1468 <td id="LC178" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">while</span> besttri <span class="pl-k">>=</span> <span class="pl-c1">0</span>:</td>
1469 </tr>
1470 <tr>
1471 <td id="L179" class="blob-num js-line-number" data-line-number="179"></td>
1472 <td id="LC179" class="blob-code blob-code-inner js-file-line"> tri <span class="pl-k">=</span> <span class="pl-c1">self</span>.tris[besttri]</td>
1473 </tr>
1474 <tr>
1475 <td id="L180" class="blob-num js-line-number" data-line-number="180"></td>
1476 <td id="LC180" class="blob-code blob-code-inner js-file-line"> scores[besttri] <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">666.0</span></td>
1477 </tr>
1478 <tr>
1479 <td id="L181" class="blob-num js-line-number" data-line-number="181"></td>
1480 <td id="LC181" class="blob-code blob-code-inner js-file-line"> trischedule.append(tri)</td>
1481 </tr>
1482 <tr>
1483 <td id="L182" class="blob-num js-line-number" data-line-number="182"></td>
1484 <td id="LC182" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> tri:</td>
1485 </tr>
1486 <tr>
1487 <td id="L183" class="blob-num js-line-number" data-line-number="183"></td>
1488 <td id="LC183" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> v.cacherank <span class="pl-k"><</span> <span class="pl-c1">0</span>: <span class="pl-c"><span class="pl-c">#</span> debug info</span></td>
1489 </tr>
1490 <tr>
1491 <td id="L184" class="blob-num js-line-number" data-line-number="184"></td>
1492 <td id="LC184" class="blob-code blob-code-inner js-file-line"> vertloads <span class="pl-k">+=</span> <span class="pl-c1">1</span> <span class="pl-c"><span class="pl-c">#</span> debug info</span></td>
1493 </tr>
1494 <tr>
1495 <td id="L185" class="blob-num js-line-number" data-line-number="185"></td>
1496 <td id="LC185" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> v.index <span class="pl-k"><</span> <span class="pl-c1">0</span>: </td>
1497 </tr>
1498 <tr>
1499 <td id="L186" class="blob-num js-line-number" data-line-number="186"></td>
1500 <td id="LC186" class="blob-code blob-code-inner js-file-line"> v.index <span class="pl-k">=</span> <span class="pl-c1">len</span>(vertschedule)</td>
1501 </tr>
1502 <tr>
1503 <td id="L187" class="blob-num js-line-number" data-line-number="187"></td>
1504 <td id="LC187" class="blob-code blob-code-inner js-file-line"> vertschedule.append(v)</td>
1505 </tr>
1506 <tr>
1507 <td id="L188" class="blob-num js-line-number" data-line-number="188"></td>
1508 <td id="LC188" class="blob-code blob-code-inner js-file-line"> v.uses.remove(besttri)</td>
1509 </tr>
1510 <tr>
1511 <td id="L189" class="blob-num js-line-number" data-line-number="189"></td>
1512 <td id="LC189" class="blob-code blob-code-inner js-file-line"> v.cacherank <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
1513 </tr>
1514 <tr>
1515 <td id="L190" class="blob-num js-line-number" data-line-number="190"></td>
1516 <td id="LC190" class="blob-code blob-code-inner js-file-line"> v.score <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1.0</span></td>
1517 </tr>
1518 <tr>
1519 <td id="L191" class="blob-num js-line-number" data-line-number="191"></td>
1520 <td id="LC191" class="blob-code blob-code-inner js-file-line"> vcache <span class="pl-k">=</span> [ v <span class="pl-k">for</span> v <span class="pl-k">in</span> tri <span class="pl-k">if</span> v.uses ] <span class="pl-k">+</span> [ v <span class="pl-k">for</span> v <span class="pl-k">in</span> vcache <span class="pl-k">if</span> v.cacherank <span class="pl-k">>=</span> <span class="pl-c1">0</span> ]</td>
1521 </tr>
1522 <tr>
1523 <td id="L192" class="blob-num js-line-number" data-line-number="192"></td>
1524 <td id="LC192" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, v <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(vcache):</td>
1525 </tr>
1526 <tr>
1527 <td id="L193" class="blob-num js-line-number" data-line-number="193"></td>
1528 <td id="LC193" class="blob-code blob-code-inner js-file-line"> v.cacherank <span class="pl-k">=</span> i </td>
1529 </tr>
1530 <tr>
1531 <td id="L194" class="blob-num js-line-number" data-line-number="194"></td>
1532 <td id="LC194" class="blob-code blob-code-inner js-file-line"> v.calcScore()</td>
1533 </tr>
1534 <tr>
1535 <td id="L195" class="blob-num js-line-number" data-line-number="195"></td>
1536 <td id="LC195" class="blob-code blob-code-inner js-file-line">
1537</td>
1538 </tr>
1539 <tr>
1540 <td id="L196" class="blob-num js-line-number" data-line-number="196"></td>
1541 <td id="LC196" class="blob-code blob-code-inner js-file-line"> besttri <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
1542 </tr>
1543 <tr>
1544 <td id="L197" class="blob-num js-line-number" data-line-number="197"></td>
1545 <td id="LC197" class="blob-code blob-code-inner js-file-line"> bestscore <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">42.0</span></td>
1546 </tr>
1547 <tr>
1548 <td id="L198" class="blob-num js-line-number" data-line-number="198"></td>
1549 <td id="LC198" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> vcache:</td>
1550 </tr>
1551 <tr>
1552 <td id="L199" class="blob-num js-line-number" data-line-number="199"></td>
1553 <td id="LC199" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i <span class="pl-k">in</span> v.uses:</td>
1554 </tr>
1555 <tr>
1556 <td id="L200" class="blob-num js-line-number" data-line-number="200"></td>
1557 <td id="LC200" class="blob-code blob-code-inner js-file-line"> v0, v1, v2 <span class="pl-k">=</span> <span class="pl-c1">self</span>.tris[i]</td>
1558 </tr>
1559 <tr>
1560 <td id="L201" class="blob-num js-line-number" data-line-number="201"></td>
1561 <td id="LC201" class="blob-code blob-code-inner js-file-line"> scores[i] <span class="pl-k">=</span> v0.score <span class="pl-k">+</span> v1.score <span class="pl-k">+</span> v2.score</td>
1562 </tr>
1563 <tr>
1564 <td id="L202" class="blob-num js-line-number" data-line-number="202"></td>
1565 <td id="LC202" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> scores[i] <span class="pl-k">></span> bestscore:</td>
1566 </tr>
1567 <tr>
1568 <td id="L203" class="blob-num js-line-number" data-line-number="203"></td>
1569 <td id="LC203" class="blob-code blob-code-inner js-file-line"> besttri <span class="pl-k">=</span> i</td>
1570 </tr>
1571 <tr>
1572 <td id="L204" class="blob-num js-line-number" data-line-number="204"></td>
1573 <td id="LC204" class="blob-code blob-code-inner js-file-line"> bestscore <span class="pl-k">=</span> scores[i]</td>
1574 </tr>
1575 <tr>
1576 <td id="L205" class="blob-num js-line-number" data-line-number="205"></td>
1577 <td id="LC205" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">while</span> <span class="pl-c1">len</span>(vcache) <span class="pl-k">></span> <span class="pl-c1">MAXVCACHE</span>:</td>
1578 </tr>
1579 <tr>
1580 <td id="L206" class="blob-num js-line-number" data-line-number="206"></td>
1581 <td id="LC206" class="blob-code blob-code-inner js-file-line"> vcache.pop().cacherank <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
1582 </tr>
1583 <tr>
1584 <td id="L207" class="blob-num js-line-number" data-line-number="207"></td>
1585 <td id="LC207" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> besttri <span class="pl-k"><</span> <span class="pl-c1">0</span>:</td>
1586 </tr>
1587 <tr>
1588 <td id="L208" class="blob-num js-line-number" data-line-number="208"></td>
1589 <td id="LC208" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, score <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(scores):</td>
1590 </tr>
1591 <tr>
1592 <td id="L209" class="blob-num js-line-number" data-line-number="209"></td>
1593 <td id="LC209" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> score <span class="pl-k">></span> bestscore:</td>
1594 </tr>
1595 <tr>
1596 <td id="L210" class="blob-num js-line-number" data-line-number="210"></td>
1597 <td id="LC210" class="blob-code blob-code-inner js-file-line"> besttri <span class="pl-k">=</span> i</td>
1598 </tr>
1599 <tr>
1600 <td id="L211" class="blob-num js-line-number" data-line-number="211"></td>
1601 <td id="LC211" class="blob-code blob-code-inner js-file-line"> bestscore <span class="pl-k">=</span> score</td>
1602 </tr>
1603 <tr>
1604 <td id="L212" class="blob-num js-line-number" data-line-number="212"></td>
1605 <td id="LC212" class="blob-code blob-code-inner js-file-line">
1606</td>
1607 </tr>
1608 <tr>
1609 <td id="L213" class="blob-num js-line-number" data-line-number="213"></td>
1610 <td id="LC213" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-c1">%s</span>: <span class="pl-c1">%d</span> verts optimized to <span class="pl-c1">%d</span>/<span class="pl-c1">%d</span> loads for <span class="pl-c1">%d</span> entry LRU cache<span class="pl-pds">'</span></span> <span class="pl-k">%</span> (<span class="pl-c1">self</span>.name, <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.verts), vertloads, <span class="pl-c1">len</span>(vertschedule), <span class="pl-c1">MAXVCACHE</span>))</td>
1611 </tr>
1612 <tr>
1613 <td id="L214" class="blob-num js-line-number" data-line-number="214"></td>
1614 <td id="LC214" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"><span class="pl-c">#</span>print('%s: %d verts scheduled to %d' % (self.name, len(self.verts), len(vertschedule)))</span></td>
1615 </tr>
1616 <tr>
1617 <td id="L215" class="blob-num js-line-number" data-line-number="215"></td>
1618 <td id="LC215" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.verts <span class="pl-k">=</span> vertschedule</td>
1619 </tr>
1620 <tr>
1621 <td id="L216" class="blob-num js-line-number" data-line-number="216"></td>
1622 <td id="LC216" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"><span class="pl-c">#</span> print('%s: %d tris scheduled to %d' % (self.name, len(self.tris), len(trischedule))) </span></td>
1623 </tr>
1624 <tr>
1625 <td id="L217" class="blob-num js-line-number" data-line-number="217"></td>
1626 <td id="LC217" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.tris <span class="pl-k">=</span> trischedule </td>
1627 </tr>
1628 <tr>
1629 <td id="L218" class="blob-num js-line-number" data-line-number="218"></td>
1630 <td id="LC218" class="blob-code blob-code-inner js-file-line">
1631</td>
1632 </tr>
1633 <tr>
1634 <td id="L219" class="blob-num js-line-number" data-line-number="219"></td>
1635 <td id="LC219" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">meshData</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">iqm</span>):</td>
1636 </tr>
1637 <tr>
1638 <td id="L220" class="blob-num js-line-number" data-line-number="220"></td>
1639 <td id="LC220" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> [ iqm.addText(<span class="pl-c1">self</span>.name), iqm.addText(<span class="pl-c1">self</span>.material), <span class="pl-c1">self</span>.firstvert, <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.verts), <span class="pl-c1">self</span>.firsttri, <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.tris) ]</td>
1640 </tr>
1641 <tr>
1642 <td id="L221" class="blob-num js-line-number" data-line-number="221"></td>
1643 <td id="LC221" class="blob-code blob-code-inner js-file-line">
1644</td>
1645 </tr>
1646 <tr>
1647 <td id="L222" class="blob-num js-line-number" data-line-number="222"></td>
1648 <td id="LC222" class="blob-code blob-code-inner js-file-line">
1649</td>
1650 </tr>
1651 <tr>
1652 <td id="L223" class="blob-num js-line-number" data-line-number="223"></td>
1653 <td id="LC223" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-en">Bone</span>:</td>
1654 </tr>
1655 <tr>
1656 <td id="L224" class="blob-num js-line-number" data-line-number="224"></td>
1657 <td id="LC224" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-c1">__init__</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">name</span>, <span class="pl-smi">origname</span>, <span class="pl-smi">index</span>, <span class="pl-smi">parent</span>, <span class="pl-smi">matrix</span>):</td>
1658 </tr>
1659 <tr>
1660 <td id="L225" class="blob-num js-line-number" data-line-number="225"></td>
1661 <td id="LC225" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.name <span class="pl-k">=</span> name</td>
1662 </tr>
1663 <tr>
1664 <td id="L226" class="blob-num js-line-number" data-line-number="226"></td>
1665 <td id="LC226" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.origname <span class="pl-k">=</span> origname</td>
1666 </tr>
1667 <tr>
1668 <td id="L227" class="blob-num js-line-number" data-line-number="227"></td>
1669 <td id="LC227" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.index <span class="pl-k">=</span> index</td>
1670 </tr>
1671 <tr>
1672 <td id="L228" class="blob-num js-line-number" data-line-number="228"></td>
1673 <td id="LC228" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.parent <span class="pl-k">=</span> parent</td>
1674 </tr>
1675 <tr>
1676 <td id="L229" class="blob-num js-line-number" data-line-number="229"></td>
1677 <td id="LC229" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.matrix <span class="pl-k">=</span> matrix</td>
1678 </tr>
1679 <tr>
1680 <td id="L230" class="blob-num js-line-number" data-line-number="230"></td>
1681 <td id="LC230" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.localmatrix <span class="pl-k">=</span> matrix</td>
1682 </tr>
1683 <tr>
1684 <td id="L231" class="blob-num js-line-number" data-line-number="231"></td>
1685 <td id="LC231" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.parent:</td>
1686 </tr>
1687 <tr>
1688 <td id="L232" class="blob-num js-line-number" data-line-number="232"></td>
1689 <td id="LC232" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.localmatrix <span class="pl-k">=</span> parent.matrix.inverted() <span class="pl-k">@</span> <span class="pl-c1">self</span>.localmatrix</td>
1690 </tr>
1691 <tr>
1692 <td id="L233" class="blob-num js-line-number" data-line-number="233"></td>
1693 <td id="LC233" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.numchannels <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
1694 </tr>
1695 <tr>
1696 <td id="L234" class="blob-num js-line-number" data-line-number="234"></td>
1697 <td id="LC234" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.channelmask <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
1698 </tr>
1699 <tr>
1700 <td id="L235" class="blob-num js-line-number" data-line-number="235"></td>
1701 <td id="LC235" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.channeloffsets <span class="pl-k">=</span> [ <span class="pl-c1">1.0e10</span>, <span class="pl-c1">1.0e10</span>, <span class="pl-c1">1.0e10</span>, <span class="pl-c1">1.0e10</span>, <span class="pl-c1">1.0e10</span>, <span class="pl-c1">1.0e10</span>, <span class="pl-c1">1.0e10</span>, <span class="pl-c1">1.0e10</span>, <span class="pl-c1">1.0e10</span>, <span class="pl-c1">1.0e10</span> ]</td>
1702 </tr>
1703 <tr>
1704 <td id="L236" class="blob-num js-line-number" data-line-number="236"></td>
1705 <td id="LC236" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.channelscales <span class="pl-k">=</span> [ <span class="pl-k">-</span><span class="pl-c1">1.0e10</span>, <span class="pl-k">-</span><span class="pl-c1">1.0e10</span>, <span class="pl-k">-</span><span class="pl-c1">1.0e10</span>, <span class="pl-k">-</span><span class="pl-c1">1.0e10</span>, <span class="pl-k">-</span><span class="pl-c1">1.0e10</span>, <span class="pl-k">-</span><span class="pl-c1">1.0e10</span>, <span class="pl-k">-</span><span class="pl-c1">1.0e10</span>, <span class="pl-k">-</span><span class="pl-c1">1.0e10</span>, <span class="pl-k">-</span><span class="pl-c1">1.0e10</span>, <span class="pl-k">-</span><span class="pl-c1">1.0e10</span> ]</td>
1706 </tr>
1707 <tr>
1708 <td id="L237" class="blob-num js-line-number" data-line-number="237"></td>
1709 <td id="LC237" class="blob-code blob-code-inner js-file-line">
1710</td>
1711 </tr>
1712 <tr>
1713 <td id="L238" class="blob-num js-line-number" data-line-number="238"></td>
1714 <td id="LC238" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">jointData</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">iqm</span>):</td>
1715 </tr>
1716 <tr>
1717 <td id="L239" class="blob-num js-line-number" data-line-number="239"></td>
1718 <td id="LC239" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.parent:</td>
1719 </tr>
1720 <tr>
1721 <td id="L240" class="blob-num js-line-number" data-line-number="240"></td>
1722 <td id="LC240" class="blob-code blob-code-inner js-file-line"> parent <span class="pl-k">=</span> <span class="pl-c1">self</span>.parent.index</td>
1723 </tr>
1724 <tr>
1725 <td id="L241" class="blob-num js-line-number" data-line-number="241"></td>
1726 <td id="LC241" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
1727 </tr>
1728 <tr>
1729 <td id="L242" class="blob-num js-line-number" data-line-number="242"></td>
1730 <td id="LC242" class="blob-code blob-code-inner js-file-line"> parent <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
1731 </tr>
1732 <tr>
1733 <td id="L243" class="blob-num js-line-number" data-line-number="243"></td>
1734 <td id="LC243" class="blob-code blob-code-inner js-file-line"> pos <span class="pl-k">=</span> <span class="pl-c1">self</span>.localmatrix.to_translation()</td>
1735 </tr>
1736 <tr>
1737 <td id="L244" class="blob-num js-line-number" data-line-number="244"></td>
1738 <td id="LC244" class="blob-code blob-code-inner js-file-line"> orient <span class="pl-k">=</span> <span class="pl-c1">self</span>.localmatrix.to_quaternion()</td>
1739 </tr>
1740 <tr>
1741 <td id="L245" class="blob-num js-line-number" data-line-number="245"></td>
1742 <td id="LC245" class="blob-code blob-code-inner js-file-line"> orient.normalize()</td>
1743 </tr>
1744 <tr>
1745 <td id="L246" class="blob-num js-line-number" data-line-number="246"></td>
1746 <td id="LC246" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> orient.w <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
1747 </tr>
1748 <tr>
1749 <td id="L247" class="blob-num js-line-number" data-line-number="247"></td>
1750 <td id="LC247" class="blob-code blob-code-inner js-file-line"> orient.negate()</td>
1751 </tr>
1752 <tr>
1753 <td id="L248" class="blob-num js-line-number" data-line-number="248"></td>
1754 <td id="LC248" class="blob-code blob-code-inner js-file-line"> scale <span class="pl-k">=</span> <span class="pl-c1">self</span>.localmatrix.to_scale()</td>
1755 </tr>
1756 <tr>
1757 <td id="L249" class="blob-num js-line-number" data-line-number="249"></td>
1758 <td id="LC249" class="blob-code blob-code-inner js-file-line"> scale.x <span class="pl-k">=</span> <span class="pl-c1">round</span>(scale.x<span class="pl-k">*</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span>)<span class="pl-k">/</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span></td>
1759 </tr>
1760 <tr>
1761 <td id="L250" class="blob-num js-line-number" data-line-number="250"></td>
1762 <td id="LC250" class="blob-code blob-code-inner js-file-line"> scale.y <span class="pl-k">=</span> <span class="pl-c1">round</span>(scale.y<span class="pl-k">*</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span>)<span class="pl-k">/</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span></td>
1763 </tr>
1764 <tr>
1765 <td id="L251" class="blob-num js-line-number" data-line-number="251"></td>
1766 <td id="LC251" class="blob-code blob-code-inner js-file-line"> scale.z <span class="pl-k">=</span> <span class="pl-c1">round</span>(scale.z<span class="pl-k">*</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span>)<span class="pl-k">/</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span></td>
1767 </tr>
1768 <tr>
1769 <td id="L252" class="blob-num js-line-number" data-line-number="252"></td>
1770 <td id="LC252" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> [ iqm.addText(<span class="pl-c1">self</span>.name), parent, pos.x, pos.y, pos.z, orient.x, orient.y, orient.z, orient.w, scale.x, scale.y, scale.z ]</td>
1771 </tr>
1772 <tr>
1773 <td id="L253" class="blob-num js-line-number" data-line-number="253"></td>
1774 <td id="LC253" class="blob-code blob-code-inner js-file-line"> </td>
1775 </tr>
1776 <tr>
1777 <td id="L254" class="blob-num js-line-number" data-line-number="254"></td>
1778 <td id="LC254" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">poseData</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">iqm</span>):</td>
1779 </tr>
1780 <tr>
1781 <td id="L255" class="blob-num js-line-number" data-line-number="255"></td>
1782 <td id="LC255" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.parent:</td>
1783 </tr>
1784 <tr>
1785 <td id="L256" class="blob-num js-line-number" data-line-number="256"></td>
1786 <td id="LC256" class="blob-code blob-code-inner js-file-line"> parent <span class="pl-k">=</span> <span class="pl-c1">self</span>.parent.index</td>
1787 </tr>
1788 <tr>
1789 <td id="L257" class="blob-num js-line-number" data-line-number="257"></td>
1790 <td id="LC257" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
1791 </tr>
1792 <tr>
1793 <td id="L258" class="blob-num js-line-number" data-line-number="258"></td>
1794 <td id="LC258" class="blob-code blob-code-inner js-file-line"> parent <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
1795 </tr>
1796 <tr>
1797 <td id="L259" class="blob-num js-line-number" data-line-number="259"></td>
1798 <td id="LC259" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> [ parent, <span class="pl-c1">self</span>.channelmask ] <span class="pl-k">+</span> <span class="pl-c1">self</span>.channeloffsets <span class="pl-k">+</span> <span class="pl-c1">self</span>.channelscales</td>
1799 </tr>
1800 <tr>
1801 <td id="L260" class="blob-num js-line-number" data-line-number="260"></td>
1802 <td id="LC260" class="blob-code blob-code-inner js-file-line">
1803</td>
1804 </tr>
1805 <tr>
1806 <td id="L261" class="blob-num js-line-number" data-line-number="261"></td>
1807 <td id="LC261" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">calcChannelMask</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>):</td>
1808 </tr>
1809 <tr>
1810 <td id="L262" class="blob-num js-line-number" data-line-number="262"></td>
1811 <td id="LC262" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i <span class="pl-k">in</span> <span class="pl-c1">range</span>(<span class="pl-c1">0</span>, <span class="pl-c1">10</span>):</td>
1812 </tr>
1813 <tr>
1814 <td id="L263" class="blob-num js-line-number" data-line-number="263"></td>
1815 <td id="LC263" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.channelscales[i] <span class="pl-k">-=</span> <span class="pl-c1">self</span>.channeloffsets[i]</td>
1816 </tr>
1817 <tr>
1818 <td id="L264" class="blob-num js-line-number" data-line-number="264"></td>
1819 <td id="LC264" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.channelscales[i] <span class="pl-k">>=</span> <span class="pl-c1">1.0e-10</span>:</td>
1820 </tr>
1821 <tr>
1822 <td id="L265" class="blob-num js-line-number" data-line-number="265"></td>
1823 <td id="LC265" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.numchannels <span class="pl-k">+=</span> <span class="pl-c1">1</span></td>
1824 </tr>
1825 <tr>
1826 <td id="L266" class="blob-num js-line-number" data-line-number="266"></td>
1827 <td id="LC266" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.channelmask <span class="pl-k">|=</span> <span class="pl-c1">1</span> <span class="pl-k"><<</span> i</td>
1828 </tr>
1829 <tr>
1830 <td id="L267" class="blob-num js-line-number" data-line-number="267"></td>
1831 <td id="LC267" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.channelscales[i] <span class="pl-k">/=</span> <span class="pl-c1"><span class="pl-k">0x</span>FFFF</span></td>
1832 </tr>
1833 <tr>
1834 <td id="L268" class="blob-num js-line-number" data-line-number="268"></td>
1835 <td id="LC268" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
1836 </tr>
1837 <tr>
1838 <td id="L269" class="blob-num js-line-number" data-line-number="269"></td>
1839 <td id="LC269" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.channelscales[i] <span class="pl-k">=</span> <span class="pl-c1">0.0</span></td>
1840 </tr>
1841 <tr>
1842 <td id="L270" class="blob-num js-line-number" data-line-number="270"></td>
1843 <td id="LC270" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-c1">self</span>.numchannels </td>
1844 </tr>
1845 <tr>
1846 <td id="L271" class="blob-num js-line-number" data-line-number="271"></td>
1847 <td id="LC271" class="blob-code blob-code-inner js-file-line">
1848</td>
1849 </tr>
1850 <tr>
1851 <td id="L272" class="blob-num js-line-number" data-line-number="272"></td>
1852 <td id="LC272" class="blob-code blob-code-inner js-file-line">
1853</td>
1854 </tr>
1855 <tr>
1856 <td id="L273" class="blob-num js-line-number" data-line-number="273"></td>
1857 <td id="LC273" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-en">Animation</span>:</td>
1858 </tr>
1859 <tr>
1860 <td id="L274" class="blob-num js-line-number" data-line-number="274"></td>
1861 <td id="LC274" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-c1">__init__</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">name</span>, <span class="pl-smi">frames</span>, <span class="pl-smi">fps</span> <span class="pl-k">=</span> <span class="pl-c1">0.0</span>, <span class="pl-smi">flags</span> <span class="pl-k">=</span> <span class="pl-c1">0</span>):</td>
1862 </tr>
1863 <tr>
1864 <td id="L275" class="blob-num js-line-number" data-line-number="275"></td>
1865 <td id="LC275" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.name <span class="pl-k">=</span> name</td>
1866 </tr>
1867 <tr>
1868 <td id="L276" class="blob-num js-line-number" data-line-number="276"></td>
1869 <td id="LC276" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.frames <span class="pl-k">=</span> frames</td>
1870 </tr>
1871 <tr>
1872 <td id="L277" class="blob-num js-line-number" data-line-number="277"></td>
1873 <td id="LC277" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.fps <span class="pl-k">=</span> fps</td>
1874 </tr>
1875 <tr>
1876 <td id="L278" class="blob-num js-line-number" data-line-number="278"></td>
1877 <td id="LC278" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.flags <span class="pl-k">=</span> flags</td>
1878 </tr>
1879 <tr>
1880 <td id="L279" class="blob-num js-line-number" data-line-number="279"></td>
1881 <td id="LC279" class="blob-code blob-code-inner js-file-line">
1882</td>
1883 </tr>
1884 <tr>
1885 <td id="L280" class="blob-num js-line-number" data-line-number="280"></td>
1886 <td id="LC280" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">calcFrameLimits</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">bones</span>):</td>
1887 </tr>
1888 <tr>
1889 <td id="L281" class="blob-num js-line-number" data-line-number="281"></td>
1890 <td id="LC281" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> frame <span class="pl-k">in</span> <span class="pl-c1">self</span>.frames:</td>
1891 </tr>
1892 <tr>
1893 <td id="L282" class="blob-num js-line-number" data-line-number="282"></td>
1894 <td id="LC282" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, bone <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(bones):</td>
1895 </tr>
1896 <tr>
1897 <td id="L283" class="blob-num js-line-number" data-line-number="283"></td>
1898 <td id="LC283" class="blob-code blob-code-inner js-file-line"> loc, quat, scale, mat <span class="pl-k">=</span> frame[i]</td>
1899 </tr>
1900 <tr>
1901 <td id="L284" class="blob-num js-line-number" data-line-number="284"></td>
1902 <td id="LC284" class="blob-code blob-code-inner js-file-line"> bone.channeloffsets[<span class="pl-c1">0</span>] <span class="pl-k">=</span> <span class="pl-c1">min</span>(bone.channeloffsets[<span class="pl-c1">0</span>], loc.x)</td>
1903 </tr>
1904 <tr>
1905 <td id="L285" class="blob-num js-line-number" data-line-number="285"></td>
1906 <td id="LC285" class="blob-code blob-code-inner js-file-line"> bone.channeloffsets[<span class="pl-c1">1</span>] <span class="pl-k">=</span> <span class="pl-c1">min</span>(bone.channeloffsets[<span class="pl-c1">1</span>], loc.y)</td>
1907 </tr>
1908 <tr>
1909 <td id="L286" class="blob-num js-line-number" data-line-number="286"></td>
1910 <td id="LC286" class="blob-code blob-code-inner js-file-line"> bone.channeloffsets[<span class="pl-c1">2</span>] <span class="pl-k">=</span> <span class="pl-c1">min</span>(bone.channeloffsets[<span class="pl-c1">2</span>], loc.z)</td>
1911 </tr>
1912 <tr>
1913 <td id="L287" class="blob-num js-line-number" data-line-number="287"></td>
1914 <td id="LC287" class="blob-code blob-code-inner js-file-line"> bone.channeloffsets[<span class="pl-c1">3</span>] <span class="pl-k">=</span> <span class="pl-c1">min</span>(bone.channeloffsets[<span class="pl-c1">3</span>], quat.x)</td>
1915 </tr>
1916 <tr>
1917 <td id="L288" class="blob-num js-line-number" data-line-number="288"></td>
1918 <td id="LC288" class="blob-code blob-code-inner js-file-line"> bone.channeloffsets[<span class="pl-c1">4</span>] <span class="pl-k">=</span> <span class="pl-c1">min</span>(bone.channeloffsets[<span class="pl-c1">4</span>], quat.y)</td>
1919 </tr>
1920 <tr>
1921 <td id="L289" class="blob-num js-line-number" data-line-number="289"></td>
1922 <td id="LC289" class="blob-code blob-code-inner js-file-line"> bone.channeloffsets[<span class="pl-c1">5</span>] <span class="pl-k">=</span> <span class="pl-c1">min</span>(bone.channeloffsets[<span class="pl-c1">5</span>], quat.z)</td>
1923 </tr>
1924 <tr>
1925 <td id="L290" class="blob-num js-line-number" data-line-number="290"></td>
1926 <td id="LC290" class="blob-code blob-code-inner js-file-line"> bone.channeloffsets[<span class="pl-c1">6</span>] <span class="pl-k">=</span> <span class="pl-c1">min</span>(bone.channeloffsets[<span class="pl-c1">6</span>], quat.w)</td>
1927 </tr>
1928 <tr>
1929 <td id="L291" class="blob-num js-line-number" data-line-number="291"></td>
1930 <td id="LC291" class="blob-code blob-code-inner js-file-line"> bone.channeloffsets[<span class="pl-c1">7</span>] <span class="pl-k">=</span> <span class="pl-c1">min</span>(bone.channeloffsets[<span class="pl-c1">7</span>], scale.x)</td>
1931 </tr>
1932 <tr>
1933 <td id="L292" class="blob-num js-line-number" data-line-number="292"></td>
1934 <td id="LC292" class="blob-code blob-code-inner js-file-line"> bone.channeloffsets[<span class="pl-c1">8</span>] <span class="pl-k">=</span> <span class="pl-c1">min</span>(bone.channeloffsets[<span class="pl-c1">8</span>], scale.y)</td>
1935 </tr>
1936 <tr>
1937 <td id="L293" class="blob-num js-line-number" data-line-number="293"></td>
1938 <td id="LC293" class="blob-code blob-code-inner js-file-line"> bone.channeloffsets[<span class="pl-c1">9</span>] <span class="pl-k">=</span> <span class="pl-c1">min</span>(bone.channeloffsets[<span class="pl-c1">9</span>], scale.z)</td>
1939 </tr>
1940 <tr>
1941 <td id="L294" class="blob-num js-line-number" data-line-number="294"></td>
1942 <td id="LC294" class="blob-code blob-code-inner js-file-line"> bone.channelscales[<span class="pl-c1">0</span>] <span class="pl-k">=</span> <span class="pl-c1">max</span>(bone.channelscales[<span class="pl-c1">0</span>], loc.x)</td>
1943 </tr>
1944 <tr>
1945 <td id="L295" class="blob-num js-line-number" data-line-number="295"></td>
1946 <td id="LC295" class="blob-code blob-code-inner js-file-line"> bone.channelscales[<span class="pl-c1">1</span>] <span class="pl-k">=</span> <span class="pl-c1">max</span>(bone.channelscales[<span class="pl-c1">1</span>], loc.y)</td>
1947 </tr>
1948 <tr>
1949 <td id="L296" class="blob-num js-line-number" data-line-number="296"></td>
1950 <td id="LC296" class="blob-code blob-code-inner js-file-line"> bone.channelscales[<span class="pl-c1">2</span>] <span class="pl-k">=</span> <span class="pl-c1">max</span>(bone.channelscales[<span class="pl-c1">2</span>], loc.z)</td>
1951 </tr>
1952 <tr>
1953 <td id="L297" class="blob-num js-line-number" data-line-number="297"></td>
1954 <td id="LC297" class="blob-code blob-code-inner js-file-line"> bone.channelscales[<span class="pl-c1">3</span>] <span class="pl-k">=</span> <span class="pl-c1">max</span>(bone.channelscales[<span class="pl-c1">3</span>], quat.x)</td>
1955 </tr>
1956 <tr>
1957 <td id="L298" class="blob-num js-line-number" data-line-number="298"></td>
1958 <td id="LC298" class="blob-code blob-code-inner js-file-line"> bone.channelscales[<span class="pl-c1">4</span>] <span class="pl-k">=</span> <span class="pl-c1">max</span>(bone.channelscales[<span class="pl-c1">4</span>], quat.y)</td>
1959 </tr>
1960 <tr>
1961 <td id="L299" class="blob-num js-line-number" data-line-number="299"></td>
1962 <td id="LC299" class="blob-code blob-code-inner js-file-line"> bone.channelscales[<span class="pl-c1">5</span>] <span class="pl-k">=</span> <span class="pl-c1">max</span>(bone.channelscales[<span class="pl-c1">5</span>], quat.z)</td>
1963 </tr>
1964 <tr>
1965 <td id="L300" class="blob-num js-line-number" data-line-number="300"></td>
1966 <td id="LC300" class="blob-code blob-code-inner js-file-line"> bone.channelscales[<span class="pl-c1">6</span>] <span class="pl-k">=</span> <span class="pl-c1">max</span>(bone.channelscales[<span class="pl-c1">6</span>], quat.w)</td>
1967 </tr>
1968 <tr>
1969 <td id="L301" class="blob-num js-line-number" data-line-number="301"></td>
1970 <td id="LC301" class="blob-code blob-code-inner js-file-line"> bone.channelscales[<span class="pl-c1">7</span>] <span class="pl-k">=</span> <span class="pl-c1">max</span>(bone.channelscales[<span class="pl-c1">7</span>], scale.x)</td>
1971 </tr>
1972 <tr>
1973 <td id="L302" class="blob-num js-line-number" data-line-number="302"></td>
1974 <td id="LC302" class="blob-code blob-code-inner js-file-line"> bone.channelscales[<span class="pl-c1">8</span>] <span class="pl-k">=</span> <span class="pl-c1">max</span>(bone.channelscales[<span class="pl-c1">8</span>], scale.y)</td>
1975 </tr>
1976 <tr>
1977 <td id="L303" class="blob-num js-line-number" data-line-number="303"></td>
1978 <td id="LC303" class="blob-code blob-code-inner js-file-line"> bone.channelscales[<span class="pl-c1">9</span>] <span class="pl-k">=</span> <span class="pl-c1">max</span>(bone.channelscales[<span class="pl-c1">9</span>], scale.z)</td>
1979 </tr>
1980 <tr>
1981 <td id="L304" class="blob-num js-line-number" data-line-number="304"></td>
1982 <td id="LC304" class="blob-code blob-code-inner js-file-line">
1983</td>
1984 </tr>
1985 <tr>
1986 <td id="L305" class="blob-num js-line-number" data-line-number="305"></td>
1987 <td id="LC305" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">animData</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">iqm</span>):</td>
1988 </tr>
1989 <tr>
1990 <td id="L306" class="blob-num js-line-number" data-line-number="306"></td>
1991 <td id="LC306" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> [ iqm.addText(<span class="pl-c1">self</span>.name), <span class="pl-c1">self</span>.firstframe, <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.frames), <span class="pl-c1">self</span>.fps, <span class="pl-c1">self</span>.flags ]</td>
1992 </tr>
1993 <tr>
1994 <td id="L307" class="blob-num js-line-number" data-line-number="307"></td>
1995 <td id="LC307" class="blob-code blob-code-inner js-file-line">
1996</td>
1997 </tr>
1998 <tr>
1999 <td id="L308" class="blob-num js-line-number" data-line-number="308"></td>
2000 <td id="LC308" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">frameData</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">bones</span>): </td>
2001 </tr>
2002 <tr>
2003 <td id="L309" class="blob-num js-line-number" data-line-number="309"></td>
2004 <td id="LC309" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">=</span> <span class="pl-s"><span class="pl-k">b</span><span class="pl-pds">'</span><span class="pl-pds">'</span></span></td>
2005 </tr>
2006 <tr>
2007 <td id="L310" class="blob-num js-line-number" data-line-number="310"></td>
2008 <td id="LC310" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> frame <span class="pl-k">in</span> <span class="pl-c1">self</span>.frames:</td>
2009 </tr>
2010 <tr>
2011 <td id="L311" class="blob-num js-line-number" data-line-number="311"></td>
2012 <td id="LC311" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, bone <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(bones):</td>
2013 </tr>
2014 <tr>
2015 <td id="L312" class="blob-num js-line-number" data-line-number="312"></td>
2016 <td id="LC312" class="blob-code blob-code-inner js-file-line"> loc, quat, scale, mat <span class="pl-k">=</span> frame[i]</td>
2017 </tr>
2018 <tr>
2019 <td id="L313" class="blob-num js-line-number" data-line-number="313"></td>
2020 <td id="LC313" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> (bone.channelmask<span class="pl-k">&</span><span class="pl-c1"><span class="pl-k">0x</span>7F</span>) <span class="pl-k">==</span> <span class="pl-c1"><span class="pl-k">0x</span>7F</span>:</td>
2021 </tr>
2022 <tr>
2023 <td id="L314" class="blob-num js-line-number" data-line-number="314"></td>
2024 <td id="LC314" class="blob-code blob-code-inner js-file-line"> lx <span class="pl-k">=</span> <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((loc.x <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">0</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">0</span>]))</td>
2025 </tr>
2026 <tr>
2027 <td id="L315" class="blob-num js-line-number" data-line-number="315"></td>
2028 <td id="LC315" class="blob-code blob-code-inner js-file-line"> ly <span class="pl-k">=</span> <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((loc.y <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">1</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">1</span>]))</td>
2029 </tr>
2030 <tr>
2031 <td id="L316" class="blob-num js-line-number" data-line-number="316"></td>
2032 <td id="LC316" class="blob-code blob-code-inner js-file-line"> lz <span class="pl-k">=</span> <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((loc.z <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">2</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">2</span>]))</td>
2033 </tr>
2034 <tr>
2035 <td id="L317" class="blob-num js-line-number" data-line-number="317"></td>
2036 <td id="LC317" class="blob-code blob-code-inner js-file-line"> qx <span class="pl-k">=</span> <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((quat.x <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">3</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">3</span>]))</td>
2037 </tr>
2038 <tr>
2039 <td id="L318" class="blob-num js-line-number" data-line-number="318"></td>
2040 <td id="LC318" class="blob-code blob-code-inner js-file-line"> qy <span class="pl-k">=</span> <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((quat.y <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">4</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">4</span>]))</td>
2041 </tr>
2042 <tr>
2043 <td id="L319" class="blob-num js-line-number" data-line-number="319"></td>
2044 <td id="LC319" class="blob-code blob-code-inner js-file-line"> qz <span class="pl-k">=</span> <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((quat.z <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">5</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">5</span>]))</td>
2045 </tr>
2046 <tr>
2047 <td id="L320" class="blob-num js-line-number" data-line-number="320"></td>
2048 <td id="LC320" class="blob-code blob-code-inner js-file-line"> qw <span class="pl-k">=</span> <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((quat.w <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">6</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">6</span>]))</td>
2049 </tr>
2050 <tr>
2051 <td id="L321" class="blob-num js-line-number" data-line-number="321"></td>
2052 <td id="LC321" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><7H<span class="pl-pds">'</span></span>, lx, ly, lz, qx, qy, qz, qw)</td>
2053 </tr>
2054 <tr>
2055 <td id="L322" class="blob-num js-line-number" data-line-number="322"></td>
2056 <td id="LC322" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
2057 </tr>
2058 <tr>
2059 <td id="L323" class="blob-num js-line-number" data-line-number="323"></td>
2060 <td id="LC323" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.channelmask <span class="pl-k">&</span> <span class="pl-c1">1</span>:</td>
2061 </tr>
2062 <tr>
2063 <td id="L324" class="blob-num js-line-number" data-line-number="324"></td>
2064 <td id="LC324" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((loc.x <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">0</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">0</span>])))</td>
2065 </tr>
2066 <tr>
2067 <td id="L325" class="blob-num js-line-number" data-line-number="325"></td>
2068 <td id="LC325" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.channelmask <span class="pl-k">&</span> <span class="pl-c1">2</span>:</td>
2069 </tr>
2070 <tr>
2071 <td id="L326" class="blob-num js-line-number" data-line-number="326"></td>
2072 <td id="LC326" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((loc.y <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">1</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">1</span>])))</td>
2073 </tr>
2074 <tr>
2075 <td id="L327" class="blob-num js-line-number" data-line-number="327"></td>
2076 <td id="LC327" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.channelmask <span class="pl-k">&</span> <span class="pl-c1">4</span>:</td>
2077 </tr>
2078 <tr>
2079 <td id="L328" class="blob-num js-line-number" data-line-number="328"></td>
2080 <td id="LC328" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((loc.z <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">2</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">2</span>])))</td>
2081 </tr>
2082 <tr>
2083 <td id="L329" class="blob-num js-line-number" data-line-number="329"></td>
2084 <td id="LC329" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.channelmask <span class="pl-k">&</span> <span class="pl-c1">8</span>:</td>
2085 </tr>
2086 <tr>
2087 <td id="L330" class="blob-num js-line-number" data-line-number="330"></td>
2088 <td id="LC330" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((quat.x <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">3</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">3</span>])))</td>
2089 </tr>
2090 <tr>
2091 <td id="L331" class="blob-num js-line-number" data-line-number="331"></td>
2092 <td id="LC331" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.channelmask <span class="pl-k">&</span> <span class="pl-c1">16</span>:</td>
2093 </tr>
2094 <tr>
2095 <td id="L332" class="blob-num js-line-number" data-line-number="332"></td>
2096 <td id="LC332" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((quat.y <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">4</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">4</span>])))</td>
2097 </tr>
2098 <tr>
2099 <td id="L333" class="blob-num js-line-number" data-line-number="333"></td>
2100 <td id="LC333" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.channelmask <span class="pl-k">&</span> <span class="pl-c1">32</span>:</td>
2101 </tr>
2102 <tr>
2103 <td id="L334" class="blob-num js-line-number" data-line-number="334"></td>
2104 <td id="LC334" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((quat.z <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">5</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">5</span>])))</td>
2105 </tr>
2106 <tr>
2107 <td id="L335" class="blob-num js-line-number" data-line-number="335"></td>
2108 <td id="LC335" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.channelmask <span class="pl-k">&</span> <span class="pl-c1">64</span>:</td>
2109 </tr>
2110 <tr>
2111 <td id="L336" class="blob-num js-line-number" data-line-number="336"></td>
2112 <td id="LC336" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((quat.w <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">6</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">6</span>])))</td>
2113 </tr>
2114 <tr>
2115 <td id="L337" class="blob-num js-line-number" data-line-number="337"></td>
2116 <td id="LC337" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.channelmask <span class="pl-k">&</span> <span class="pl-c1">128</span>:</td>
2117 </tr>
2118 <tr>
2119 <td id="L338" class="blob-num js-line-number" data-line-number="338"></td>
2120 <td id="LC338" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((scale.x <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">7</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">7</span>])))</td>
2121 </tr>
2122 <tr>
2123 <td id="L339" class="blob-num js-line-number" data-line-number="339"></td>
2124 <td id="LC339" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.channelmask <span class="pl-k">&</span> <span class="pl-c1">256</span>:</td>
2125 </tr>
2126 <tr>
2127 <td id="L340" class="blob-num js-line-number" data-line-number="340"></td>
2128 <td id="LC340" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((scale.y <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">8</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">8</span>])))</td>
2129 </tr>
2130 <tr>
2131 <td id="L341" class="blob-num js-line-number" data-line-number="341"></td>
2132 <td id="LC341" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.channelmask <span class="pl-k">&</span> <span class="pl-c1">512</span>:</td>
2133 </tr>
2134 <tr>
2135 <td id="L342" class="blob-num js-line-number" data-line-number="342"></td>
2136 <td id="LC342" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> struct.pack(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>((scale.z <span class="pl-k">-</span> bone.channeloffsets[<span class="pl-c1">9</span>]) <span class="pl-k">/</span> bone.channelscales[<span class="pl-c1">9</span>])))</td>
2137 </tr>
2138 <tr>
2139 <td id="L343" class="blob-num js-line-number" data-line-number="343"></td>
2140 <td id="LC343" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> data</td>
2141 </tr>
2142 <tr>
2143 <td id="L344" class="blob-num js-line-number" data-line-number="344"></td>
2144 <td id="LC344" class="blob-code blob-code-inner js-file-line">
2145</td>
2146 </tr>
2147 <tr>
2148 <td id="L345" class="blob-num js-line-number" data-line-number="345"></td>
2149 <td id="LC345" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">frameBoundsData</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">bones</span>, <span class="pl-smi">meshes</span>, <span class="pl-smi">frame</span>, <span class="pl-smi">invbase</span>):</td>
2150 </tr>
2151 <tr>
2152 <td id="L346" class="blob-num js-line-number" data-line-number="346"></td>
2153 <td id="LC346" class="blob-code blob-code-inner js-file-line"> bbmin <span class="pl-k">=</span> bbmax <span class="pl-k">=</span> <span class="pl-c1">None</span></td>
2154 </tr>
2155 <tr>
2156 <td id="L347" class="blob-num js-line-number" data-line-number="347"></td>
2157 <td id="LC347" class="blob-code blob-code-inner js-file-line"> xyradius <span class="pl-k">=</span> <span class="pl-c1">0.0</span></td>
2158 </tr>
2159 <tr>
2160 <td id="L348" class="blob-num js-line-number" data-line-number="348"></td>
2161 <td id="LC348" class="blob-code blob-code-inner js-file-line"> radius <span class="pl-k">=</span> <span class="pl-c1">0.0</span></td>
2162 </tr>
2163 <tr>
2164 <td id="L349" class="blob-num js-line-number" data-line-number="349"></td>
2165 <td id="LC349" class="blob-code blob-code-inner js-file-line"> transforms <span class="pl-k">=</span> []</td>
2166 </tr>
2167 <tr>
2168 <td id="L350" class="blob-num js-line-number" data-line-number="350"></td>
2169 <td id="LC350" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, bone <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(bones):</td>
2170 </tr>
2171 <tr>
2172 <td id="L351" class="blob-num js-line-number" data-line-number="351"></td>
2173 <td id="LC351" class="blob-code blob-code-inner js-file-line"> loc, quat, scale, mat <span class="pl-k">=</span> frame[i]</td>
2174 </tr>
2175 <tr>
2176 <td id="L352" class="blob-num js-line-number" data-line-number="352"></td>
2177 <td id="LC352" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.parent:</td>
2178 </tr>
2179 <tr>
2180 <td id="L353" class="blob-num js-line-number" data-line-number="353"></td>
2181 <td id="LC353" class="blob-code blob-code-inner js-file-line"> mat <span class="pl-k">=</span> transforms[bone.parent.index] <span class="pl-k">@</span> mat</td>
2182 </tr>
2183 <tr>
2184 <td id="L354" class="blob-num js-line-number" data-line-number="354"></td>
2185 <td id="LC354" class="blob-code blob-code-inner js-file-line"> transforms.append(mat)</td>
2186 </tr>
2187 <tr>
2188 <td id="L355" class="blob-num js-line-number" data-line-number="355"></td>
2189 <td id="LC355" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, mat <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(transforms):</td>
2190 </tr>
2191 <tr>
2192 <td id="L356" class="blob-num js-line-number" data-line-number="356"></td>
2193 <td id="LC356" class="blob-code blob-code-inner js-file-line"> transforms[i] <span class="pl-k">=</span> mat <span class="pl-k">@</span> invbase[i]</td>
2194 </tr>
2195 <tr>
2196 <td id="L357" class="blob-num js-line-number" data-line-number="357"></td>
2197 <td id="LC357" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> meshes:</td>
2198 </tr>
2199 <tr>
2200 <td id="L358" class="blob-num js-line-number" data-line-number="358"></td>
2201 <td id="LC358" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> mesh.verts:</td>
2202 </tr>
2203 <tr>
2204 <td id="L359" class="blob-num js-line-number" data-line-number="359"></td>
2205 <td id="LC359" class="blob-code blob-code-inner js-file-line"> pos <span class="pl-k">=</span> mathutils.Vector((<span class="pl-c1">0.0</span>, <span class="pl-c1">0.0</span>, <span class="pl-c1">0.0</span>))</td>
2206 </tr>
2207 <tr>
2208 <td id="L360" class="blob-num js-line-number" data-line-number="360"></td>
2209 <td id="LC360" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> (weight, bone) <span class="pl-k">in</span> v.weights:</td>
2210 </tr>
2211 <tr>
2212 <td id="L361" class="blob-num js-line-number" data-line-number="361"></td>
2213 <td id="LC361" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> weight <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
2214 </tr>
2215 <tr>
2216 <td id="L362" class="blob-num js-line-number" data-line-number="362"></td>
2217 <td id="LC362" class="blob-code blob-code-inner js-file-line"> pos <span class="pl-k">+=</span> (transforms[bone] <span class="pl-k">@</span> v.coord) <span class="pl-k">*</span> (weight <span class="pl-k">/</span> <span class="pl-c1">255.0</span>)</td>
2218 </tr>
2219 <tr>
2220 <td id="L363" class="blob-num js-line-number" data-line-number="363"></td>
2221 <td id="LC363" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bbmin:</td>
2222 </tr>
2223 <tr>
2224 <td id="L364" class="blob-num js-line-number" data-line-number="364"></td>
2225 <td id="LC364" class="blob-code blob-code-inner js-file-line"> bbmin.x <span class="pl-k">=</span> <span class="pl-c1">min</span>(bbmin.x, pos.x)</td>
2226 </tr>
2227 <tr>
2228 <td id="L365" class="blob-num js-line-number" data-line-number="365"></td>
2229 <td id="LC365" class="blob-code blob-code-inner js-file-line"> bbmin.y <span class="pl-k">=</span> <span class="pl-c1">min</span>(bbmin.y, pos.y)</td>
2230 </tr>
2231 <tr>
2232 <td id="L366" class="blob-num js-line-number" data-line-number="366"></td>
2233 <td id="LC366" class="blob-code blob-code-inner js-file-line"> bbmin.z <span class="pl-k">=</span> <span class="pl-c1">min</span>(bbmin.z, pos.z)</td>
2234 </tr>
2235 <tr>
2236 <td id="L367" class="blob-num js-line-number" data-line-number="367"></td>
2237 <td id="LC367" class="blob-code blob-code-inner js-file-line"> bbmax.x <span class="pl-k">=</span> <span class="pl-c1">max</span>(bbmax.x, pos.x)</td>
2238 </tr>
2239 <tr>
2240 <td id="L368" class="blob-num js-line-number" data-line-number="368"></td>
2241 <td id="LC368" class="blob-code blob-code-inner js-file-line"> bbmax.y <span class="pl-k">=</span> <span class="pl-c1">max</span>(bbmax.y, pos.y)</td>
2242 </tr>
2243 <tr>
2244 <td id="L369" class="blob-num js-line-number" data-line-number="369"></td>
2245 <td id="LC369" class="blob-code blob-code-inner js-file-line"> bbmax.z <span class="pl-k">=</span> <span class="pl-c1">max</span>(bbmax.z, pos.z)</td>
2246 </tr>
2247 <tr>
2248 <td id="L370" class="blob-num js-line-number" data-line-number="370"></td>
2249 <td id="LC370" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
2250 </tr>
2251 <tr>
2252 <td id="L371" class="blob-num js-line-number" data-line-number="371"></td>
2253 <td id="LC371" class="blob-code blob-code-inner js-file-line"> bbmin <span class="pl-k">=</span> pos.copy()</td>
2254 </tr>
2255 <tr>
2256 <td id="L372" class="blob-num js-line-number" data-line-number="372"></td>
2257 <td id="LC372" class="blob-code blob-code-inner js-file-line"> bbmax <span class="pl-k">=</span> pos.copy()</td>
2258 </tr>
2259 <tr>
2260 <td id="L373" class="blob-num js-line-number" data-line-number="373"></td>
2261 <td id="LC373" class="blob-code blob-code-inner js-file-line"> pradius <span class="pl-k">=</span> pos.x<span class="pl-k">*</span>pos.x <span class="pl-k">+</span> pos.y<span class="pl-k">*</span>pos.y</td>
2262 </tr>
2263 <tr>
2264 <td id="L374" class="blob-num js-line-number" data-line-number="374"></td>
2265 <td id="LC374" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> pradius <span class="pl-k">></span> xyradius:</td>
2266 </tr>
2267 <tr>
2268 <td id="L375" class="blob-num js-line-number" data-line-number="375"></td>
2269 <td id="LC375" class="blob-code blob-code-inner js-file-line"> xyradius <span class="pl-k">=</span> pradius</td>
2270 </tr>
2271 <tr>
2272 <td id="L376" class="blob-num js-line-number" data-line-number="376"></td>
2273 <td id="LC376" class="blob-code blob-code-inner js-file-line"> pradius <span class="pl-k">+=</span> pos.z<span class="pl-k">*</span>pos.z</td>
2274 </tr>
2275 <tr>
2276 <td id="L377" class="blob-num js-line-number" data-line-number="377"></td>
2277 <td id="LC377" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> pradius <span class="pl-k">></span> radius:</td>
2278 </tr>
2279 <tr>
2280 <td id="L378" class="blob-num js-line-number" data-line-number="378"></td>
2281 <td id="LC378" class="blob-code blob-code-inner js-file-line"> radius <span class="pl-k">=</span> pradius</td>
2282 </tr>
2283 <tr>
2284 <td id="L379" class="blob-num js-line-number" data-line-number="379"></td>
2285 <td id="LC379" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bbmin:</td>
2286 </tr>
2287 <tr>
2288 <td id="L380" class="blob-num js-line-number" data-line-number="380"></td>
2289 <td id="LC380" class="blob-code blob-code-inner js-file-line"> xyradius <span class="pl-k">=</span> math.sqrt(xyradius)</td>
2290 </tr>
2291 <tr>
2292 <td id="L381" class="blob-num js-line-number" data-line-number="381"></td>
2293 <td id="LC381" class="blob-code blob-code-inner js-file-line"> radius <span class="pl-k">=</span> math.sqrt(radius)</td>
2294 </tr>
2295 <tr>
2296 <td id="L382" class="blob-num js-line-number" data-line-number="382"></td>
2297 <td id="LC382" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
2298 </tr>
2299 <tr>
2300 <td id="L383" class="blob-num js-line-number" data-line-number="383"></td>
2301 <td id="LC383" class="blob-code blob-code-inner js-file-line"> bbmin <span class="pl-k">=</span> bbmax <span class="pl-k">=</span> mathutils.Vector((<span class="pl-c1">0.0</span>, <span class="pl-c1">0.0</span>, <span class="pl-c1">0.0</span>))</td>
2302 </tr>
2303 <tr>
2304 <td id="L384" class="blob-num js-line-number" data-line-number="384"></td>
2305 <td id="LC384" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-c1">IQM_BOUNDS</span>.pack(bbmin.x, bbmin.y, bbmin.z, bbmax.x, bbmax.y, bbmax.z, xyradius, radius)</td>
2306 </tr>
2307 <tr>
2308 <td id="L385" class="blob-num js-line-number" data-line-number="385"></td>
2309 <td id="LC385" class="blob-code blob-code-inner js-file-line"> </td>
2310 </tr>
2311 <tr>
2312 <td id="L386" class="blob-num js-line-number" data-line-number="386"></td>
2313 <td id="LC386" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">boundsData</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">bones</span>, <span class="pl-smi">meshes</span>):</td>
2314 </tr>
2315 <tr>
2316 <td id="L387" class="blob-num js-line-number" data-line-number="387"></td>
2317 <td id="LC387" class="blob-code blob-code-inner js-file-line"> invbase <span class="pl-k">=</span> []</td>
2318 </tr>
2319 <tr>
2320 <td id="L388" class="blob-num js-line-number" data-line-number="388"></td>
2321 <td id="LC388" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> bone <span class="pl-k">in</span> bones:</td>
2322 </tr>
2323 <tr>
2324 <td id="L389" class="blob-num js-line-number" data-line-number="389"></td>
2325 <td id="LC389" class="blob-code blob-code-inner js-file-line"> invbase.append(bone.matrix.inverted())</td>
2326 </tr>
2327 <tr>
2328 <td id="L390" class="blob-num js-line-number" data-line-number="390"></td>
2329 <td id="LC390" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">=</span> <span class="pl-s"><span class="pl-k">b</span><span class="pl-pds">'</span><span class="pl-pds">'</span></span></td>
2330 </tr>
2331 <tr>
2332 <td id="L391" class="blob-num js-line-number" data-line-number="391"></td>
2333 <td id="LC391" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, frame <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(<span class="pl-c1">self</span>.frames):</td>
2334 </tr>
2335 <tr>
2336 <td id="L392" class="blob-num js-line-number" data-line-number="392"></td>
2337 <td id="LC392" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Calculating bounding box for <span class="pl-c1">%s</span>:<span class="pl-c1">%d</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (<span class="pl-c1">self</span>.name, i))</td>
2338 </tr>
2339 <tr>
2340 <td id="L393" class="blob-num js-line-number" data-line-number="393"></td>
2341 <td id="LC393" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">+=</span> <span class="pl-c1">self</span>.frameBoundsData(bones, meshes, frame, invbase) </td>
2342 </tr>
2343 <tr>
2344 <td id="L394" class="blob-num js-line-number" data-line-number="394"></td>
2345 <td id="LC394" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> data</td>
2346 </tr>
2347 <tr>
2348 <td id="L395" class="blob-num js-line-number" data-line-number="395"></td>
2349 <td id="LC395" class="blob-code blob-code-inner js-file-line"> </td>
2350 </tr>
2351 <tr>
2352 <td id="L396" class="blob-num js-line-number" data-line-number="396"></td>
2353 <td id="LC396" class="blob-code blob-code-inner js-file-line"> </td>
2354 </tr>
2355 <tr>
2356 <td id="L397" class="blob-num js-line-number" data-line-number="397"></td>
2357 <td id="LC397" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-en">IQMFile</span>:</td>
2358 </tr>
2359 <tr>
2360 <td id="L398" class="blob-num js-line-number" data-line-number="398"></td>
2361 <td id="LC398" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-c1">__init__</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>):</td>
2362 </tr>
2363 <tr>
2364 <td id="L399" class="blob-num js-line-number" data-line-number="399"></td>
2365 <td id="LC399" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.textoffsets <span class="pl-k">=</span> {}</td>
2366 </tr>
2367 <tr>
2368 <td id="L400" class="blob-num js-line-number" data-line-number="400"></td>
2369 <td id="LC400" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.textdata <span class="pl-k">=</span> <span class="pl-s"><span class="pl-k">b</span><span class="pl-pds">'</span><span class="pl-pds">'</span></span></td>
2370 </tr>
2371 <tr>
2372 <td id="L401" class="blob-num js-line-number" data-line-number="401"></td>
2373 <td id="LC401" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.meshes <span class="pl-k">=</span> []</td>
2374 </tr>
2375 <tr>
2376 <td id="L402" class="blob-num js-line-number" data-line-number="402"></td>
2377 <td id="LC402" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.meshdata <span class="pl-k">=</span> []</td>
2378 </tr>
2379 <tr>
2380 <td id="L403" class="blob-num js-line-number" data-line-number="403"></td>
2381 <td id="LC403" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.numverts <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
2382 </tr>
2383 <tr>
2384 <td id="L404" class="blob-num js-line-number" data-line-number="404"></td>
2385 <td id="LC404" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.numtris <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
2386 </tr>
2387 <tr>
2388 <td id="L405" class="blob-num js-line-number" data-line-number="405"></td>
2389 <td id="LC405" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.joints <span class="pl-k">=</span> []</td>
2390 </tr>
2391 <tr>
2392 <td id="L406" class="blob-num js-line-number" data-line-number="406"></td>
2393 <td id="LC406" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.jointdata <span class="pl-k">=</span> []</td>
2394 </tr>
2395 <tr>
2396 <td id="L407" class="blob-num js-line-number" data-line-number="407"></td>
2397 <td id="LC407" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.numframes <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
2398 </tr>
2399 <tr>
2400 <td id="L408" class="blob-num js-line-number" data-line-number="408"></td>
2401 <td id="LC408" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.framesize <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
2402 </tr>
2403 <tr>
2404 <td id="L409" class="blob-num js-line-number" data-line-number="409"></td>
2405 <td id="LC409" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.anims <span class="pl-k">=</span> []</td>
2406 </tr>
2407 <tr>
2408 <td id="L410" class="blob-num js-line-number" data-line-number="410"></td>
2409 <td id="LC410" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.posedata <span class="pl-k">=</span> []</td>
2410 </tr>
2411 <tr>
2412 <td id="L411" class="blob-num js-line-number" data-line-number="411"></td>
2413 <td id="LC411" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.animdata <span class="pl-k">=</span> []</td>
2414 </tr>
2415 <tr>
2416 <td id="L412" class="blob-num js-line-number" data-line-number="412"></td>
2417 <td id="LC412" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.framedata <span class="pl-k">=</span> []</td>
2418 </tr>
2419 <tr>
2420 <td id="L413" class="blob-num js-line-number" data-line-number="413"></td>
2421 <td id="LC413" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.vertdata <span class="pl-k">=</span> []</td>
2422 </tr>
2423 <tr>
2424 <td id="L414" class="blob-num js-line-number" data-line-number="414"></td>
2425 <td id="LC414" class="blob-code blob-code-inner js-file-line">
2426</td>
2427 </tr>
2428 <tr>
2429 <td id="L415" class="blob-num js-line-number" data-line-number="415"></td>
2430 <td id="LC415" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">addText</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">str</span>):</td>
2431 </tr>
2432 <tr>
2433 <td id="L416" class="blob-num js-line-number" data-line-number="416"></td>
2434 <td id="LC416" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> <span class="pl-c1">self</span>.textdata:</td>
2435 </tr>
2436 <tr>
2437 <td id="L417" class="blob-num js-line-number" data-line-number="417"></td>
2438 <td id="LC417" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.textdata <span class="pl-k">+=</span> <span class="pl-s"><span class="pl-k">b</span><span class="pl-pds">'</span><span class="pl-cce">\x00</span><span class="pl-pds">'</span></span></td>
2439 </tr>
2440 <tr>
2441 <td id="L418" class="blob-num js-line-number" data-line-number="418"></td>
2442 <td id="LC418" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.textoffsets[<span class="pl-s"><span class="pl-pds">'</span><span class="pl-pds">'</span></span>] <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
2443 </tr>
2444 <tr>
2445 <td id="L419" class="blob-num js-line-number" data-line-number="419"></td>
2446 <td id="LC419" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>:</td>
2447 </tr>
2448 <tr>
2449 <td id="L420" class="blob-num js-line-number" data-line-number="420"></td>
2450 <td id="LC420" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-c1">self</span>.textoffsets[<span class="pl-c1">str</span>]</td>
2451 </tr>
2452 <tr>
2453 <td id="L421" class="blob-num js-line-number" data-line-number="421"></td>
2454 <td id="LC421" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>:</td>
2455 </tr>
2456 <tr>
2457 <td id="L422" class="blob-num js-line-number" data-line-number="422"></td>
2458 <td id="LC422" class="blob-code blob-code-inner js-file-line"> offset <span class="pl-k">=</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.textdata)</td>
2459 </tr>
2460 <tr>
2461 <td id="L423" class="blob-num js-line-number" data-line-number="423"></td>
2462 <td id="LC423" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.textoffsets[<span class="pl-c1">str</span>] <span class="pl-k">=</span> offset</td>
2463 </tr>
2464 <tr>
2465 <td id="L424" class="blob-num js-line-number" data-line-number="424"></td>
2466 <td id="LC424" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.textdata <span class="pl-k">+=</span> <span class="pl-c1">bytes</span>(<span class="pl-c1">str</span>, <span class="pl-v">encoding</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>utf8<span class="pl-pds">"</span></span>) <span class="pl-k">+</span> <span class="pl-s"><span class="pl-k">b</span><span class="pl-pds">'</span><span class="pl-cce">\x00</span><span class="pl-pds">'</span></span></td>
2467 </tr>
2468 <tr>
2469 <td id="L425" class="blob-num js-line-number" data-line-number="425"></td>
2470 <td id="LC425" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> offset</td>
2471 </tr>
2472 <tr>
2473 <td id="L426" class="blob-num js-line-number" data-line-number="426"></td>
2474 <td id="LC426" class="blob-code blob-code-inner js-file-line">
2475</td>
2476 </tr>
2477 <tr>
2478 <td id="L427" class="blob-num js-line-number" data-line-number="427"></td>
2479 <td id="LC427" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">addJoints</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">bones</span>):</td>
2480 </tr>
2481 <tr>
2482 <td id="L428" class="blob-num js-line-number" data-line-number="428"></td>
2483 <td id="LC428" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> bone <span class="pl-k">in</span> bones:</td>
2484 </tr>
2485 <tr>
2486 <td id="L429" class="blob-num js-line-number" data-line-number="429"></td>
2487 <td id="LC429" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.joints.append(bone)</td>
2488 </tr>
2489 <tr>
2490 <td id="L430" class="blob-num js-line-number" data-line-number="430"></td>
2491 <td id="LC430" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.meshes:</td>
2492 </tr>
2493 <tr>
2494 <td id="L431" class="blob-num js-line-number" data-line-number="431"></td>
2495 <td id="LC431" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.jointdata.append(bone.jointData(<span class="pl-c1">self</span>))</td>
2496 </tr>
2497 <tr>
2498 <td id="L432" class="blob-num js-line-number" data-line-number="432"></td>
2499 <td id="LC432" class="blob-code blob-code-inner js-file-line">
2500</td>
2501 </tr>
2502 <tr>
2503 <td id="L433" class="blob-num js-line-number" data-line-number="433"></td>
2504 <td id="LC433" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">addMeshes</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">meshes</span>):</td>
2505 </tr>
2506 <tr>
2507 <td id="L434" class="blob-num js-line-number" data-line-number="434"></td>
2508 <td id="LC434" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.meshes <span class="pl-k">+=</span> meshes</td>
2509 </tr>
2510 <tr>
2511 <td id="L435" class="blob-num js-line-number" data-line-number="435"></td>
2512 <td id="LC435" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> meshes:</td>
2513 </tr>
2514 <tr>
2515 <td id="L436" class="blob-num js-line-number" data-line-number="436"></td>
2516 <td id="LC436" class="blob-code blob-code-inner js-file-line"> mesh.firstvert <span class="pl-k">=</span> <span class="pl-c1">self</span>.numverts</td>
2517 </tr>
2518 <tr>
2519 <td id="L437" class="blob-num js-line-number" data-line-number="437"></td>
2520 <td id="LC437" class="blob-code blob-code-inner js-file-line"> mesh.firsttri <span class="pl-k">=</span> <span class="pl-c1">self</span>.numtris</td>
2521 </tr>
2522 <tr>
2523 <td id="L438" class="blob-num js-line-number" data-line-number="438"></td>
2524 <td id="LC438" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.meshdata.append(mesh.meshData(<span class="pl-c1">self</span>))</td>
2525 </tr>
2526 <tr>
2527 <td id="L439" class="blob-num js-line-number" data-line-number="439"></td>
2528 <td id="LC439" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.numverts <span class="pl-k">+=</span> <span class="pl-c1">len</span>(mesh.verts)</td>
2529 </tr>
2530 <tr>
2531 <td id="L440" class="blob-num js-line-number" data-line-number="440"></td>
2532 <td id="LC440" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.numtris <span class="pl-k">+=</span> <span class="pl-c1">len</span>(mesh.tris)</td>
2533 </tr>
2534 <tr>
2535 <td id="L441" class="blob-num js-line-number" data-line-number="441"></td>
2536 <td id="LC441" class="blob-code blob-code-inner js-file-line">
2537</td>
2538 </tr>
2539 <tr>
2540 <td id="L442" class="blob-num js-line-number" data-line-number="442"></td>
2541 <td id="LC442" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">addAnims</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">anims</span>):</td>
2542 </tr>
2543 <tr>
2544 <td id="L443" class="blob-num js-line-number" data-line-number="443"></td>
2545 <td id="LC443" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.anims <span class="pl-k">+=</span> anims</td>
2546 </tr>
2547 <tr>
2548 <td id="L444" class="blob-num js-line-number" data-line-number="444"></td>
2549 <td id="LC444" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> anim <span class="pl-k">in</span> anims:</td>
2550 </tr>
2551 <tr>
2552 <td id="L445" class="blob-num js-line-number" data-line-number="445"></td>
2553 <td id="LC445" class="blob-code blob-code-inner js-file-line"> anim.firstframe <span class="pl-k">=</span> <span class="pl-c1">self</span>.numframes</td>
2554 </tr>
2555 <tr>
2556 <td id="L446" class="blob-num js-line-number" data-line-number="446"></td>
2557 <td id="LC446" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.animdata.append(anim.animData(<span class="pl-c1">self</span>))</td>
2558 </tr>
2559 <tr>
2560 <td id="L447" class="blob-num js-line-number" data-line-number="447"></td>
2561 <td id="LC447" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.numframes <span class="pl-k">+=</span> <span class="pl-c1">len</span>(anim.frames)</td>
2562 </tr>
2563 <tr>
2564 <td id="L448" class="blob-num js-line-number" data-line-number="448"></td>
2565 <td id="LC448" class="blob-code blob-code-inner js-file-line">
2566</td>
2567 </tr>
2568 <tr>
2569 <td id="L449" class="blob-num js-line-number" data-line-number="449"></td>
2570 <td id="LC449" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">calcFrameSize</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>):</td>
2571 </tr>
2572 <tr>
2573 <td id="L450" class="blob-num js-line-number" data-line-number="450"></td>
2574 <td id="LC450" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> anim <span class="pl-k">in</span> <span class="pl-c1">self</span>.anims:</td>
2575 </tr>
2576 <tr>
2577 <td id="L451" class="blob-num js-line-number" data-line-number="451"></td>
2578 <td id="LC451" class="blob-code blob-code-inner js-file-line"> anim.calcFrameLimits(<span class="pl-c1">self</span>.joints)</td>
2579 </tr>
2580 <tr>
2581 <td id="L452" class="blob-num js-line-number" data-line-number="452"></td>
2582 <td id="LC452" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.framesize <span class="pl-k">=</span> <span class="pl-c1">0</span> </td>
2583 </tr>
2584 <tr>
2585 <td id="L453" class="blob-num js-line-number" data-line-number="453"></td>
2586 <td id="LC453" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> joint <span class="pl-k">in</span> <span class="pl-c1">self</span>.joints:</td>
2587 </tr>
2588 <tr>
2589 <td id="L454" class="blob-num js-line-number" data-line-number="454"></td>
2590 <td id="LC454" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.framesize <span class="pl-k">+=</span> joint.calcChannelMask()</td>
2591 </tr>
2592 <tr>
2593 <td id="L455" class="blob-num js-line-number" data-line-number="455"></td>
2594 <td id="LC455" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> joint <span class="pl-k">in</span> <span class="pl-c1">self</span>.joints:</td>
2595 </tr>
2596 <tr>
2597 <td id="L456" class="blob-num js-line-number" data-line-number="456"></td>
2598 <td id="LC456" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.anims:</td>
2599 </tr>
2600 <tr>
2601 <td id="L457" class="blob-num js-line-number" data-line-number="457"></td>
2602 <td id="LC457" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.posedata.append(joint.poseData(<span class="pl-c1">self</span>))</td>
2603 </tr>
2604 <tr>
2605 <td id="L458" class="blob-num js-line-number" data-line-number="458"></td>
2606 <td id="LC458" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Exporting <span class="pl-c1">%d</span> frames of size <span class="pl-c1">%d</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (<span class="pl-c1">self</span>.numframes, <span class="pl-c1">self</span>.framesize))</td>
2607 </tr>
2608 <tr>
2609 <td id="L459" class="blob-num js-line-number" data-line-number="459"></td>
2610 <td id="LC459" class="blob-code blob-code-inner js-file-line">
2611</td>
2612 </tr>
2613 <tr>
2614 <td id="L460" class="blob-num js-line-number" data-line-number="460"></td>
2615 <td id="LC460" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">writeVerts</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">file</span>, <span class="pl-smi">offset</span>):</td>
2616 </tr>
2617 <tr>
2618 <td id="L461" class="blob-num js-line-number" data-line-number="461"></td>
2619 <td id="LC461" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.numverts <span class="pl-k"><=</span> <span class="pl-c1">0</span>:</td>
2620 </tr>
2621 <tr>
2622 <td id="L462" class="blob-num js-line-number" data-line-number="462"></td>
2623 <td id="LC462" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span></td>
2624 </tr>
2625 <tr>
2626 <td id="L463" class="blob-num js-line-number" data-line-number="463"></td>
2627 <td id="LC463" class="blob-code blob-code-inner js-file-line">
2628</td>
2629 </tr>
2630 <tr>
2631 <td id="L464" class="blob-num js-line-number" data-line-number="464"></td>
2632 <td id="LC464" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_VERTEXARRAY</span>.pack(<span class="pl-c1">IQM_POSITION</span>, <span class="pl-c1">0</span>, <span class="pl-c1">IQM_FLOAT</span>, <span class="pl-c1">3</span>, offset))</td>
2633 </tr>
2634 <tr>
2635 <td id="L465" class="blob-num js-line-number" data-line-number="465"></td>
2636 <td id="LC465" class="blob-code blob-code-inner js-file-line"> offset <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><3f<span class="pl-pds">'</span></span>)</td>
2637 </tr>
2638 <tr>
2639 <td id="L466" class="blob-num js-line-number" data-line-number="466"></td>
2640 <td id="LC466" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_VERTEXARRAY</span>.pack(<span class="pl-c1">IQM_TEXCOORD</span>, <span class="pl-c1">0</span>, <span class="pl-c1">IQM_FLOAT</span>, <span class="pl-c1">2</span>, offset))</td>
2641 </tr>
2642 <tr>
2643 <td id="L467" class="blob-num js-line-number" data-line-number="467"></td>
2644 <td id="LC467" class="blob-code blob-code-inner js-file-line"> offset <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><2f<span class="pl-pds">'</span></span>)</td>
2645 </tr>
2646 <tr>
2647 <td id="L468" class="blob-num js-line-number" data-line-number="468"></td>
2648 <td id="LC468" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_VERTEXARRAY</span>.pack(<span class="pl-c1">IQM_NORMAL</span>, <span class="pl-c1">0</span>, <span class="pl-c1">IQM_FLOAT</span>, <span class="pl-c1">3</span>, offset))</td>
2649 </tr>
2650 <tr>
2651 <td id="L469" class="blob-num js-line-number" data-line-number="469"></td>
2652 <td id="LC469" class="blob-code blob-code-inner js-file-line"> offset <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><3f<span class="pl-pds">'</span></span>) </td>
2653 </tr>
2654 <tr>
2655 <td id="L470" class="blob-num js-line-number" data-line-number="470"></td>
2656 <td id="LC470" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_VERTEXARRAY</span>.pack(<span class="pl-c1">IQM_TANGENT</span>, <span class="pl-c1">0</span>, <span class="pl-c1">IQM_FLOAT</span>, <span class="pl-c1">4</span>, offset))</td>
2657 </tr>
2658 <tr>
2659 <td id="L471" class="blob-num js-line-number" data-line-number="471"></td>
2660 <td id="LC471" class="blob-code blob-code-inner js-file-line"> offset <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><4f<span class="pl-pds">'</span></span>)</td>
2661 </tr>
2662 <tr>
2663 <td id="L472" class="blob-num js-line-number" data-line-number="472"></td>
2664 <td id="LC472" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.joints:</td>
2665 </tr>
2666 <tr>
2667 <td id="L473" class="blob-num js-line-number" data-line-number="473"></td>
2668 <td id="LC473" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_VERTEXARRAY</span>.pack(<span class="pl-c1">IQM_BLENDINDEXES</span>, <span class="pl-c1">0</span>, <span class="pl-c1">IQM_UBYTE</span>, <span class="pl-c1">4</span>, offset))</td>
2669 </tr>
2670 <tr>
2671 <td id="L474" class="blob-num js-line-number" data-line-number="474"></td>
2672 <td id="LC474" class="blob-code blob-code-inner js-file-line"> offset <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><4B<span class="pl-pds">'</span></span>)</td>
2673 </tr>
2674 <tr>
2675 <td id="L475" class="blob-num js-line-number" data-line-number="475"></td>
2676 <td id="LC475" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_VERTEXARRAY</span>.pack(<span class="pl-c1">IQM_BLENDWEIGHTS</span>, <span class="pl-c1">0</span>, <span class="pl-c1">IQM_UBYTE</span>, <span class="pl-c1">4</span>, offset))</td>
2677 </tr>
2678 <tr>
2679 <td id="L476" class="blob-num js-line-number" data-line-number="476"></td>
2680 <td id="LC476" class="blob-code blob-code-inner js-file-line"> offset <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><4B<span class="pl-pds">'</span></span>)</td>
2681 </tr>
2682 <tr>
2683 <td id="L477" class="blob-num js-line-number" data-line-number="477"></td>
2684 <td id="LC477" class="blob-code blob-code-inner js-file-line"> hascolors <span class="pl-k">=</span> <span class="pl-c1">any</span>(mesh.verts <span class="pl-k">and</span> mesh.verts[<span class="pl-c1">0</span>].color <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes)</td>
2685 </tr>
2686 <tr>
2687 <td id="L478" class="blob-num js-line-number" data-line-number="478"></td>
2688 <td id="LC478" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> hascolors:</td>
2689 </tr>
2690 <tr>
2691 <td id="L479" class="blob-num js-line-number" data-line-number="479"></td>
2692 <td id="LC479" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_VERTEXARRAY</span>.pack(<span class="pl-c1">IQM_COLOR</span>, <span class="pl-c1">0</span>, <span class="pl-c1">IQM_UBYTE</span>, <span class="pl-c1">4</span>, offset))</td>
2693 </tr>
2694 <tr>
2695 <td id="L480" class="blob-num js-line-number" data-line-number="480"></td>
2696 <td id="LC480" class="blob-code blob-code-inner js-file-line"> offset <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><4B<span class="pl-pds">'</span></span>)</td>
2697 </tr>
2698 <tr>
2699 <td id="L481" class="blob-num js-line-number" data-line-number="481"></td>
2700 <td id="LC481" class="blob-code blob-code-inner js-file-line">
2701</td>
2702 </tr>
2703 <tr>
2704 <td id="L482" class="blob-num js-line-number" data-line-number="482"></td>
2705 <td id="LC482" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes:</td>
2706 </tr>
2707 <tr>
2708 <td id="L483" class="blob-num js-line-number" data-line-number="483"></td>
2709 <td id="LC483" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> mesh.verts:</td>
2710 </tr>
2711 <tr>
2712 <td id="L484" class="blob-num js-line-number" data-line-number="484"></td>
2713 <td id="LC484" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(struct.pack(<span class="pl-s"><span class="pl-pds">'</span><3f<span class="pl-pds">'</span></span>, <span class="pl-k">*</span>v.coord))</td>
2714 </tr>
2715 <tr>
2716 <td id="L485" class="blob-num js-line-number" data-line-number="485"></td>
2717 <td id="LC485" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes:</td>
2718 </tr>
2719 <tr>
2720 <td id="L486" class="blob-num js-line-number" data-line-number="486"></td>
2721 <td id="LC486" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> mesh.verts:</td>
2722 </tr>
2723 <tr>
2724 <td id="L487" class="blob-num js-line-number" data-line-number="487"></td>
2725 <td id="LC487" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(struct.pack(<span class="pl-s"><span class="pl-pds">'</span><2f<span class="pl-pds">'</span></span>, <span class="pl-k">*</span>v.uv))</td>
2726 </tr>
2727 <tr>
2728 <td id="L488" class="blob-num js-line-number" data-line-number="488"></td>
2729 <td id="LC488" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes:</td>
2730 </tr>
2731 <tr>
2732 <td id="L489" class="blob-num js-line-number" data-line-number="489"></td>
2733 <td id="LC489" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> mesh.verts:</td>
2734 </tr>
2735 <tr>
2736 <td id="L490" class="blob-num js-line-number" data-line-number="490"></td>
2737 <td id="LC490" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(struct.pack(<span class="pl-s"><span class="pl-pds">'</span><3f<span class="pl-pds">'</span></span>, <span class="pl-k">*</span>v.normal))</td>
2738 </tr>
2739 <tr>
2740 <td id="L491" class="blob-num js-line-number" data-line-number="491"></td>
2741 <td id="LC491" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes:</td>
2742 </tr>
2743 <tr>
2744 <td id="L492" class="blob-num js-line-number" data-line-number="492"></td>
2745 <td id="LC492" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> mesh.verts:</td>
2746 </tr>
2747 <tr>
2748 <td id="L493" class="blob-num js-line-number" data-line-number="493"></td>
2749 <td id="LC493" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(struct.pack(<span class="pl-s"><span class="pl-pds">'</span><4f<span class="pl-pds">'</span></span>, v.tangent.x, v.tangent.y, v.tangent.z, v.bitangent))</td>
2750 </tr>
2751 <tr>
2752 <td id="L494" class="blob-num js-line-number" data-line-number="494"></td>
2753 <td id="LC494" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.joints:</td>
2754 </tr>
2755 <tr>
2756 <td id="L495" class="blob-num js-line-number" data-line-number="495"></td>
2757 <td id="LC495" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes:</td>
2758 </tr>
2759 <tr>
2760 <td id="L496" class="blob-num js-line-number" data-line-number="496"></td>
2761 <td id="LC496" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> mesh.verts:</td>
2762 </tr>
2763 <tr>
2764 <td id="L497" class="blob-num js-line-number" data-line-number="497"></td>
2765 <td id="LC497" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(struct.pack(<span class="pl-s"><span class="pl-pds">'</span><4B<span class="pl-pds">'</span></span>, v.weights[<span class="pl-c1">0</span>][<span class="pl-c1">1</span>], v.weights[<span class="pl-c1">1</span>][<span class="pl-c1">1</span>], v.weights[<span class="pl-c1">2</span>][<span class="pl-c1">1</span>], v.weights[<span class="pl-c1">3</span>][<span class="pl-c1">1</span>]))</td>
2766 </tr>
2767 <tr>
2768 <td id="L498" class="blob-num js-line-number" data-line-number="498"></td>
2769 <td id="LC498" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes:</td>
2770 </tr>
2771 <tr>
2772 <td id="L499" class="blob-num js-line-number" data-line-number="499"></td>
2773 <td id="LC499" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> mesh.verts:</td>
2774 </tr>
2775 <tr>
2776 <td id="L500" class="blob-num js-line-number" data-line-number="500"></td>
2777 <td id="LC500" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(struct.pack(<span class="pl-s"><span class="pl-pds">'</span><4B<span class="pl-pds">'</span></span>, v.weights[<span class="pl-c1">0</span>][<span class="pl-c1">0</span>], v.weights[<span class="pl-c1">1</span>][<span class="pl-c1">0</span>], v.weights[<span class="pl-c1">2</span>][<span class="pl-c1">0</span>], v.weights[<span class="pl-c1">3</span>][<span class="pl-c1">0</span>]))</td>
2778 </tr>
2779 <tr>
2780 <td id="L501" class="blob-num js-line-number" data-line-number="501"></td>
2781 <td id="LC501" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> hascolors:</td>
2782 </tr>
2783 <tr>
2784 <td id="L502" class="blob-num js-line-number" data-line-number="502"></td>
2785 <td id="LC502" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes:</td>
2786 </tr>
2787 <tr>
2788 <td id="L503" class="blob-num js-line-number" data-line-number="503"></td>
2789 <td id="LC503" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> mesh.verts:</td>
2790 </tr>
2791 <tr>
2792 <td id="L504" class="blob-num js-line-number" data-line-number="504"></td>
2793 <td id="LC504" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> v.color:</td>
2794 </tr>
2795 <tr>
2796 <td id="L505" class="blob-num js-line-number" data-line-number="505"></td>
2797 <td id="LC505" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(struct.pack(<span class="pl-s"><span class="pl-pds">'</span><4B<span class="pl-pds">'</span></span>, v.color[<span class="pl-c1">0</span>], v.color[<span class="pl-c1">1</span>], v.color[<span class="pl-c1">2</span>], v.color[<span class="pl-c1">3</span>]))</td>
2798 </tr>
2799 <tr>
2800 <td id="L506" class="blob-num js-line-number" data-line-number="506"></td>
2801 <td id="LC506" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
2802 </tr>
2803 <tr>
2804 <td id="L507" class="blob-num js-line-number" data-line-number="507"></td>
2805 <td id="LC507" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(struct.pack(<span class="pl-s"><span class="pl-pds">'</span><4B<span class="pl-pds">'</span></span>, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>, <span class="pl-c1">255</span>))</td>
2806 </tr>
2807 <tr>
2808 <td id="L508" class="blob-num js-line-number" data-line-number="508"></td>
2809 <td id="LC508" class="blob-code blob-code-inner js-file-line">
2810</td>
2811 </tr>
2812 <tr>
2813 <td id="L509" class="blob-num js-line-number" data-line-number="509"></td>
2814 <td id="LC509" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">calcNeighbors</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>):</td>
2815 </tr>
2816 <tr>
2817 <td id="L510" class="blob-num js-line-number" data-line-number="510"></td>
2818 <td id="LC510" class="blob-code blob-code-inner js-file-line"> edges <span class="pl-k">=</span> {}</td>
2819 </tr>
2820 <tr>
2821 <td id="L511" class="blob-num js-line-number" data-line-number="511"></td>
2822 <td id="LC511" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes:</td>
2823 </tr>
2824 <tr>
2825 <td id="L512" class="blob-num js-line-number" data-line-number="512"></td>
2826 <td id="LC512" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, (v0, v1, v2) <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(mesh.tris):</td>
2827 </tr>
2828 <tr>
2829 <td id="L513" class="blob-num js-line-number" data-line-number="513"></td>
2830 <td id="LC513" class="blob-code blob-code-inner js-file-line"> e0 <span class="pl-k">=</span> v0.neighborKey(v1)</td>
2831 </tr>
2832 <tr>
2833 <td id="L514" class="blob-num js-line-number" data-line-number="514"></td>
2834 <td id="LC514" class="blob-code blob-code-inner js-file-line"> e1 <span class="pl-k">=</span> v1.neighborKey(v2)</td>
2835 </tr>
2836 <tr>
2837 <td id="L515" class="blob-num js-line-number" data-line-number="515"></td>
2838 <td id="LC515" class="blob-code blob-code-inner js-file-line"> e2 <span class="pl-k">=</span> v2.neighborKey(v0)</td>
2839 </tr>
2840 <tr>
2841 <td id="L516" class="blob-num js-line-number" data-line-number="516"></td>
2842 <td id="LC516" class="blob-code blob-code-inner js-file-line"> tri <span class="pl-k">=</span> mesh.firsttri <span class="pl-k">+</span> i</td>
2843 </tr>
2844 <tr>
2845 <td id="L517" class="blob-num js-line-number" data-line-number="517"></td>
2846 <td id="LC517" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>: edges[e0].append(tri)</td>
2847 </tr>
2848 <tr>
2849 <td id="L518" class="blob-num js-line-number" data-line-number="518"></td>
2850 <td id="LC518" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>: edges[e0] <span class="pl-k">=</span> [tri]</td>
2851 </tr>
2852 <tr>
2853 <td id="L519" class="blob-num js-line-number" data-line-number="519"></td>
2854 <td id="LC519" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>: edges[e1].append(tri)</td>
2855 </tr>
2856 <tr>
2857 <td id="L520" class="blob-num js-line-number" data-line-number="520"></td>
2858 <td id="LC520" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>: edges[e1] <span class="pl-k">=</span> [tri]</td>
2859 </tr>
2860 <tr>
2861 <td id="L521" class="blob-num js-line-number" data-line-number="521"></td>
2862 <td id="LC521" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>: edges[e2].append(tri)</td>
2863 </tr>
2864 <tr>
2865 <td id="L522" class="blob-num js-line-number" data-line-number="522"></td>
2866 <td id="LC522" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>: edges[e2] <span class="pl-k">=</span> [tri]</td>
2867 </tr>
2868 <tr>
2869 <td id="L523" class="blob-num js-line-number" data-line-number="523"></td>
2870 <td id="LC523" class="blob-code blob-code-inner js-file-line"> neighbors <span class="pl-k">=</span> []</td>
2871 </tr>
2872 <tr>
2873 <td id="L524" class="blob-num js-line-number" data-line-number="524"></td>
2874 <td id="LC524" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes:</td>
2875 </tr>
2876 <tr>
2877 <td id="L525" class="blob-num js-line-number" data-line-number="525"></td>
2878 <td id="LC525" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i, (v0, v1, v2) <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(mesh.tris):</td>
2879 </tr>
2880 <tr>
2881 <td id="L526" class="blob-num js-line-number" data-line-number="526"></td>
2882 <td id="LC526" class="blob-code blob-code-inner js-file-line"> e0 <span class="pl-k">=</span> edges[v0.neighborKey(v1)]</td>
2883 </tr>
2884 <tr>
2885 <td id="L527" class="blob-num js-line-number" data-line-number="527"></td>
2886 <td id="LC527" class="blob-code blob-code-inner js-file-line"> e1 <span class="pl-k">=</span> edges[v1.neighborKey(v2)]</td>
2887 </tr>
2888 <tr>
2889 <td id="L528" class="blob-num js-line-number" data-line-number="528"></td>
2890 <td id="LC528" class="blob-code blob-code-inner js-file-line"> e2 <span class="pl-k">=</span> edges[v2.neighborKey(v0)]</td>
2891 </tr>
2892 <tr>
2893 <td id="L529" class="blob-num js-line-number" data-line-number="529"></td>
2894 <td id="LC529" class="blob-code blob-code-inner js-file-line"> tri <span class="pl-k">=</span> mesh.firsttri <span class="pl-k">+</span> i</td>
2895 </tr>
2896 <tr>
2897 <td id="L530" class="blob-num js-line-number" data-line-number="530"></td>
2898 <td id="LC530" class="blob-code blob-code-inner js-file-line"> match0 <span class="pl-k">=</span> match1 <span class="pl-k">=</span> match2 <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
2899 </tr>
2900 <tr>
2901 <td id="L531" class="blob-num js-line-number" data-line-number="531"></td>
2902 <td id="LC531" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">len</span>(e0) <span class="pl-k">==</span> <span class="pl-c1">2</span>: match0 <span class="pl-k">=</span> e0[e0.index(tri)<span class="pl-k">^</span><span class="pl-c1">1</span>]</td>
2903 </tr>
2904 <tr>
2905 <td id="L532" class="blob-num js-line-number" data-line-number="532"></td>
2906 <td id="LC532" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">len</span>(e1) <span class="pl-k">==</span> <span class="pl-c1">2</span>: match1 <span class="pl-k">=</span> e1[e1.index(tri)<span class="pl-k">^</span><span class="pl-c1">1</span>]</td>
2907 </tr>
2908 <tr>
2909 <td id="L533" class="blob-num js-line-number" data-line-number="533"></td>
2910 <td id="LC533" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">len</span>(e2) <span class="pl-k">==</span> <span class="pl-c1">2</span>: match2 <span class="pl-k">=</span> e2[e2.index(tri)<span class="pl-k">^</span><span class="pl-c1">1</span>]</td>
2911 </tr>
2912 <tr>
2913 <td id="L534" class="blob-num js-line-number" data-line-number="534"></td>
2914 <td id="LC534" class="blob-code blob-code-inner js-file-line"> neighbors.append((match0, match1, match2))</td>
2915 </tr>
2916 <tr>
2917 <td id="L535" class="blob-num js-line-number" data-line-number="535"></td>
2918 <td id="LC535" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.neighbors <span class="pl-k">=</span> neighbors</td>
2919 </tr>
2920 <tr>
2921 <td id="L536" class="blob-num js-line-number" data-line-number="536"></td>
2922 <td id="LC536" class="blob-code blob-code-inner js-file-line">
2923</td>
2924 </tr>
2925 <tr>
2926 <td id="L537" class="blob-num js-line-number" data-line-number="537"></td>
2927 <td id="LC537" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">writeTris</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">file</span>):</td>
2928 </tr>
2929 <tr>
2930 <td id="L538" class="blob-num js-line-number" data-line-number="538"></td>
2931 <td id="LC538" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes:</td>
2932 </tr>
2933 <tr>
2934 <td id="L539" class="blob-num js-line-number" data-line-number="539"></td>
2935 <td id="LC539" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> (v0, v1, v2) <span class="pl-k">in</span> mesh.tris:</td>
2936 </tr>
2937 <tr>
2938 <td id="L540" class="blob-num js-line-number" data-line-number="540"></td>
2939 <td id="LC540" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(struct.pack(<span class="pl-s"><span class="pl-pds">'</span><3I<span class="pl-pds">'</span></span>, v0.index <span class="pl-k">+</span> mesh.firstvert, v1.index <span class="pl-k">+</span> mesh.firstvert, v2.index <span class="pl-k">+</span> mesh.firstvert)) </td>
2940 </tr>
2941 <tr>
2942 <td id="L541" class="blob-num js-line-number" data-line-number="541"></td>
2943 <td id="LC541" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> (n0, n1, n2) <span class="pl-k">in</span> <span class="pl-c1">self</span>.neighbors:</td>
2944 </tr>
2945 <tr>
2946 <td id="L542" class="blob-num js-line-number" data-line-number="542"></td>
2947 <td id="LC542" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> n0 <span class="pl-k"><</span> <span class="pl-c1">0</span>: n0 <span class="pl-k">=</span> <span class="pl-c1"><span class="pl-k">0x</span>FFFFFFFF</span> </td>
2948 </tr>
2949 <tr>
2950 <td id="L543" class="blob-num js-line-number" data-line-number="543"></td>
2951 <td id="LC543" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> n1 <span class="pl-k"><</span> <span class="pl-c1">0</span>: n1 <span class="pl-k">=</span> <span class="pl-c1"><span class="pl-k">0x</span>FFFFFFFF</span></td>
2952 </tr>
2953 <tr>
2954 <td id="L544" class="blob-num js-line-number" data-line-number="544"></td>
2955 <td id="LC544" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> n2 <span class="pl-k"><</span> <span class="pl-c1">0</span>: n2 <span class="pl-k">=</span> <span class="pl-c1"><span class="pl-k">0x</span>FFFFFFFF</span></td>
2956 </tr>
2957 <tr>
2958 <td id="L545" class="blob-num js-line-number" data-line-number="545"></td>
2959 <td id="LC545" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(struct.pack(<span class="pl-s"><span class="pl-pds">'</span><3I<span class="pl-pds">'</span></span>, n0, n1, n2))</td>
2960 </tr>
2961 <tr>
2962 <td id="L546" class="blob-num js-line-number" data-line-number="546"></td>
2963 <td id="LC546" class="blob-code blob-code-inner js-file-line">
2964</td>
2965 </tr>
2966 <tr>
2967 <td id="L547" class="blob-num js-line-number" data-line-number="547"></td>
2968 <td id="LC547" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">export</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">file</span>, <span class="pl-smi">usebbox</span> <span class="pl-k">=</span> <span class="pl-c1">True</span>):</td>
2969 </tr>
2970 <tr>
2971 <td id="L548" class="blob-num js-line-number" data-line-number="548"></td>
2972 <td id="LC548" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">=</span> <span class="pl-c1">IQM_HEADER</span>.size</td>
2973 </tr>
2974 <tr>
2975 <td id="L549" class="blob-num js-line-number" data-line-number="549"></td>
2976 <td id="LC549" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.textdata:</td>
2977 </tr>
2978 <tr>
2979 <td id="L550" class="blob-num js-line-number" data-line-number="550"></td>
2980 <td id="LC550" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">while</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.textdata) <span class="pl-k">%</span> <span class="pl-c1">4</span>:</td>
2981 </tr>
2982 <tr>
2983 <td id="L551" class="blob-num js-line-number" data-line-number="551"></td>
2984 <td id="LC551" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.textdata <span class="pl-k">+=</span> <span class="pl-s"><span class="pl-k">b</span><span class="pl-pds">'</span><span class="pl-cce">\x00</span><span class="pl-pds">'</span></span></td>
2985 </tr>
2986 <tr>
2987 <td id="L552" class="blob-num js-line-number" data-line-number="552"></td>
2988 <td id="LC552" class="blob-code blob-code-inner js-file-line"> ofs_text <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
2989 </tr>
2990 <tr>
2991 <td id="L553" class="blob-num js-line-number" data-line-number="553"></td>
2992 <td id="LC553" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.textdata)</td>
2993 </tr>
2994 <tr>
2995 <td id="L554" class="blob-num js-line-number" data-line-number="554"></td>
2996 <td id="LC554" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
2997 </tr>
2998 <tr>
2999 <td id="L555" class="blob-num js-line-number" data-line-number="555"></td>
3000 <td id="LC555" class="blob-code blob-code-inner js-file-line"> ofs_text <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3001 </tr>
3002 <tr>
3003 <td id="L556" class="blob-num js-line-number" data-line-number="556"></td>
3004 <td id="LC556" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.meshdata:</td>
3005 </tr>
3006 <tr>
3007 <td id="L557" class="blob-num js-line-number" data-line-number="557"></td>
3008 <td id="LC557" class="blob-code blob-code-inner js-file-line"> ofs_meshes <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
3009 </tr>
3010 <tr>
3011 <td id="L558" class="blob-num js-line-number" data-line-number="558"></td>
3012 <td id="LC558" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.meshdata) <span class="pl-k">*</span> <span class="pl-c1">IQM_MESH</span>.size</td>
3013 </tr>
3014 <tr>
3015 <td id="L559" class="blob-num js-line-number" data-line-number="559"></td>
3016 <td id="LC559" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
3017 </tr>
3018 <tr>
3019 <td id="L560" class="blob-num js-line-number" data-line-number="560"></td>
3020 <td id="LC560" class="blob-code blob-code-inner js-file-line"> ofs_meshes <span class="pl-k">=</span> <span class="pl-c1">0</span> </td>
3021 </tr>
3022 <tr>
3023 <td id="L561" class="blob-num js-line-number" data-line-number="561"></td>
3024 <td id="LC561" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
3025 </tr>
3026 <tr>
3027 <td id="L562" class="blob-num js-line-number" data-line-number="562"></td>
3028 <td id="LC562" class="blob-code blob-code-inner js-file-line"> ofs_vertexarrays <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
3029 </tr>
3030 <tr>
3031 <td id="L563" class="blob-num js-line-number" data-line-number="563"></td>
3032 <td id="LC563" class="blob-code blob-code-inner js-file-line"> num_vertexarrays <span class="pl-k">=</span> <span class="pl-c1">4</span></td>
3033 </tr>
3034 <tr>
3035 <td id="L564" class="blob-num js-line-number" data-line-number="564"></td>
3036 <td id="LC564" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.joints:</td>
3037 </tr>
3038 <tr>
3039 <td id="L565" class="blob-num js-line-number" data-line-number="565"></td>
3040 <td id="LC565" class="blob-code blob-code-inner js-file-line"> num_vertexarrays <span class="pl-k">+=</span> <span class="pl-c1">2</span></td>
3041 </tr>
3042 <tr>
3043 <td id="L566" class="blob-num js-line-number" data-line-number="566"></td>
3044 <td id="LC566" class="blob-code blob-code-inner js-file-line"> hascolors <span class="pl-k">=</span> <span class="pl-c1">any</span>(mesh.verts <span class="pl-k">and</span> mesh.verts[<span class="pl-c1">0</span>].color <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshes)</td>
3045 </tr>
3046 <tr>
3047 <td id="L567" class="blob-num js-line-number" data-line-number="567"></td>
3048 <td id="LC567" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> hascolors:</td>
3049 </tr>
3050 <tr>
3051 <td id="L568" class="blob-num js-line-number" data-line-number="568"></td>
3052 <td id="LC568" class="blob-code blob-code-inner js-file-line"> num_vertexarrays <span class="pl-k">+=</span> <span class="pl-c1">1</span></td>
3053 </tr>
3054 <tr>
3055 <td id="L569" class="blob-num js-line-number" data-line-number="569"></td>
3056 <td id="LC569" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> num_vertexarrays <span class="pl-k">*</span> <span class="pl-c1">IQM_VERTEXARRAY</span>.size</td>
3057 </tr>
3058 <tr>
3059 <td id="L570" class="blob-num js-line-number" data-line-number="570"></td>
3060 <td id="LC570" class="blob-code blob-code-inner js-file-line"> ofs_vdata <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
3061 </tr>
3062 <tr>
3063 <td id="L571" class="blob-num js-line-number" data-line-number="571"></td>
3064 <td id="LC571" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><3f2f3f4f<span class="pl-pds">'</span></span>)</td>
3065 </tr>
3066 <tr>
3067 <td id="L572" class="blob-num js-line-number" data-line-number="572"></td>
3068 <td id="LC572" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.joints:</td>
3069 </tr>
3070 <tr>
3071 <td id="L573" class="blob-num js-line-number" data-line-number="573"></td>
3072 <td id="LC573" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><4B4B<span class="pl-pds">'</span></span>)</td>
3073 </tr>
3074 <tr>
3075 <td id="L574" class="blob-num js-line-number" data-line-number="574"></td>
3076 <td id="LC574" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> hascolors:</td>
3077 </tr>
3078 <tr>
3079 <td id="L575" class="blob-num js-line-number" data-line-number="575"></td>
3080 <td id="LC575" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><4B<span class="pl-pds">'</span></span>) </td>
3081 </tr>
3082 <tr>
3083 <td id="L576" class="blob-num js-line-number" data-line-number="576"></td>
3084 <td id="LC576" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
3085 </tr>
3086 <tr>
3087 <td id="L577" class="blob-num js-line-number" data-line-number="577"></td>
3088 <td id="LC577" class="blob-code blob-code-inner js-file-line"> ofs_vertexarrays <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3089 </tr>
3090 <tr>
3091 <td id="L578" class="blob-num js-line-number" data-line-number="578"></td>
3092 <td id="LC578" class="blob-code blob-code-inner js-file-line"> num_vertexarrays <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3093 </tr>
3094 <tr>
3095 <td id="L579" class="blob-num js-line-number" data-line-number="579"></td>
3096 <td id="LC579" class="blob-code blob-code-inner js-file-line"> ofs_vdata <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3097 </tr>
3098 <tr>
3099 <td id="L580" class="blob-num js-line-number" data-line-number="580"></td>
3100 <td id="LC580" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.numtris <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
3101 </tr>
3102 <tr>
3103 <td id="L581" class="blob-num js-line-number" data-line-number="581"></td>
3104 <td id="LC581" class="blob-code blob-code-inner js-file-line"> ofs_triangles <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
3105 </tr>
3106 <tr>
3107 <td id="L582" class="blob-num js-line-number" data-line-number="582"></td>
3108 <td id="LC582" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numtris <span class="pl-k">*</span> <span class="pl-c1">IQM_TRIANGLE</span>.size</td>
3109 </tr>
3110 <tr>
3111 <td id="L583" class="blob-num js-line-number" data-line-number="583"></td>
3112 <td id="LC583" class="blob-code blob-code-inner js-file-line"> ofs_neighbors <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
3113 </tr>
3114 <tr>
3115 <td id="L584" class="blob-num js-line-number" data-line-number="584"></td>
3116 <td id="LC584" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numtris <span class="pl-k">*</span> <span class="pl-c1">IQM_TRIANGLE</span>.size</td>
3117 </tr>
3118 <tr>
3119 <td id="L585" class="blob-num js-line-number" data-line-number="585"></td>
3120 <td id="LC585" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
3121 </tr>
3122 <tr>
3123 <td id="L586" class="blob-num js-line-number" data-line-number="586"></td>
3124 <td id="LC586" class="blob-code blob-code-inner js-file-line"> ofs_triangles <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3125 </tr>
3126 <tr>
3127 <td id="L587" class="blob-num js-line-number" data-line-number="587"></td>
3128 <td id="LC587" class="blob-code blob-code-inner js-file-line"> ofs_neighbors <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3129 </tr>
3130 <tr>
3131 <td id="L588" class="blob-num js-line-number" data-line-number="588"></td>
3132 <td id="LC588" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.jointdata:</td>
3133 </tr>
3134 <tr>
3135 <td id="L589" class="blob-num js-line-number" data-line-number="589"></td>
3136 <td id="LC589" class="blob-code blob-code-inner js-file-line"> ofs_joints <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
3137 </tr>
3138 <tr>
3139 <td id="L590" class="blob-num js-line-number" data-line-number="590"></td>
3140 <td id="LC590" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.jointdata) <span class="pl-k">*</span> <span class="pl-c1">IQM_JOINT</span>.size</td>
3141 </tr>
3142 <tr>
3143 <td id="L591" class="blob-num js-line-number" data-line-number="591"></td>
3144 <td id="LC591" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
3145 </tr>
3146 <tr>
3147 <td id="L592" class="blob-num js-line-number" data-line-number="592"></td>
3148 <td id="LC592" class="blob-code blob-code-inner js-file-line"> ofs_joints <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3149 </tr>
3150 <tr>
3151 <td id="L593" class="blob-num js-line-number" data-line-number="593"></td>
3152 <td id="LC593" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.posedata:</td>
3153 </tr>
3154 <tr>
3155 <td id="L594" class="blob-num js-line-number" data-line-number="594"></td>
3156 <td id="LC594" class="blob-code blob-code-inner js-file-line"> ofs_poses <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
3157 </tr>
3158 <tr>
3159 <td id="L595" class="blob-num js-line-number" data-line-number="595"></td>
3160 <td id="LC595" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.posedata) <span class="pl-k">*</span> <span class="pl-c1">IQM_POSE</span>.size</td>
3161 </tr>
3162 <tr>
3163 <td id="L596" class="blob-num js-line-number" data-line-number="596"></td>
3164 <td id="LC596" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
3165 </tr>
3166 <tr>
3167 <td id="L597" class="blob-num js-line-number" data-line-number="597"></td>
3168 <td id="LC597" class="blob-code blob-code-inner js-file-line"> ofs_poses <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3169 </tr>
3170 <tr>
3171 <td id="L598" class="blob-num js-line-number" data-line-number="598"></td>
3172 <td id="LC598" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.animdata:</td>
3173 </tr>
3174 <tr>
3175 <td id="L599" class="blob-num js-line-number" data-line-number="599"></td>
3176 <td id="LC599" class="blob-code blob-code-inner js-file-line"> ofs_anims <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
3177 </tr>
3178 <tr>
3179 <td id="L600" class="blob-num js-line-number" data-line-number="600"></td>
3180 <td id="LC600" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.animdata) <span class="pl-k">*</span> <span class="pl-c1">IQM_ANIMATION</span>.size</td>
3181 </tr>
3182 <tr>
3183 <td id="L601" class="blob-num js-line-number" data-line-number="601"></td>
3184 <td id="LC601" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
3185 </tr>
3186 <tr>
3187 <td id="L602" class="blob-num js-line-number" data-line-number="602"></td>
3188 <td id="LC602" class="blob-code blob-code-inner js-file-line"> ofs_anims <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3189 </tr>
3190 <tr>
3191 <td id="L603" class="blob-num js-line-number" data-line-number="603"></td>
3192 <td id="LC603" class="blob-code blob-code-inner js-file-line"> falign <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3193 </tr>
3194 <tr>
3195 <td id="L604" class="blob-num js-line-number" data-line-number="604"></td>
3196 <td id="LC604" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.framesize <span class="pl-k">*</span> <span class="pl-c1">self</span>.numframes <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
3197 </tr>
3198 <tr>
3199 <td id="L605" class="blob-num js-line-number" data-line-number="605"></td>
3200 <td id="LC605" class="blob-code blob-code-inner js-file-line"> ofs_frames <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
3201 </tr>
3202 <tr>
3203 <td id="L606" class="blob-num js-line-number" data-line-number="606"></td>
3204 <td id="LC606" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">self</span>.framesize <span class="pl-k">*</span> <span class="pl-c1">self</span>.numframes <span class="pl-k">*</span> struct.calcsize(<span class="pl-s"><span class="pl-pds">'</span><H<span class="pl-pds">'</span></span>)</td>
3205 </tr>
3206 <tr>
3207 <td id="L607" class="blob-num js-line-number" data-line-number="607"></td>
3208 <td id="LC607" class="blob-code blob-code-inner js-file-line"> falign <span class="pl-k">=</span> (<span class="pl-c1">4</span> <span class="pl-k">-</span> (<span class="pl-c1">self</span>.filesize <span class="pl-k">%</span> <span class="pl-c1">4</span>)) <span class="pl-k">%</span> <span class="pl-c1">4</span></td>
3209 </tr>
3210 <tr>
3211 <td id="L608" class="blob-num js-line-number" data-line-number="608"></td>
3212 <td id="LC608" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> falign</td>
3213 </tr>
3214 <tr>
3215 <td id="L609" class="blob-num js-line-number" data-line-number="609"></td>
3216 <td id="LC609" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
3217 </tr>
3218 <tr>
3219 <td id="L610" class="blob-num js-line-number" data-line-number="610"></td>
3220 <td id="LC610" class="blob-code blob-code-inner js-file-line"> ofs_frames <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3221 </tr>
3222 <tr>
3223 <td id="L611" class="blob-num js-line-number" data-line-number="611"></td>
3224 <td id="LC611" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> usebbox <span class="pl-k">and</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">></span> <span class="pl-c1">0</span> <span class="pl-k">and</span> <span class="pl-c1">self</span>.numframes <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
3225 </tr>
3226 <tr>
3227 <td id="L612" class="blob-num js-line-number" data-line-number="612"></td>
3228 <td id="LC612" class="blob-code blob-code-inner js-file-line"> ofs_bounds <span class="pl-k">=</span> <span class="pl-c1">self</span>.filesize</td>
3229 </tr>
3230 <tr>
3231 <td id="L613" class="blob-num js-line-number" data-line-number="613"></td>
3232 <td id="LC613" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filesize <span class="pl-k">+=</span> <span class="pl-c1">self</span>.numframes <span class="pl-k">*</span> <span class="pl-c1">IQM_BOUNDS</span>.size</td>
3233 </tr>
3234 <tr>
3235 <td id="L614" class="blob-num js-line-number" data-line-number="614"></td>
3236 <td id="LC614" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
3237 </tr>
3238 <tr>
3239 <td id="L615" class="blob-num js-line-number" data-line-number="615"></td>
3240 <td id="LC615" class="blob-code blob-code-inner js-file-line"> ofs_bounds <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
3241 </tr>
3242 <tr>
3243 <td id="L616" class="blob-num js-line-number" data-line-number="616"></td>
3244 <td id="LC616" class="blob-code blob-code-inner js-file-line">
3245</td>
3246 </tr>
3247 <tr>
3248 <td id="L617" class="blob-num js-line-number" data-line-number="617"></td>
3249 <td id="LC617" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_HEADER</span>.pack(<span class="pl-s"><span class="pl-pds">'</span>INTERQUAKEMODEL<span class="pl-pds">'</span></span>.encode(<span class="pl-s"><span class="pl-pds">'</span>ascii<span class="pl-pds">'</span></span>), <span class="pl-c1">2</span>, <span class="pl-c1">self</span>.filesize, <span class="pl-c1">0</span>, <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.textdata), ofs_text, <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.meshdata), ofs_meshes, num_vertexarrays, <span class="pl-c1">self</span>.numverts, ofs_vertexarrays, <span class="pl-c1">self</span>.numtris, ofs_triangles, ofs_neighbors, <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.jointdata), ofs_joints, <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.posedata), ofs_poses, <span class="pl-c1">len</span>(<span class="pl-c1">self</span>.animdata), ofs_anims, <span class="pl-c1">self</span>.numframes, <span class="pl-c1">self</span>.framesize, ofs_frames, ofs_bounds, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>, <span class="pl-c1">0</span>))</td>
3250 </tr>
3251 <tr>
3252 <td id="L618" class="blob-num js-line-number" data-line-number="618"></td>
3253 <td id="LC618" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">self</span>.textdata)</td>
3254 </tr>
3255 <tr>
3256 <td id="L619" class="blob-num js-line-number" data-line-number="619"></td>
3257 <td id="LC619" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> <span class="pl-c1">self</span>.meshdata:</td>
3258 </tr>
3259 <tr>
3260 <td id="L620" class="blob-num js-line-number" data-line-number="620"></td>
3261 <td id="LC620" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_MESH</span>.pack(<span class="pl-k">*</span>mesh))</td>
3262 </tr>
3263 <tr>
3264 <td id="L621" class="blob-num js-line-number" data-line-number="621"></td>
3265 <td id="LC621" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.writeVerts(<span class="pl-v">file</span>, ofs_vdata)</td>
3266 </tr>
3267 <tr>
3268 <td id="L622" class="blob-num js-line-number" data-line-number="622"></td>
3269 <td id="LC622" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.writeTris(<span class="pl-v">file</span>)</td>
3270 </tr>
3271 <tr>
3272 <td id="L623" class="blob-num js-line-number" data-line-number="623"></td>
3273 <td id="LC623" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> joint <span class="pl-k">in</span> <span class="pl-c1">self</span>.jointdata:</td>
3274 </tr>
3275 <tr>
3276 <td id="L624" class="blob-num js-line-number" data-line-number="624"></td>
3277 <td id="LC624" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_JOINT</span>.pack(<span class="pl-k">*</span>joint))</td>
3278 </tr>
3279 <tr>
3280 <td id="L625" class="blob-num js-line-number" data-line-number="625"></td>
3281 <td id="LC625" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> pose <span class="pl-k">in</span> <span class="pl-c1">self</span>.posedata:</td>
3282 </tr>
3283 <tr>
3284 <td id="L626" class="blob-num js-line-number" data-line-number="626"></td>
3285 <td id="LC626" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_POSE</span>.pack(<span class="pl-k">*</span>pose))</td>
3286 </tr>
3287 <tr>
3288 <td id="L627" class="blob-num js-line-number" data-line-number="627"></td>
3289 <td id="LC627" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> anim <span class="pl-k">in</span> <span class="pl-c1">self</span>.animdata:</td>
3290 </tr>
3291 <tr>
3292 <td id="L628" class="blob-num js-line-number" data-line-number="628"></td>
3293 <td id="LC628" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-c1">IQM_ANIMATION</span>.pack(<span class="pl-k">*</span>anim))</td>
3294 </tr>
3295 <tr>
3296 <td id="L629" class="blob-num js-line-number" data-line-number="629"></td>
3297 <td id="LC629" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> anim <span class="pl-k">in</span> <span class="pl-c1">self</span>.anims:</td>
3298 </tr>
3299 <tr>
3300 <td id="L630" class="blob-num js-line-number" data-line-number="630"></td>
3301 <td id="LC630" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(anim.frameData(<span class="pl-c1">self</span>.joints))</td>
3302 </tr>
3303 <tr>
3304 <td id="L631" class="blob-num js-line-number" data-line-number="631"></td>
3305 <td id="LC631" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-k">b</span><span class="pl-pds">'</span><span class="pl-cce">\x00</span><span class="pl-pds">'</span></span> <span class="pl-k">*</span> falign)</td>
3306 </tr>
3307 <tr>
3308 <td id="L632" class="blob-num js-line-number" data-line-number="632"></td>
3309 <td id="LC632" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> usebbox <span class="pl-k">and</span> <span class="pl-c1">self</span>.numverts <span class="pl-k">></span> <span class="pl-c1">0</span> <span class="pl-k">and</span> <span class="pl-c1">self</span>.numframes <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
3310 </tr>
3311 <tr>
3312 <td id="L633" class="blob-num js-line-number" data-line-number="633"></td>
3313 <td id="LC633" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> anim <span class="pl-k">in</span> <span class="pl-c1">self</span>.anims:</td>
3314 </tr>
3315 <tr>
3316 <td id="L634" class="blob-num js-line-number" data-line-number="634"></td>
3317 <td id="LC634" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(anim.boundsData(<span class="pl-c1">self</span>.joints, <span class="pl-c1">self</span>.meshes))</td>
3318 </tr>
3319 <tr>
3320 <td id="L635" class="blob-num js-line-number" data-line-number="635"></td>
3321 <td id="LC635" class="blob-code blob-code-inner js-file-line">
3322</td>
3323 </tr>
3324 <tr>
3325 <td id="L636" class="blob-num js-line-number" data-line-number="636"></td>
3326 <td id="LC636" class="blob-code blob-code-inner js-file-line">
3327</td>
3328 </tr>
3329 <tr>
3330 <td id="L637" class="blob-num js-line-number" data-line-number="637"></td>
3331 <td id="LC637" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">findArmature</span>(<span class="pl-smi">context</span>):</td>
3332 </tr>
3333 <tr>
3334 <td id="L638" class="blob-num js-line-number" data-line-number="638"></td>
3335 <td id="LC638" class="blob-code blob-code-inner js-file-line"> armature <span class="pl-k">=</span> <span class="pl-c1">None</span></td>
3336 </tr>
3337 <tr>
3338 <td id="L639" class="blob-num js-line-number" data-line-number="639"></td>
3339 <td id="LC639" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> obj <span class="pl-k">in</span> context.selected_objects:</td>
3340 </tr>
3341 <tr>
3342 <td id="L640" class="blob-num js-line-number" data-line-number="640"></td>
3343 <td id="LC640" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> obj.type <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>ARMATURE<span class="pl-pds">'</span></span>:</td>
3344 </tr>
3345 <tr>
3346 <td id="L641" class="blob-num js-line-number" data-line-number="641"></td>
3347 <td id="LC641" class="blob-code blob-code-inner js-file-line"> armature <span class="pl-k">=</span> obj</td>
3348 </tr>
3349 <tr>
3350 <td id="L642" class="blob-num js-line-number" data-line-number="642"></td>
3351 <td id="LC642" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">break</span></td>
3352 </tr>
3353 <tr>
3354 <td id="L643" class="blob-num js-line-number" data-line-number="643"></td>
3355 <td id="LC643" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> armature:</td>
3356 </tr>
3357 <tr>
3358 <td id="L644" class="blob-num js-line-number" data-line-number="644"></td>
3359 <td id="LC644" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> obj <span class="pl-k">in</span> context.selected_objects:</td>
3360 </tr>
3361 <tr>
3362 <td id="L645" class="blob-num js-line-number" data-line-number="645"></td>
3363 <td id="LC645" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> obj.type <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>MESH<span class="pl-pds">'</span></span>:</td>
3364 </tr>
3365 <tr>
3366 <td id="L646" class="blob-num js-line-number" data-line-number="646"></td>
3367 <td id="LC646" class="blob-code blob-code-inner js-file-line"> armature <span class="pl-k">=</span> obj.find_armature()</td>
3368 </tr>
3369 <tr>
3370 <td id="L647" class="blob-num js-line-number" data-line-number="647"></td>
3371 <td id="LC647" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> armature:</td>
3372 </tr>
3373 <tr>
3374 <td id="L648" class="blob-num js-line-number" data-line-number="648"></td>
3375 <td id="LC648" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">break</span></td>
3376 </tr>
3377 <tr>
3378 <td id="L649" class="blob-num js-line-number" data-line-number="649"></td>
3379 <td id="LC649" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> armature</td>
3380 </tr>
3381 <tr>
3382 <td id="L650" class="blob-num js-line-number" data-line-number="650"></td>
3383 <td id="LC650" class="blob-code blob-code-inner js-file-line">
3384</td>
3385 </tr>
3386 <tr>
3387 <td id="L651" class="blob-num js-line-number" data-line-number="651"></td>
3388 <td id="LC651" class="blob-code blob-code-inner js-file-line">
3389</td>
3390 </tr>
3391 <tr>
3392 <td id="L652" class="blob-num js-line-number" data-line-number="652"></td>
3393 <td id="LC652" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">derigifyBones</span>(<span class="pl-smi">context</span>, <span class="pl-smi">armature</span>, <span class="pl-smi">scale</span>):</td>
3394 </tr>
3395 <tr>
3396 <td id="L653" class="blob-num js-line-number" data-line-number="653"></td>
3397 <td id="LC653" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">=</span> armature.data</td>
3398 </tr>
3399 <tr>
3400 <td id="L654" class="blob-num js-line-number" data-line-number="654"></td>
3401 <td id="LC654" class="blob-code blob-code-inner js-file-line">
3402</td>
3403 </tr>
3404 <tr>
3405 <td id="L655" class="blob-num js-line-number" data-line-number="655"></td>
3406 <td id="LC655" class="blob-code blob-code-inner js-file-line"> defnames <span class="pl-k">=</span> []</td>
3407 </tr>
3408 <tr>
3409 <td id="L656" class="blob-num js-line-number" data-line-number="656"></td>
3410 <td id="LC656" class="blob-code blob-code-inner js-file-line"> orgbones <span class="pl-k">=</span> {}</td>
3411 </tr>
3412 <tr>
3413 <td id="L657" class="blob-num js-line-number" data-line-number="657"></td>
3414 <td id="LC657" class="blob-code blob-code-inner js-file-line"> defbones <span class="pl-k">=</span> {}</td>
3415 </tr>
3416 <tr>
3417 <td id="L658" class="blob-num js-line-number" data-line-number="658"></td>
3418 <td id="LC658" class="blob-code blob-code-inner js-file-line"> org2defs <span class="pl-k">=</span> {}</td>
3419 </tr>
3420 <tr>
3421 <td id="L659" class="blob-num js-line-number" data-line-number="659"></td>
3422 <td id="LC659" class="blob-code blob-code-inner js-file-line"> def2org <span class="pl-k">=</span> {}</td>
3423 </tr>
3424 <tr>
3425 <td id="L660" class="blob-num js-line-number" data-line-number="660"></td>
3426 <td id="LC660" class="blob-code blob-code-inner js-file-line"> defparent <span class="pl-k">=</span> {}</td>
3427 </tr>
3428 <tr>
3429 <td id="L661" class="blob-num js-line-number" data-line-number="661"></td>
3430 <td id="LC661" class="blob-code blob-code-inner js-file-line"> defchildren <span class="pl-k">=</span> {}</td>
3431 </tr>
3432 <tr>
3433 <td id="L662" class="blob-num js-line-number" data-line-number="662"></td>
3434 <td id="LC662" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> bone <span class="pl-k">in</span> data.bones.values():</td>
3435 </tr>
3436 <tr>
3437 <td id="L663" class="blob-num js-line-number" data-line-number="663"></td>
3438 <td id="LC663" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.name.startswith(<span class="pl-s"><span class="pl-pds">'</span>ORG-<span class="pl-pds">'</span></span>):</td>
3439 </tr>
3440 <tr>
3441 <td id="L664" class="blob-num js-line-number" data-line-number="664"></td>
3442 <td id="LC664" class="blob-code blob-code-inner js-file-line"> orgbones[bone.name[<span class="pl-c1">4</span>:]] <span class="pl-k">=</span> bone</td>
3443 </tr>
3444 <tr>
3445 <td id="L665" class="blob-num js-line-number" data-line-number="665"></td>
3446 <td id="LC665" class="blob-code blob-code-inner js-file-line"> org2defs[bone.name[<span class="pl-c1">4</span>:]] <span class="pl-k">=</span> []</td>
3447 </tr>
3448 <tr>
3449 <td id="L666" class="blob-num js-line-number" data-line-number="666"></td>
3450 <td id="LC666" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">elif</span> bone.name.startswith(<span class="pl-s"><span class="pl-pds">'</span>DEF-<span class="pl-pds">'</span></span>):</td>
3451 </tr>
3452 <tr>
3453 <td id="L667" class="blob-num js-line-number" data-line-number="667"></td>
3454 <td id="LC667" class="blob-code blob-code-inner js-file-line"> defnames.append(bone.name[<span class="pl-c1">4</span>:])</td>
3455 </tr>
3456 <tr>
3457 <td id="L668" class="blob-num js-line-number" data-line-number="668"></td>
3458 <td id="LC668" class="blob-code blob-code-inner js-file-line"> defbones[bone.name[<span class="pl-c1">4</span>:]] <span class="pl-k">=</span> bone</td>
3459 </tr>
3460 <tr>
3461 <td id="L669" class="blob-num js-line-number" data-line-number="669"></td>
3462 <td id="LC669" class="blob-code blob-code-inner js-file-line"> defchildren[bone.name[<span class="pl-c1">4</span>:]] <span class="pl-k">=</span> []</td>
3463 </tr>
3464 <tr>
3465 <td id="L670" class="blob-num js-line-number" data-line-number="670"></td>
3466 <td id="LC670" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> name, bone <span class="pl-k">in</span> defbones.items():</td>
3467 </tr>
3468 <tr>
3469 <td id="L671" class="blob-num js-line-number" data-line-number="671"></td>
3470 <td id="LC671" class="blob-code blob-code-inner js-file-line"> orgname <span class="pl-k">=</span> name</td>
3471 </tr>
3472 <tr>
3473 <td id="L672" class="blob-num js-line-number" data-line-number="672"></td>
3474 <td id="LC672" class="blob-code blob-code-inner js-file-line"> orgbone <span class="pl-k">=</span> orgbones.get(orgname)</td>
3475 </tr>
3476 <tr>
3477 <td id="L673" class="blob-num js-line-number" data-line-number="673"></td>
3478 <td id="LC673" class="blob-code blob-code-inner js-file-line"> splitname <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
3479 </tr>
3480 <tr>
3481 <td id="L674" class="blob-num js-line-number" data-line-number="674"></td>
3482 <td id="LC674" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> orgbone:</td>
3483 </tr>
3484 <tr>
3485 <td id="L675" class="blob-num js-line-number" data-line-number="675"></td>
3486 <td id="LC675" class="blob-code blob-code-inner js-file-line"> splitname <span class="pl-k">=</span> name.rfind(<span class="pl-s"><span class="pl-pds">'</span>.<span class="pl-pds">'</span></span>)</td>
3487 </tr>
3488 <tr>
3489 <td id="L676" class="blob-num js-line-number" data-line-number="676"></td>
3490 <td id="LC676" class="blob-code blob-code-inner js-file-line"> suffix <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">'</span><span class="pl-pds">'</span></span></td>
3491 </tr>
3492 <tr>
3493 <td id="L677" class="blob-num js-line-number" data-line-number="677"></td>
3494 <td id="LC677" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> splitname <span class="pl-k">>=</span> <span class="pl-c1">0</span> <span class="pl-k">and</span> name[splitname<span class="pl-k">+</span><span class="pl-c1">1</span>:] <span class="pl-k">in</span> [ <span class="pl-s"><span class="pl-pds">'</span>l<span class="pl-pds">'</span></span>, <span class="pl-s"><span class="pl-pds">'</span>r<span class="pl-pds">'</span></span>, <span class="pl-s"><span class="pl-pds">'</span>L<span class="pl-pds">'</span></span>, <span class="pl-s"><span class="pl-pds">'</span>R<span class="pl-pds">'</span></span> ]:</td>
3495 </tr>
3496 <tr>
3497 <td id="L678" class="blob-num js-line-number" data-line-number="678"></td>
3498 <td id="LC678" class="blob-code blob-code-inner js-file-line"> suffix <span class="pl-k">=</span> name[splitname:]</td>
3499 </tr>
3500 <tr>
3501 <td id="L679" class="blob-num js-line-number" data-line-number="679"></td>
3502 <td id="LC679" class="blob-code blob-code-inner js-file-line"> splitname <span class="pl-k">=</span> name.rfind(<span class="pl-s"><span class="pl-pds">'</span>.<span class="pl-pds">'</span></span>, <span class="pl-c1">0</span>, splitname)</td>
3503 </tr>
3504 <tr>
3505 <td id="L680" class="blob-num js-line-number" data-line-number="680"></td>
3506 <td id="LC680" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> splitname <span class="pl-k">>=</span> <span class="pl-c1">0</span> <span class="pl-k">and</span> name[splitname<span class="pl-k">+</span><span class="pl-c1">1</span>:splitname<span class="pl-k">+</span><span class="pl-c1">2</span>].isdigit():</td>
3507 </tr>
3508 <tr>
3509 <td id="L681" class="blob-num js-line-number" data-line-number="681"></td>
3510 <td id="LC681" class="blob-code blob-code-inner js-file-line"> orgname <span class="pl-k">=</span> name[:splitname] <span class="pl-k">+</span> suffix</td>
3511 </tr>
3512 <tr>
3513 <td id="L682" class="blob-num js-line-number" data-line-number="682"></td>
3514 <td id="LC682" class="blob-code blob-code-inner js-file-line"> orgbone <span class="pl-k">=</span> orgbones.get(orgname)</td>
3515 </tr>
3516 <tr>
3517 <td id="L683" class="blob-num js-line-number" data-line-number="683"></td>
3518 <td id="LC683" class="blob-code blob-code-inner js-file-line"> org2defs[orgname].append(name)</td>
3519 </tr>
3520 <tr>
3521 <td id="L684" class="blob-num js-line-number" data-line-number="684"></td>
3522 <td id="LC684" class="blob-code blob-code-inner js-file-line"> def2org[name] <span class="pl-k">=</span> orgname</td>
3523 </tr>
3524 <tr>
3525 <td id="L685" class="blob-num js-line-number" data-line-number="685"></td>
3526 <td id="LC685" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> defs <span class="pl-k">in</span> org2defs.values():</td>
3527 </tr>
3528 <tr>
3529 <td id="L686" class="blob-num js-line-number" data-line-number="686"></td>
3530 <td id="LC686" class="blob-code blob-code-inner js-file-line"> defs.sort()</td>
3531 </tr>
3532 <tr>
3533 <td id="L687" class="blob-num js-line-number" data-line-number="687"></td>
3534 <td id="LC687" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> name <span class="pl-k">in</span> defnames:</td>
3535 </tr>
3536 <tr>
3537 <td id="L688" class="blob-num js-line-number" data-line-number="688"></td>
3538 <td id="LC688" class="blob-code blob-code-inner js-file-line"> bone <span class="pl-k">=</span> defbones[name]</td>
3539 </tr>
3540 <tr>
3541 <td id="L689" class="blob-num js-line-number" data-line-number="689"></td>
3542 <td id="LC689" class="blob-code blob-code-inner js-file-line"> orgname <span class="pl-k">=</span> def2org[name]</td>
3543 </tr>
3544 <tr>
3545 <td id="L690" class="blob-num js-line-number" data-line-number="690"></td>
3546 <td id="LC690" class="blob-code blob-code-inner js-file-line"> orgbone <span class="pl-k">=</span> orgbones.get(orgname)</td>
3547 </tr>
3548 <tr>
3549 <td id="L691" class="blob-num js-line-number" data-line-number="691"></td>
3550 <td id="LC691" class="blob-code blob-code-inner js-file-line"> defs <span class="pl-k">=</span> org2defs[orgname]</td>
3551 </tr>
3552 <tr>
3553 <td id="L692" class="blob-num js-line-number" data-line-number="692"></td>
3554 <td id="LC692" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> orgbone:</td>
3555 </tr>
3556 <tr>
3557 <td id="L693" class="blob-num js-line-number" data-line-number="693"></td>
3558 <td id="LC693" class="blob-code blob-code-inner js-file-line"> i <span class="pl-k">=</span> defs.index(name)</td>
3559 </tr>
3560 <tr>
3561 <td id="L694" class="blob-num js-line-number" data-line-number="694"></td>
3562 <td id="LC694" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> i <span class="pl-k">==</span> <span class="pl-c1">0</span>:</td>
3563 </tr>
3564 <tr>
3565 <td id="L695" class="blob-num js-line-number" data-line-number="695"></td>
3566 <td id="LC695" class="blob-code blob-code-inner js-file-line"> orgparent <span class="pl-k">=</span> orgbone.parent</td>
3567 </tr>
3568 <tr>
3569 <td id="L696" class="blob-num js-line-number" data-line-number="696"></td>
3570 <td id="LC696" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> orgparent <span class="pl-k">and</span> orgparent.name.startswith(<span class="pl-s"><span class="pl-pds">'</span>ORG-<span class="pl-pds">'</span></span>):</td>
3571 </tr>
3572 <tr>
3573 <td id="L697" class="blob-num js-line-number" data-line-number="697"></td>
3574 <td id="LC697" class="blob-code blob-code-inner js-file-line"> orgpname <span class="pl-k">=</span> orgparent.name[<span class="pl-c1">4</span>:]</td>
3575 </tr>
3576 <tr>
3577 <td id="L698" class="blob-num js-line-number" data-line-number="698"></td>
3578 <td id="LC698" class="blob-code blob-code-inner js-file-line"> defparent[name] <span class="pl-k">=</span> org2defs[orgpname][<span class="pl-k">-</span><span class="pl-c1">1</span>]</td>
3579 </tr>
3580 <tr>
3581 <td id="L699" class="blob-num js-line-number" data-line-number="699"></td>
3582 <td id="LC699" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
3583 </tr>
3584 <tr>
3585 <td id="L700" class="blob-num js-line-number" data-line-number="700"></td>
3586 <td id="LC700" class="blob-code blob-code-inner js-file-line"> defparent[name] <span class="pl-k">=</span> defs[i<span class="pl-k">-</span><span class="pl-c1">1</span>]</td>
3587 </tr>
3588 <tr>
3589 <td id="L701" class="blob-num js-line-number" data-line-number="701"></td>
3590 <td id="LC701" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> name <span class="pl-k">in</span> defparent:</td>
3591 </tr>
3592 <tr>
3593 <td id="L702" class="blob-num js-line-number" data-line-number="702"></td>
3594 <td id="LC702" class="blob-code blob-code-inner js-file-line"> defchildren[defparent[name]].append(name)</td>
3595 </tr>
3596 <tr>
3597 <td id="L703" class="blob-num js-line-number" data-line-number="703"></td>
3598 <td id="LC703" class="blob-code blob-code-inner js-file-line">
3599</td>
3600 </tr>
3601 <tr>
3602 <td id="L704" class="blob-num js-line-number" data-line-number="704"></td>
3603 <td id="LC704" class="blob-code blob-code-inner js-file-line"> bones <span class="pl-k">=</span> {}</td>
3604 </tr>
3605 <tr>
3606 <td id="L705" class="blob-num js-line-number" data-line-number="705"></td>
3607 <td id="LC705" class="blob-code blob-code-inner js-file-line"> worldmatrix <span class="pl-k">=</span> armature.matrix_world</td>
3608 </tr>
3609 <tr>
3610 <td id="L706" class="blob-num js-line-number" data-line-number="706"></td>
3611 <td id="LC706" class="blob-code blob-code-inner js-file-line"> worklist <span class="pl-k">=</span> [ bone <span class="pl-k">for</span> bone <span class="pl-k">in</span> defnames <span class="pl-k">if</span> bone <span class="pl-k">not</span> <span class="pl-k">in</span> defparent ]</td>
3612 </tr>
3613 <tr>
3614 <td id="L707" class="blob-num js-line-number" data-line-number="707"></td>
3615 <td id="LC707" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> index, bname <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(worklist):</td>
3616 </tr>
3617 <tr>
3618 <td id="L708" class="blob-num js-line-number" data-line-number="708"></td>
3619 <td id="LC708" class="blob-code blob-code-inner js-file-line"> bone <span class="pl-k">=</span> defbones[bname]</td>
3620 </tr>
3621 <tr>
3622 <td id="L709" class="blob-num js-line-number" data-line-number="709"></td>
3623 <td id="LC709" class="blob-code blob-code-inner js-file-line"> bonematrix <span class="pl-k">=</span> worldmatrix <span class="pl-k">@</span> bone.matrix_local</td>
3624 </tr>
3625 <tr>
3626 <td id="L710" class="blob-num js-line-number" data-line-number="710"></td>
3627 <td id="LC710" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> scale <span class="pl-k">!=</span> <span class="pl-c1">1.0</span>:</td>
3628 </tr>
3629 <tr>
3630 <td id="L711" class="blob-num js-line-number" data-line-number="711"></td>
3631 <td id="LC711" class="blob-code blob-code-inner js-file-line"> bonematrix.translation <span class="pl-k">*=</span> scale</td>
3632 </tr>
3633 <tr>
3634 <td id="L712" class="blob-num js-line-number" data-line-number="712"></td>
3635 <td id="LC712" class="blob-code blob-code-inner js-file-line"> bones[bone.name] <span class="pl-k">=</span> Bone(bname, bone.name, index, bname <span class="pl-k">in</span> defparent <span class="pl-k">and</span> bones.get(defbones[defparent[bname]].name), bonematrix)</td>
3636 </tr>
3637 <tr>
3638 <td id="L713" class="blob-num js-line-number" data-line-number="713"></td>
3639 <td id="LC713" class="blob-code blob-code-inner js-file-line"> worklist.extend(defchildren[bname])</td>
3640 </tr>
3641 <tr>
3642 <td id="L714" class="blob-num js-line-number" data-line-number="714"></td>
3643 <td id="LC714" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>De-rigified <span class="pl-c1">%d</span> bones<span class="pl-pds">'</span></span> <span class="pl-k">%</span> <span class="pl-c1">len</span>(worklist))</td>
3644 </tr>
3645 <tr>
3646 <td id="L715" class="blob-num js-line-number" data-line-number="715"></td>
3647 <td id="LC715" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> bones</td>
3648 </tr>
3649 <tr>
3650 <td id="L716" class="blob-num js-line-number" data-line-number="716"></td>
3651 <td id="LC716" class="blob-code blob-code-inner js-file-line">
3652</td>
3653 </tr>
3654 <tr>
3655 <td id="L717" class="blob-num js-line-number" data-line-number="717"></td>
3656 <td id="LC717" class="blob-code blob-code-inner js-file-line">
3657</td>
3658 </tr>
3659 <tr>
3660 <td id="L718" class="blob-num js-line-number" data-line-number="718"></td>
3661 <td id="LC718" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">collectBones</span>(<span class="pl-smi">context</span>, <span class="pl-smi">armature</span>, <span class="pl-smi">scale</span>):</td>
3662 </tr>
3663 <tr>
3664 <td id="L719" class="blob-num js-line-number" data-line-number="719"></td>
3665 <td id="LC719" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">=</span> armature.data</td>
3666 </tr>
3667 <tr>
3668 <td id="L720" class="blob-num js-line-number" data-line-number="720"></td>
3669 <td id="LC720" class="blob-code blob-code-inner js-file-line"> bones <span class="pl-k">=</span> {}</td>
3670 </tr>
3671 <tr>
3672 <td id="L721" class="blob-num js-line-number" data-line-number="721"></td>
3673 <td id="LC721" class="blob-code blob-code-inner js-file-line"> worldmatrix <span class="pl-k">=</span> armature.matrix_world</td>
3674 </tr>
3675 <tr>
3676 <td id="L722" class="blob-num js-line-number" data-line-number="722"></td>
3677 <td id="LC722" class="blob-code blob-code-inner js-file-line"> worklist <span class="pl-k">=</span> [ bone <span class="pl-k">for</span> bone <span class="pl-k">in</span> data.bones.values() <span class="pl-k">if</span> <span class="pl-k">not</span> bone.parent ]</td>
3678 </tr>
3679 <tr>
3680 <td id="L723" class="blob-num js-line-number" data-line-number="723"></td>
3681 <td id="LC723" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> index, bone <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(worklist):</td>
3682 </tr>
3683 <tr>
3684 <td id="L724" class="blob-num js-line-number" data-line-number="724"></td>
3685 <td id="LC724" class="blob-code blob-code-inner js-file-line"> bonematrix <span class="pl-k">=</span> worldmatrix <span class="pl-k">@</span> bone.matrix_local</td>
3686 </tr>
3687 <tr>
3688 <td id="L725" class="blob-num js-line-number" data-line-number="725"></td>
3689 <td id="LC725" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> scale <span class="pl-k">!=</span> <span class="pl-c1">1.0</span>:</td>
3690 </tr>
3691 <tr>
3692 <td id="L726" class="blob-num js-line-number" data-line-number="726"></td>
3693 <td id="LC726" class="blob-code blob-code-inner js-file-line"> bonematrix.translation <span class="pl-k">*=</span> scale</td>
3694 </tr>
3695 <tr>
3696 <td id="L727" class="blob-num js-line-number" data-line-number="727"></td>
3697 <td id="LC727" class="blob-code blob-code-inner js-file-line"> bones[bone.name] <span class="pl-k">=</span> Bone(bone.name, bone.name, index, bone.parent <span class="pl-k">and</span> bones.get(bone.parent.name), bonematrix)</td>
3698 </tr>
3699 <tr>
3700 <td id="L728" class="blob-num js-line-number" data-line-number="728"></td>
3701 <td id="LC728" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> child <span class="pl-k">in</span> bone.children:</td>
3702 </tr>
3703 <tr>
3704 <td id="L729" class="blob-num js-line-number" data-line-number="729"></td>
3705 <td id="LC729" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> child <span class="pl-k">not</span> <span class="pl-k">in</span> worklist:</td>
3706 </tr>
3707 <tr>
3708 <td id="L730" class="blob-num js-line-number" data-line-number="730"></td>
3709 <td id="LC730" class="blob-code blob-code-inner js-file-line"> worklist.append(child)</td>
3710 </tr>
3711 <tr>
3712 <td id="L731" class="blob-num js-line-number" data-line-number="731"></td>
3713 <td id="LC731" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Collected <span class="pl-c1">%d</span> bones<span class="pl-pds">'</span></span> <span class="pl-k">%</span> <span class="pl-c1">len</span>(worklist))</td>
3714 </tr>
3715 <tr>
3716 <td id="L732" class="blob-num js-line-number" data-line-number="732"></td>
3717 <td id="LC732" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> bones</td>
3718 </tr>
3719 <tr>
3720 <td id="L733" class="blob-num js-line-number" data-line-number="733"></td>
3721 <td id="LC733" class="blob-code blob-code-inner js-file-line">
3722</td>
3723 </tr>
3724 <tr>
3725 <td id="L734" class="blob-num js-line-number" data-line-number="734"></td>
3726 <td id="LC734" class="blob-code blob-code-inner js-file-line">
3727</td>
3728 </tr>
3729 <tr>
3730 <td id="L735" class="blob-num js-line-number" data-line-number="735"></td>
3731 <td id="LC735" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">collectAnim</span>(<span class="pl-smi">context</span>, <span class="pl-smi">armature</span>, <span class="pl-smi">scale</span>, <span class="pl-smi">bones</span>, <span class="pl-smi">action</span>, <span class="pl-smi">startframe</span> <span class="pl-k">=</span> <span class="pl-c1">None</span>, <span class="pl-smi">endframe</span> <span class="pl-k">=</span> <span class="pl-c1">None</span>):</td>
3732 </tr>
3733 <tr>
3734 <td id="L736" class="blob-num js-line-number" data-line-number="736"></td>
3735 <td id="LC736" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> startframe <span class="pl-k">or</span> <span class="pl-k">not</span> endframe:</td>
3736 </tr>
3737 <tr>
3738 <td id="L737" class="blob-num js-line-number" data-line-number="737"></td>
3739 <td id="LC737" class="blob-code blob-code-inner js-file-line"> startframe, endframe <span class="pl-k">=</span> action.frame_range</td>
3740 </tr>
3741 <tr>
3742 <td id="L738" class="blob-num js-line-number" data-line-number="738"></td>
3743 <td id="LC738" class="blob-code blob-code-inner js-file-line"> startframe <span class="pl-k">=</span> <span class="pl-c1">int</span>(startframe)</td>
3744 </tr>
3745 <tr>
3746 <td id="L739" class="blob-num js-line-number" data-line-number="739"></td>
3747 <td id="LC739" class="blob-code blob-code-inner js-file-line"> endframe <span class="pl-k">=</span> <span class="pl-c1">int</span>(endframe)</td>
3748 </tr>
3749 <tr>
3750 <td id="L740" class="blob-num js-line-number" data-line-number="740"></td>
3751 <td id="LC740" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Exporting action "<span class="pl-c1">%s</span>" frames <span class="pl-c1">%d</span>-<span class="pl-c1">%d</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (action.name, startframe, endframe))</td>
3752 </tr>
3753 <tr>
3754 <td id="L741" class="blob-num js-line-number" data-line-number="741"></td>
3755 <td id="LC741" class="blob-code blob-code-inner js-file-line"> scene <span class="pl-k">=</span> context.scene</td>
3756 </tr>
3757 <tr>
3758 <td id="L742" class="blob-num js-line-number" data-line-number="742"></td>
3759 <td id="LC742" class="blob-code blob-code-inner js-file-line"> worldmatrix <span class="pl-k">=</span> armature.matrix_world</td>
3760 </tr>
3761 <tr>
3762 <td id="L743" class="blob-num js-line-number" data-line-number="743"></td>
3763 <td id="LC743" class="blob-code blob-code-inner js-file-line"> armature.animation_data.action <span class="pl-k">=</span> action</td>
3764 </tr>
3765 <tr>
3766 <td id="L744" class="blob-num js-line-number" data-line-number="744"></td>
3767 <td id="LC744" class="blob-code blob-code-inner js-file-line"> outdata <span class="pl-k">=</span> []</td>
3768 </tr>
3769 <tr>
3770 <td id="L745" class="blob-num js-line-number" data-line-number="745"></td>
3771 <td id="LC745" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> time <span class="pl-k">in</span> <span class="pl-c1">range</span>(startframe, endframe<span class="pl-k">+</span><span class="pl-c1">1</span>):</td>
3772 </tr>
3773 <tr>
3774 <td id="L746" class="blob-num js-line-number" data-line-number="746"></td>
3775 <td id="LC746" class="blob-code blob-code-inner js-file-line"> scene.frame_set(time)</td>
3776 </tr>
3777 <tr>
3778 <td id="L747" class="blob-num js-line-number" data-line-number="747"></td>
3779 <td id="LC747" class="blob-code blob-code-inner js-file-line"> pose <span class="pl-k">=</span> armature.pose</td>
3780 </tr>
3781 <tr>
3782 <td id="L748" class="blob-num js-line-number" data-line-number="748"></td>
3783 <td id="LC748" class="blob-code blob-code-inner js-file-line"> outframe <span class="pl-k">=</span> []</td>
3784 </tr>
3785 <tr>
3786 <td id="L749" class="blob-num js-line-number" data-line-number="749"></td>
3787 <td id="LC749" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> bone <span class="pl-k">in</span> bones:</td>
3788 </tr>
3789 <tr>
3790 <td id="L750" class="blob-num js-line-number" data-line-number="750"></td>
3791 <td id="LC750" class="blob-code blob-code-inner js-file-line"> posematrix <span class="pl-k">=</span> pose.bones[bone.origname].matrix</td>
3792 </tr>
3793 <tr>
3794 <td id="L751" class="blob-num js-line-number" data-line-number="751"></td>
3795 <td id="LC751" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.parent:</td>
3796 </tr>
3797 <tr>
3798 <td id="L752" class="blob-num js-line-number" data-line-number="752"></td>
3799 <td id="LC752" class="blob-code blob-code-inner js-file-line"> posematrix <span class="pl-k">=</span> pose.bones[bone.parent.origname].matrix.inverted() <span class="pl-k">@</span> posematrix</td>
3800 </tr>
3801 <tr>
3802 <td id="L753" class="blob-num js-line-number" data-line-number="753"></td>
3803 <td id="LC753" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
3804 </tr>
3805 <tr>
3806 <td id="L754" class="blob-num js-line-number" data-line-number="754"></td>
3807 <td id="LC754" class="blob-code blob-code-inner js-file-line"> posematrix <span class="pl-k">=</span> worldmatrix <span class="pl-k">@</span> posematrix</td>
3808 </tr>
3809 <tr>
3810 <td id="L755" class="blob-num js-line-number" data-line-number="755"></td>
3811 <td id="LC755" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> scale <span class="pl-k">!=</span> <span class="pl-c1">1.0</span>:</td>
3812 </tr>
3813 <tr>
3814 <td id="L756" class="blob-num js-line-number" data-line-number="756"></td>
3815 <td id="LC756" class="blob-code blob-code-inner js-file-line"> posematrix.translation <span class="pl-k">*=</span> scale</td>
3816 </tr>
3817 <tr>
3818 <td id="L757" class="blob-num js-line-number" data-line-number="757"></td>
3819 <td id="LC757" class="blob-code blob-code-inner js-file-line"> loc <span class="pl-k">=</span> posematrix.to_translation()</td>
3820 </tr>
3821 <tr>
3822 <td id="L758" class="blob-num js-line-number" data-line-number="758"></td>
3823 <td id="LC758" class="blob-code blob-code-inner js-file-line"> quat <span class="pl-k">=</span> posematrix.to_3x3().inverted().transposed().to_quaternion()</td>
3824 </tr>
3825 <tr>
3826 <td id="L759" class="blob-num js-line-number" data-line-number="759"></td>
3827 <td id="LC759" class="blob-code blob-code-inner js-file-line"> quat.normalize()</td>
3828 </tr>
3829 <tr>
3830 <td id="L760" class="blob-num js-line-number" data-line-number="760"></td>
3831 <td id="LC760" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> quat.w <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
3832 </tr>
3833 <tr>
3834 <td id="L761" class="blob-num js-line-number" data-line-number="761"></td>
3835 <td id="LC761" class="blob-code blob-code-inner js-file-line"> quat.negate()</td>
3836 </tr>
3837 <tr>
3838 <td id="L762" class="blob-num js-line-number" data-line-number="762"></td>
3839 <td id="LC762" class="blob-code blob-code-inner js-file-line"> pscale <span class="pl-k">=</span> posematrix.to_scale()</td>
3840 </tr>
3841 <tr>
3842 <td id="L763" class="blob-num js-line-number" data-line-number="763"></td>
3843 <td id="LC763" class="blob-code blob-code-inner js-file-line"> pscale.x <span class="pl-k">=</span> <span class="pl-c1">round</span>(pscale.x<span class="pl-k">*</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span>)<span class="pl-k">/</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span></td>
3844 </tr>
3845 <tr>
3846 <td id="L764" class="blob-num js-line-number" data-line-number="764"></td>
3847 <td id="LC764" class="blob-code blob-code-inner js-file-line"> pscale.y <span class="pl-k">=</span> <span class="pl-c1">round</span>(pscale.y<span class="pl-k">*</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span>)<span class="pl-k">/</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span></td>
3848 </tr>
3849 <tr>
3850 <td id="L765" class="blob-num js-line-number" data-line-number="765"></td>
3851 <td id="LC765" class="blob-code blob-code-inner js-file-line"> pscale.z <span class="pl-k">=</span> <span class="pl-c1">round</span>(pscale.z<span class="pl-k">*</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span>)<span class="pl-k">/</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span></td>
3852 </tr>
3853 <tr>
3854 <td id="L766" class="blob-num js-line-number" data-line-number="766"></td>
3855 <td id="LC766" class="blob-code blob-code-inner js-file-line"> outframe.append((loc, quat, pscale, posematrix))</td>
3856 </tr>
3857 <tr>
3858 <td id="L767" class="blob-num js-line-number" data-line-number="767"></td>
3859 <td id="LC767" class="blob-code blob-code-inner js-file-line"> outdata.append(outframe)</td>
3860 </tr>
3861 <tr>
3862 <td id="L768" class="blob-num js-line-number" data-line-number="768"></td>
3863 <td id="LC768" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> outdata</td>
3864 </tr>
3865 <tr>
3866 <td id="L769" class="blob-num js-line-number" data-line-number="769"></td>
3867 <td id="LC769" class="blob-code blob-code-inner js-file-line">
3868</td>
3869 </tr>
3870 <tr>
3871 <td id="L770" class="blob-num js-line-number" data-line-number="770"></td>
3872 <td id="LC770" class="blob-code blob-code-inner js-file-line">
3873</td>
3874 </tr>
3875 <tr>
3876 <td id="L771" class="blob-num js-line-number" data-line-number="771"></td>
3877 <td id="LC771" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">collectAnims</span>(<span class="pl-smi">context</span>, <span class="pl-smi">armature</span>, <span class="pl-smi">scale</span>, <span class="pl-smi">bones</span>, <span class="pl-smi">animspecs</span>):</td>
3878 </tr>
3879 <tr>
3880 <td id="L772" class="blob-num js-line-number" data-line-number="772"></td>
3881 <td id="LC772" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> armature.animation_data:</td>
3882 </tr>
3883 <tr>
3884 <td id="L773" class="blob-num js-line-number" data-line-number="773"></td>
3885 <td id="LC773" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Armature has no animation data<span class="pl-pds">'</span></span>)</td>
3886 </tr>
3887 <tr>
3888 <td id="L774" class="blob-num js-line-number" data-line-number="774"></td>
3889 <td id="LC774" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> []</td>
3890 </tr>
3891 <tr>
3892 <td id="L775" class="blob-num js-line-number" data-line-number="775"></td>
3893 <td id="LC775" class="blob-code blob-code-inner js-file-line"> actions <span class="pl-k">=</span> bpy.data.actions</td>
3894 </tr>
3895 <tr>
3896 <td id="L776" class="blob-num js-line-number" data-line-number="776"></td>
3897 <td id="LC776" class="blob-code blob-code-inner js-file-line"> animspecs <span class="pl-k">=</span> [ spec.strip() <span class="pl-k">for</span> spec <span class="pl-k">in</span> animspecs.split(<span class="pl-s"><span class="pl-pds">'</span>,<span class="pl-pds">'</span></span>) ]</td>
3898 </tr>
3899 <tr>
3900 <td id="L777" class="blob-num js-line-number" data-line-number="777"></td>
3901 <td id="LC777" class="blob-code blob-code-inner js-file-line"> anims <span class="pl-k">=</span> []</td>
3902 </tr>
3903 <tr>
3904 <td id="L778" class="blob-num js-line-number" data-line-number="778"></td>
3905 <td id="LC778" class="blob-code blob-code-inner js-file-line"> scene <span class="pl-k">=</span> context.scene</td>
3906 </tr>
3907 <tr>
3908 <td id="L779" class="blob-num js-line-number" data-line-number="779"></td>
3909 <td id="LC779" class="blob-code blob-code-inner js-file-line"> oldaction <span class="pl-k">=</span> armature.animation_data.action</td>
3910 </tr>
3911 <tr>
3912 <td id="L780" class="blob-num js-line-number" data-line-number="780"></td>
3913 <td id="LC780" class="blob-code blob-code-inner js-file-line"> oldframe <span class="pl-k">=</span> scene.frame_current</td>
3914 </tr>
3915 <tr>
3916 <td id="L781" class="blob-num js-line-number" data-line-number="781"></td>
3917 <td id="LC781" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> animspec <span class="pl-k">in</span> animspecs:</td>
3918 </tr>
3919 <tr>
3920 <td id="L782" class="blob-num js-line-number" data-line-number="782"></td>
3921 <td id="LC782" class="blob-code blob-code-inner js-file-line"> animspec <span class="pl-k">=</span> [ arg.strip() <span class="pl-k">for</span> arg <span class="pl-k">in</span> animspec.split(<span class="pl-s"><span class="pl-pds">'</span>:<span class="pl-pds">'</span></span>) ]</td>
3922 </tr>
3923 <tr>
3924 <td id="L783" class="blob-num js-line-number" data-line-number="783"></td>
3925 <td id="LC783" class="blob-code blob-code-inner js-file-line"> animname <span class="pl-k">=</span> animspec[<span class="pl-c1">0</span>]</td>
3926 </tr>
3927 <tr>
3928 <td id="L784" class="blob-num js-line-number" data-line-number="784"></td>
3929 <td id="LC784" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> animname <span class="pl-k">not</span> <span class="pl-k">in</span> actions:</td>
3930 </tr>
3931 <tr>
3932 <td id="L785" class="blob-num js-line-number" data-line-number="785"></td>
3933 <td id="LC785" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Action "<span class="pl-c1">%s</span>" not found in current armature<span class="pl-pds">'</span></span> <span class="pl-k">%</span> animname)</td>
3934 </tr>
3935 <tr>
3936 <td id="L786" class="blob-num js-line-number" data-line-number="786"></td>
3937 <td id="LC786" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">continue</span></td>
3938 </tr>
3939 <tr>
3940 <td id="L787" class="blob-num js-line-number" data-line-number="787"></td>
3941 <td id="LC787" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>:</td>
3942 </tr>
3943 <tr>
3944 <td id="L788" class="blob-num js-line-number" data-line-number="788"></td>
3945 <td id="LC788" class="blob-code blob-code-inner js-file-line"> startframe <span class="pl-k">=</span> <span class="pl-c1">int</span>(animspec[<span class="pl-c1">1</span>])</td>
3946 </tr>
3947 <tr>
3948 <td id="L789" class="blob-num js-line-number" data-line-number="789"></td>
3949 <td id="LC789" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>:</td>
3950 </tr>
3951 <tr>
3952 <td id="L790" class="blob-num js-line-number" data-line-number="790"></td>
3953 <td id="LC790" class="blob-code blob-code-inner js-file-line"> startframe <span class="pl-k">=</span> <span class="pl-c1">None</span></td>
3954 </tr>
3955 <tr>
3956 <td id="L791" class="blob-num js-line-number" data-line-number="791"></td>
3957 <td id="LC791" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>:</td>
3958 </tr>
3959 <tr>
3960 <td id="L792" class="blob-num js-line-number" data-line-number="792"></td>
3961 <td id="LC792" class="blob-code blob-code-inner js-file-line"> endframe <span class="pl-k">=</span> <span class="pl-c1">int</span>(animspec[<span class="pl-c1">2</span>])</td>
3962 </tr>
3963 <tr>
3964 <td id="L793" class="blob-num js-line-number" data-line-number="793"></td>
3965 <td id="LC793" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>:</td>
3966 </tr>
3967 <tr>
3968 <td id="L794" class="blob-num js-line-number" data-line-number="794"></td>
3969 <td id="LC794" class="blob-code blob-code-inner js-file-line"> endframe <span class="pl-k">=</span> <span class="pl-c1">None</span></td>
3970 </tr>
3971 <tr>
3972 <td id="L795" class="blob-num js-line-number" data-line-number="795"></td>
3973 <td id="LC795" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>:</td>
3974 </tr>
3975 <tr>
3976 <td id="L796" class="blob-num js-line-number" data-line-number="796"></td>
3977 <td id="LC796" class="blob-code blob-code-inner js-file-line"> fps <span class="pl-k">=</span> <span class="pl-c1">float</span>(animspec[<span class="pl-c1">3</span>])</td>
3978 </tr>
3979 <tr>
3980 <td id="L797" class="blob-num js-line-number" data-line-number="797"></td>
3981 <td id="LC797" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>:</td>
3982 </tr>
3983 <tr>
3984 <td id="L798" class="blob-num js-line-number" data-line-number="798"></td>
3985 <td id="LC798" class="blob-code blob-code-inner js-file-line"> fps <span class="pl-k">=</span> <span class="pl-c1">float</span>(scene.render.fps)</td>
3986 </tr>
3987 <tr>
3988 <td id="L799" class="blob-num js-line-number" data-line-number="799"></td>
3989 <td id="LC799" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>:</td>
3990 </tr>
3991 <tr>
3992 <td id="L800" class="blob-num js-line-number" data-line-number="800"></td>
3993 <td id="LC800" class="blob-code blob-code-inner js-file-line"> flags <span class="pl-k">=</span> <span class="pl-c1">int</span>(animspec[<span class="pl-c1">4</span>])</td>
3994 </tr>
3995 <tr>
3996 <td id="L801" class="blob-num js-line-number" data-line-number="801"></td>
3997 <td id="LC801" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>:</td>
3998 </tr>
3999 <tr>
4000 <td id="L802" class="blob-num js-line-number" data-line-number="802"></td>
4001 <td id="LC802" class="blob-code blob-code-inner js-file-line"> flags <span class="pl-k">=</span> <span class="pl-c1">0</span></td>
4002 </tr>
4003 <tr>
4004 <td id="L803" class="blob-num js-line-number" data-line-number="803"></td>
4005 <td id="LC803" class="blob-code blob-code-inner js-file-line"> framedata <span class="pl-k">=</span> collectAnim(context, armature, scale, bones, actions[animname], startframe, endframe)</td>
4006 </tr>
4007 <tr>
4008 <td id="L804" class="blob-num js-line-number" data-line-number="804"></td>
4009 <td id="LC804" class="blob-code blob-code-inner js-file-line"> anims.append(Animation(animname, framedata, fps, flags))</td>
4010 </tr>
4011 <tr>
4012 <td id="L805" class="blob-num js-line-number" data-line-number="805"></td>
4013 <td id="LC805" class="blob-code blob-code-inner js-file-line"> armature.animation_data.action <span class="pl-k">=</span> oldaction</td>
4014 </tr>
4015 <tr>
4016 <td id="L806" class="blob-num js-line-number" data-line-number="806"></td>
4017 <td id="LC806" class="blob-code blob-code-inner js-file-line"> scene.frame_set(oldframe)</td>
4018 </tr>
4019 <tr>
4020 <td id="L807" class="blob-num js-line-number" data-line-number="807"></td>
4021 <td id="LC807" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> anims</td>
4022 </tr>
4023 <tr>
4024 <td id="L808" class="blob-num js-line-number" data-line-number="808"></td>
4025 <td id="LC808" class="blob-code blob-code-inner js-file-line">
4026</td>
4027 </tr>
4028 <tr>
4029 <td id="L809" class="blob-num js-line-number" data-line-number="809"></td>
4030 <td id="LC809" class="blob-code blob-code-inner js-file-line"> </td>
4031 </tr>
4032 <tr>
4033 <td id="L810" class="blob-num js-line-number" data-line-number="810"></td>
4034 <td id="LC810" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">collectMeshes</span>(<span class="pl-smi">context</span>, <span class="pl-smi">bones</span>, <span class="pl-smi">scale</span>, <span class="pl-smi">matfun</span>, <span class="pl-smi">useskel</span> <span class="pl-k">=</span> <span class="pl-c1">True</span>, <span class="pl-smi">usecol</span> <span class="pl-k">=</span> <span class="pl-c1">False</span>, <span class="pl-smi">usemods</span> <span class="pl-k">=</span> <span class="pl-c1">False</span>, <span class="pl-smi">filetype</span> <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">'</span>IQM<span class="pl-pds">'</span></span>):</td>
4035 </tr>
4036 <tr>
4037 <td id="L811" class="blob-num js-line-number" data-line-number="811"></td>
4038 <td id="LC811" class="blob-code blob-code-inner js-file-line"> vertwarn <span class="pl-k">=</span> []</td>
4039 </tr>
4040 <tr>
4041 <td id="L812" class="blob-num js-line-number" data-line-number="812"></td>
4042 <td id="LC812" class="blob-code blob-code-inner js-file-line"> objs <span class="pl-k">=</span> context.selected_objects <span class="pl-c"><span class="pl-c">#</span>context.scene.objects</span></td>
4043 </tr>
4044 <tr>
4045 <td id="L813" class="blob-num js-line-number" data-line-number="813"></td>
4046 <td id="LC813" class="blob-code blob-code-inner js-file-line"> meshes <span class="pl-k">=</span> []</td>
4047 </tr>
4048 <tr>
4049 <td id="L814" class="blob-num js-line-number" data-line-number="814"></td>
4050 <td id="LC814" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> obj <span class="pl-k">in</span> objs:</td>
4051 </tr>
4052 <tr>
4053 <td id="L815" class="blob-num js-line-number" data-line-number="815"></td>
4054 <td id="LC815" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> obj.type <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>MESH<span class="pl-pds">'</span></span>:</td>
4055 </tr>
4056 <tr>
4057 <td id="L816" class="blob-num js-line-number" data-line-number="816"></td>
4058 <td id="LC816" class="blob-code blob-code-inner js-file-line"> data <span class="pl-k">=</span> obj.evaluated_get(context.evaluated_depsgraph_get()).to_mesh() <span class="pl-k">if</span> usemods <span class="pl-k">else</span> obj.original.to_mesh()</td>
4059 </tr>
4060 <tr>
4061 <td id="L817" class="blob-num js-line-number" data-line-number="817"></td>
4062 <td id="LC817" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> data.polygons:</td>
4063 </tr>
4064 <tr>
4065 <td id="L818" class="blob-num js-line-number" data-line-number="818"></td>
4066 <td id="LC818" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">continue</span></td>
4067 </tr>
4068 <tr>
4069 <td id="L819" class="blob-num js-line-number" data-line-number="819"></td>
4070 <td id="LC819" class="blob-code blob-code-inner js-file-line"> data.calc_normals_split()</td>
4071 </tr>
4072 <tr>
4073 <td id="L820" class="blob-num js-line-number" data-line-number="820"></td>
4074 <td id="LC820" class="blob-code blob-code-inner js-file-line"> coordmatrix <span class="pl-k">=</span> obj.matrix_world</td>
4075 </tr>
4076 <tr>
4077 <td id="L821" class="blob-num js-line-number" data-line-number="821"></td>
4078 <td id="LC821" class="blob-code blob-code-inner js-file-line"> normalmatrix <span class="pl-k">=</span> coordmatrix.inverted().transposed()</td>
4079 </tr>
4080 <tr>
4081 <td id="L822" class="blob-num js-line-number" data-line-number="822"></td>
4082 <td id="LC822" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> scale <span class="pl-k">!=</span> <span class="pl-c1">1.0</span>:</td>
4083 </tr>
4084 <tr>
4085 <td id="L823" class="blob-num js-line-number" data-line-number="823"></td>
4086 <td id="LC823" class="blob-code blob-code-inner js-file-line"> coordmatrix <span class="pl-k">=</span> mathutils.Matrix.Scale(scale, <span class="pl-c1">4</span>) <span class="pl-k">@</span> coordmatrix </td>
4087 </tr>
4088 <tr>
4089 <td id="L824" class="blob-num js-line-number" data-line-number="824"></td>
4090 <td id="LC824" class="blob-code blob-code-inner js-file-line"> materials <span class="pl-k">=</span> {}</td>
4091 </tr>
4092 <tr>
4093 <td id="L825" class="blob-num js-line-number" data-line-number="825"></td>
4094 <td id="LC825" class="blob-code blob-code-inner js-file-line"> matnames <span class="pl-k">=</span> {}</td>
4095 </tr>
4096 <tr>
4097 <td id="L826" class="blob-num js-line-number" data-line-number="826"></td>
4098 <td id="LC826" class="blob-code blob-code-inner js-file-line"> groups <span class="pl-k">=</span> obj.vertex_groups</td>
4099 </tr>
4100 <tr>
4101 <td id="L827" class="blob-num js-line-number" data-line-number="827"></td>
4102 <td id="LC827" class="blob-code blob-code-inner js-file-line"> uvlayer <span class="pl-k">=</span> data.uv_layers.active <span class="pl-k">and</span> data.uv_layers.active.data</td>
4103 </tr>
4104 <tr>
4105 <td id="L828" class="blob-num js-line-number" data-line-number="828"></td>
4106 <td id="LC828" class="blob-code blob-code-inner js-file-line"> colors <span class="pl-k">=</span> <span class="pl-c1">None</span></td>
4107 </tr>
4108 <tr>
4109 <td id="L829" class="blob-num js-line-number" data-line-number="829"></td>
4110 <td id="LC829" class="blob-code blob-code-inner js-file-line"> alpha <span class="pl-k">=</span> <span class="pl-c1">None</span></td>
4111 </tr>
4112 <tr>
4113 <td id="L830" class="blob-num js-line-number" data-line-number="830"></td>
4114 <td id="LC830" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> usecol:</td>
4115 </tr>
4116 <tr>
4117 <td id="L831" class="blob-num js-line-number" data-line-number="831"></td>
4118 <td id="LC831" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> data.vertex_colors.active:</td>
4119 </tr>
4120 <tr>
4121 <td id="L832" class="blob-num js-line-number" data-line-number="832"></td>
4122 <td id="LC832" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> data.vertex_colors.active.name.startswith(<span class="pl-s"><span class="pl-pds">'</span>alpha<span class="pl-pds">'</span></span>):</td>
4123 </tr>
4124 <tr>
4125 <td id="L833" class="blob-num js-line-number" data-line-number="833"></td>
4126 <td id="LC833" class="blob-code blob-code-inner js-file-line"> alpha <span class="pl-k">=</span> data.vertex_colors.active.data</td>
4127 </tr>
4128 <tr>
4129 <td id="L834" class="blob-num js-line-number" data-line-number="834"></td>
4130 <td id="LC834" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4131 </tr>
4132 <tr>
4133 <td id="L835" class="blob-num js-line-number" data-line-number="835"></td>
4134 <td id="LC835" class="blob-code blob-code-inner js-file-line"> colors <span class="pl-k">=</span> data.vertex_colors.active.data</td>
4135 </tr>
4136 <tr>
4137 <td id="L836" class="blob-num js-line-number" data-line-number="836"></td>
4138 <td id="LC836" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> layer <span class="pl-k">in</span> data.vertex_colors:</td>
4139 </tr>
4140 <tr>
4141 <td id="L837" class="blob-num js-line-number" data-line-number="837"></td>
4142 <td id="LC837" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> layer.name.startswith(<span class="pl-s"><span class="pl-pds">'</span>alpha<span class="pl-pds">'</span></span>):</td>
4143 </tr>
4144 <tr>
4145 <td id="L838" class="blob-num js-line-number" data-line-number="838"></td>
4146 <td id="LC838" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> alpha:</td>
4147 </tr>
4148 <tr>
4149 <td id="L839" class="blob-num js-line-number" data-line-number="839"></td>
4150 <td id="LC839" class="blob-code blob-code-inner js-file-line"> alpha <span class="pl-k">=</span> layer.data</td>
4151 </tr>
4152 <tr>
4153 <td id="L840" class="blob-num js-line-number" data-line-number="840"></td>
4154 <td id="LC840" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">elif</span> <span class="pl-k">not</span> colors:</td>
4155 </tr>
4156 <tr>
4157 <td id="L841" class="blob-num js-line-number" data-line-number="841"></td>
4158 <td id="LC841" class="blob-code blob-code-inner js-file-line"> colors <span class="pl-k">=</span> layer.data</td>
4159 </tr>
4160 <tr>
4161 <td id="L842" class="blob-num js-line-number" data-line-number="842"></td>
4162 <td id="LC842" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> data.materials:</td>
4163 </tr>
4164 <tr>
4165 <td id="L843" class="blob-num js-line-number" data-line-number="843"></td>
4166 <td id="LC843" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> idx, mat <span class="pl-k">in</span> <span class="pl-c1">enumerate</span>(data.materials):</td>
4167 </tr>
4168 <tr>
4169 <td id="L844" class="blob-num js-line-number" data-line-number="844"></td>
4170 <td id="LC844" class="blob-code blob-code-inner js-file-line"> matprefix <span class="pl-k">=</span> mat.name <span class="pl-k">or</span> <span class="pl-s"><span class="pl-pds">'</span><span class="pl-pds">'</span></span></td>
4171 </tr>
4172 <tr>
4173 <td id="L845" class="blob-num js-line-number" data-line-number="845"></td>
4174 <td id="LC845" class="blob-code blob-code-inner js-file-line"> matimage <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">'</span><span class="pl-pds">'</span></span></td>
4175 </tr>
4176 <tr>
4177 <td id="L846" class="blob-num js-line-number" data-line-number="846"></td>
4178 <td id="LC846" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> mat.node_tree:</td>
4179 </tr>
4180 <tr>
4181 <td id="L847" class="blob-num js-line-number" data-line-number="847"></td>
4182 <td id="LC847" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> n <span class="pl-k">in</span> mat.node_tree.nodes:</td>
4183 </tr>
4184 <tr>
4185 <td id="L848" class="blob-num js-line-number" data-line-number="848"></td>
4186 <td id="LC848" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> n.type <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>TEX_IMAGE<span class="pl-pds">'</span></span> <span class="pl-k">and</span> n.image:</td>
4187 </tr>
4188 <tr>
4189 <td id="L849" class="blob-num js-line-number" data-line-number="849"></td>
4190 <td id="LC849" class="blob-code blob-code-inner js-file-line"> matimage <span class="pl-k">=</span> os.path.basename(n.image.filepath)</td>
4191 </tr>
4192 <tr>
4193 <td id="L850" class="blob-num js-line-number" data-line-number="850"></td>
4194 <td id="LC850" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">break</span></td>
4195 </tr>
4196 <tr>
4197 <td id="L851" class="blob-num js-line-number" data-line-number="851"></td>
4198 <td id="LC851" class="blob-code blob-code-inner js-file-line"> matnames[idx] <span class="pl-k">=</span> matfun(matprefix, matimage)</td>
4199 </tr>
4200 <tr>
4201 <td id="L852" class="blob-num js-line-number" data-line-number="852"></td>
4202 <td id="LC852" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> face <span class="pl-k">in</span> data.polygons:</td>
4203 </tr>
4204 <tr>
4205 <td id="L853" class="blob-num js-line-number" data-line-number="853"></td>
4206 <td id="LC853" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">len</span>(face.vertices) <span class="pl-k"><</span> <span class="pl-c1">3</span>:</td>
4207 </tr>
4208 <tr>
4209 <td id="L854" class="blob-num js-line-number" data-line-number="854"></td>
4210 <td id="LC854" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">continue</span></td>
4211 </tr>
4212 <tr>
4213 <td id="L855" class="blob-num js-line-number" data-line-number="855"></td>
4214 <td id="LC855" class="blob-code blob-code-inner js-file-line"> </td>
4215 </tr>
4216 <tr>
4217 <td id="L856" class="blob-num js-line-number" data-line-number="856"></td>
4218 <td id="LC856" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">all</span>([ data.vertices[i].co <span class="pl-k">==</span> data.vertices[face.vertices[<span class="pl-c1">0</span>]].co <span class="pl-k">for</span> i <span class="pl-k">in</span> face.vertices[<span class="pl-c1">1</span>:] ]):</td>
4219 </tr>
4220 <tr>
4221 <td id="L857" class="blob-num js-line-number" data-line-number="857"></td>
4222 <td id="LC857" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">continue</span></td>
4223 </tr>
4224 <tr>
4225 <td id="L858" class="blob-num js-line-number" data-line-number="858"></td>
4226 <td id="LC858" class="blob-code blob-code-inner js-file-line">
4227</td>
4228 </tr>
4229 <tr>
4230 <td id="L859" class="blob-num js-line-number" data-line-number="859"></td>
4231 <td id="LC859" class="blob-code blob-code-inner js-file-line"> matindex <span class="pl-k">=</span> face.material_index</td>
4232 </tr>
4233 <tr>
4234 <td id="L860" class="blob-num js-line-number" data-line-number="860"></td>
4235 <td id="LC860" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>:</td>
4236 </tr>
4237 <tr>
4238 <td id="L861" class="blob-num js-line-number" data-line-number="861"></td>
4239 <td id="LC861" class="blob-code blob-code-inner js-file-line"> mesh <span class="pl-k">=</span> materials[obj.name, matindex] </td>
4240 </tr>
4241 <tr>
4242 <td id="L862" class="blob-num js-line-number" data-line-number="862"></td>
4243 <td id="LC862" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>:</td>
4244 </tr>
4245 <tr>
4246 <td id="L863" class="blob-num js-line-number" data-line-number="863"></td>
4247 <td id="LC863" class="blob-code blob-code-inner js-file-line"> matname <span class="pl-k">=</span> matnames.get(matindex, <span class="pl-s"><span class="pl-pds">'</span><span class="pl-pds">'</span></span>)</td>
4248 </tr>
4249 <tr>
4250 <td id="L864" class="blob-num js-line-number" data-line-number="864"></td>
4251 <td id="LC864" class="blob-code blob-code-inner js-file-line"> mesh <span class="pl-k">=</span> Mesh(obj.name, matname, data.vertices)</td>
4252 </tr>
4253 <tr>
4254 <td id="L865" class="blob-num js-line-number" data-line-number="865"></td>
4255 <td id="LC865" class="blob-code blob-code-inner js-file-line"> meshes.append(mesh)</td>
4256 </tr>
4257 <tr>
4258 <td id="L866" class="blob-num js-line-number" data-line-number="866"></td>
4259 <td id="LC866" class="blob-code blob-code-inner js-file-line"> materials[obj.name, matindex] <span class="pl-k">=</span> mesh</td>
4260 </tr>
4261 <tr>
4262 <td id="L867" class="blob-num js-line-number" data-line-number="867"></td>
4263 <td id="LC867" class="blob-code blob-code-inner js-file-line">
4264</td>
4265 </tr>
4266 <tr>
4267 <td id="L868" class="blob-num js-line-number" data-line-number="868"></td>
4268 <td id="LC868" class="blob-code blob-code-inner js-file-line"> verts <span class="pl-k">=</span> mesh.verts</td>
4269 </tr>
4270 <tr>
4271 <td id="L869" class="blob-num js-line-number" data-line-number="869"></td>
4272 <td id="LC869" class="blob-code blob-code-inner js-file-line"> vertmap <span class="pl-k">=</span> mesh.vertmap</td>
4273 </tr>
4274 <tr>
4275 <td id="L870" class="blob-num js-line-number" data-line-number="870"></td>
4276 <td id="LC870" class="blob-code blob-code-inner js-file-line"> faceverts <span class="pl-k">=</span> []</td>
4277 </tr>
4278 <tr>
4279 <td id="L871" class="blob-num js-line-number" data-line-number="871"></td>
4280 <td id="LC871" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> loopidx <span class="pl-k">in</span> face.loop_indices:</td>
4281 </tr>
4282 <tr>
4283 <td id="L872" class="blob-num js-line-number" data-line-number="872"></td>
4284 <td id="LC872" class="blob-code blob-code-inner js-file-line"> loop <span class="pl-k">=</span> data.loops[loopidx]</td>
4285 </tr>
4286 <tr>
4287 <td id="L873" class="blob-num js-line-number" data-line-number="873"></td>
4288 <td id="LC873" class="blob-code blob-code-inner js-file-line"> v <span class="pl-k">=</span> data.vertices[loop.vertex_index]</td>
4289 </tr>
4290 <tr>
4291 <td id="L874" class="blob-num js-line-number" data-line-number="874"></td>
4292 <td id="LC874" class="blob-code blob-code-inner js-file-line"> vertco <span class="pl-k">=</span> coordmatrix <span class="pl-k">@</span> v.co</td>
4293 </tr>
4294 <tr>
4295 <td id="L875" class="blob-num js-line-number" data-line-number="875"></td>
4296 <td id="LC875" class="blob-code blob-code-inner js-file-line">
4297</td>
4298 </tr>
4299 <tr>
4300 <td id="L876" class="blob-num js-line-number" data-line-number="876"></td>
4301 <td id="LC876" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> face.use_smooth: </td>
4302 </tr>
4303 <tr>
4304 <td id="L877" class="blob-num js-line-number" data-line-number="877"></td>
4305 <td id="LC877" class="blob-code blob-code-inner js-file-line"> vertno <span class="pl-k">=</span> mathutils.Vector(face.normal)</td>
4306 </tr>
4307 <tr>
4308 <td id="L878" class="blob-num js-line-number" data-line-number="878"></td>
4309 <td id="LC878" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4310 </tr>
4311 <tr>
4312 <td id="L879" class="blob-num js-line-number" data-line-number="879"></td>
4313 <td id="LC879" class="blob-code blob-code-inner js-file-line"> vertno <span class="pl-k">=</span> mathutils.Vector(loop.normal)</td>
4314 </tr>
4315 <tr>
4316 <td id="L880" class="blob-num js-line-number" data-line-number="880"></td>
4317 <td id="LC880" class="blob-code blob-code-inner js-file-line"> vertno <span class="pl-k">=</span> normalmatrix <span class="pl-k">@</span> vertno</td>
4318 </tr>
4319 <tr>
4320 <td id="L881" class="blob-num js-line-number" data-line-number="881"></td>
4321 <td id="LC881" class="blob-code blob-code-inner js-file-line"> vertno.normalize()</td>
4322 </tr>
4323 <tr>
4324 <td id="L882" class="blob-num js-line-number" data-line-number="882"></td>
4325 <td id="LC882" class="blob-code blob-code-inner js-file-line">
4326</td>
4327 </tr>
4328 <tr>
4329 <td id="L883" class="blob-num js-line-number" data-line-number="883"></td>
4330 <td id="LC883" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"><span class="pl-c">#</span> flip V axis of texture space</span></td>
4331 </tr>
4332 <tr>
4333 <td id="L884" class="blob-num js-line-number" data-line-number="884"></td>
4334 <td id="LC884" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> uvlayer:</td>
4335 </tr>
4336 <tr>
4337 <td id="L885" class="blob-num js-line-number" data-line-number="885"></td>
4338 <td id="LC885" class="blob-code blob-code-inner js-file-line"> uv <span class="pl-k">=</span> uvlayer[loopidx].uv</td>
4339 </tr>
4340 <tr>
4341 <td id="L886" class="blob-num js-line-number" data-line-number="886"></td>
4342 <td id="LC886" class="blob-code blob-code-inner js-file-line"> vertuv <span class="pl-k">=</span> mathutils.Vector((uv[<span class="pl-c1">0</span>], <span class="pl-c1">1.0</span> <span class="pl-k">-</span> uv[<span class="pl-c1">1</span>]))</td>
4343 </tr>
4344 <tr>
4345 <td id="L887" class="blob-num js-line-number" data-line-number="887"></td>
4346 <td id="LC887" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4347 </tr>
4348 <tr>
4349 <td id="L888" class="blob-num js-line-number" data-line-number="888"></td>
4350 <td id="LC888" class="blob-code blob-code-inner js-file-line"> vertuv <span class="pl-k">=</span> mathutils.Vector((<span class="pl-c1">0.0</span>, <span class="pl-c1">0.0</span>))</td>
4351 </tr>
4352 <tr>
4353 <td id="L889" class="blob-num js-line-number" data-line-number="889"></td>
4354 <td id="LC889" class="blob-code blob-code-inner js-file-line">
4355</td>
4356 </tr>
4357 <tr>
4358 <td id="L890" class="blob-num js-line-number" data-line-number="890"></td>
4359 <td id="LC890" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> colors:</td>
4360 </tr>
4361 <tr>
4362 <td id="L891" class="blob-num js-line-number" data-line-number="891"></td>
4363 <td id="LC891" class="blob-code blob-code-inner js-file-line"> vertcol <span class="pl-k">=</span> colors[loopidx].color</td>
4364 </tr>
4365 <tr>
4366 <td id="L892" class="blob-num js-line-number" data-line-number="892"></td>
4367 <td id="LC892" class="blob-code blob-code-inner js-file-line"> vertcol <span class="pl-k">=</span> (<span class="pl-c1">int</span>(<span class="pl-c1">round</span>(vertcol[<span class="pl-c1">0</span>] <span class="pl-k">*</span> <span class="pl-c1">255.0</span>)), <span class="pl-c1">int</span>(<span class="pl-c1">round</span>(vertcol[<span class="pl-c1">1</span>] <span class="pl-k">*</span> <span class="pl-c1">255.0</span>)), <span class="pl-c1">int</span>(<span class="pl-c1">round</span>(vertcol[<span class="pl-c1">2</span>] <span class="pl-k">*</span> <span class="pl-c1">255.0</span>)), <span class="pl-c1">255</span>)</td>
4368 </tr>
4369 <tr>
4370 <td id="L893" class="blob-num js-line-number" data-line-number="893"></td>
4371 <td id="LC893" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4372 </tr>
4373 <tr>
4374 <td id="L894" class="blob-num js-line-number" data-line-number="894"></td>
4375 <td id="LC894" class="blob-code blob-code-inner js-file-line"> vertcol <span class="pl-k">=</span> <span class="pl-c1">None</span></td>
4376 </tr>
4377 <tr>
4378 <td id="L895" class="blob-num js-line-number" data-line-number="895"></td>
4379 <td id="LC895" class="blob-code blob-code-inner js-file-line">
4380</td>
4381 </tr>
4382 <tr>
4383 <td id="L896" class="blob-num js-line-number" data-line-number="896"></td>
4384 <td id="LC896" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> alpha:</td>
4385 </tr>
4386 <tr>
4387 <td id="L897" class="blob-num js-line-number" data-line-number="897"></td>
4388 <td id="LC897" class="blob-code blob-code-inner js-file-line"> vertalpha <span class="pl-k">=</span> alpha[loopidx].color</td>
4389 </tr>
4390 <tr>
4391 <td id="L898" class="blob-num js-line-number" data-line-number="898"></td>
4392 <td id="LC898" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> vertcol:</td>
4393 </tr>
4394 <tr>
4395 <td id="L899" class="blob-num js-line-number" data-line-number="899"></td>
4396 <td id="LC899" class="blob-code blob-code-inner js-file-line"> vertcol <span class="pl-k">=</span> (vertcol[<span class="pl-c1">0</span>], vertcol[<span class="pl-c1">1</span>], vertcol[<span class="pl-c1">2</span>], <span class="pl-c1">int</span>(<span class="pl-c1">round</span>(vertalpha[<span class="pl-c1">0</span>] <span class="pl-k">*</span> <span class="pl-c1">255.0</span>)))</td>
4397 </tr>
4398 <tr>
4399 <td id="L900" class="blob-num js-line-number" data-line-number="900"></td>
4400 <td id="LC900" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>: </td>
4401 </tr>
4402 <tr>
4403 <td id="L901" class="blob-num js-line-number" data-line-number="901"></td>
4404 <td id="LC901" class="blob-code blob-code-inner js-file-line"> vertcol <span class="pl-k">=</span> (<span class="pl-c1">255</span>, <span class="pl-c1">255</span>, <span class="pl-c1">255</span>, <span class="pl-c1">int</span>(<span class="pl-c1">round</span>(vertalpha[<span class="pl-c1">0</span>] <span class="pl-k">*</span> <span class="pl-c1">255.0</span>)))</td>
4405 </tr>
4406 <tr>
4407 <td id="L902" class="blob-num js-line-number" data-line-number="902"></td>
4408 <td id="LC902" class="blob-code blob-code-inner js-file-line">
4409</td>
4410 </tr>
4411 <tr>
4412 <td id="L903" class="blob-num js-line-number" data-line-number="903"></td>
4413 <td id="LC903" class="blob-code blob-code-inner js-file-line"> vertweights <span class="pl-k">=</span> []</td>
4414 </tr>
4415 <tr>
4416 <td id="L904" class="blob-num js-line-number" data-line-number="904"></td>
4417 <td id="LC904" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> useskel:</td>
4418 </tr>
4419 <tr>
4420 <td id="L905" class="blob-num js-line-number" data-line-number="905"></td>
4421 <td id="LC905" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> g <span class="pl-k">in</span> v.groups:</td>
4422 </tr>
4423 <tr>
4424 <td id="L906" class="blob-num js-line-number" data-line-number="906"></td>
4425 <td id="LC906" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>:</td>
4426 </tr>
4427 <tr>
4428 <td id="L907" class="blob-num js-line-number" data-line-number="907"></td>
4429 <td id="LC907" class="blob-code blob-code-inner js-file-line"> vertweights.append((g.weight, bones[groups[g.group].name].index))</td>
4430 </tr>
4431 <tr>
4432 <td id="L908" class="blob-num js-line-number" data-line-number="908"></td>
4433 <td id="LC908" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>:</td>
4434 </tr>
4435 <tr>
4436 <td id="L909" class="blob-num js-line-number" data-line-number="909"></td>
4437 <td id="LC909" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> (groups[g.group].name, mesh.name) <span class="pl-k">not</span> <span class="pl-k">in</span> vertwarn:</td>
4438 </tr>
4439 <tr>
4440 <td id="L910" class="blob-num js-line-number" data-line-number="910"></td>
4441 <td id="LC910" class="blob-code blob-code-inner js-file-line"> vertwarn.append((groups[g.group].name, mesh.name))</td>
4442 </tr>
4443 <tr>
4444 <td id="L911" class="blob-num js-line-number" data-line-number="911"></td>
4445 <td id="LC911" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Vertex depends on non-existent bone: <span class="pl-c1">%s</span> in mesh: <span class="pl-c1">%s</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (groups[g.group].name, mesh.name))</td>
4446 </tr>
4447 <tr>
4448 <td id="L912" class="blob-num js-line-number" data-line-number="912"></td>
4449 <td id="LC912" class="blob-code blob-code-inner js-file-line">
4450</td>
4451 </tr>
4452 <tr>
4453 <td id="L913" class="blob-num js-line-number" data-line-number="913"></td>
4454 <td id="LC913" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> face.use_smooth:</td>
4455 </tr>
4456 <tr>
4457 <td id="L914" class="blob-num js-line-number" data-line-number="914"></td>
4458 <td id="LC914" class="blob-code blob-code-inner js-file-line"> vertindex <span class="pl-k">=</span> <span class="pl-c1">len</span>(verts)</td>
4459 </tr>
4460 <tr>
4461 <td id="L915" class="blob-num js-line-number" data-line-number="915"></td>
4462 <td id="LC915" class="blob-code blob-code-inner js-file-line"> vertkey <span class="pl-k">=</span> Vertex(vertindex, vertco, vertno, vertuv, vertweights, vertcol)</td>
4463 </tr>
4464 <tr>
4465 <td id="L916" class="blob-num js-line-number" data-line-number="916"></td>
4466 <td id="LC916" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> filetype <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>IQM<span class="pl-pds">'</span></span>:</td>
4467 </tr>
4468 <tr>
4469 <td id="L917" class="blob-num js-line-number" data-line-number="917"></td>
4470 <td id="LC917" class="blob-code blob-code-inner js-file-line"> vertkey.normalizeWeights()</td>
4471 </tr>
4472 <tr>
4473 <td id="L918" class="blob-num js-line-number" data-line-number="918"></td>
4474 <td id="LC918" class="blob-code blob-code-inner js-file-line"> mesh.verts.append(vertkey)</td>
4475 </tr>
4476 <tr>
4477 <td id="L919" class="blob-num js-line-number" data-line-number="919"></td>
4478 <td id="LC919" class="blob-code blob-code-inner js-file-line"> faceverts.append(vertkey)</td>
4479 </tr>
4480 <tr>
4481 <td id="L920" class="blob-num js-line-number" data-line-number="920"></td>
4482 <td id="LC920" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">continue</span> </td>
4483 </tr>
4484 <tr>
4485 <td id="L921" class="blob-num js-line-number" data-line-number="921"></td>
4486 <td id="LC921" class="blob-code blob-code-inner js-file-line"> </td>
4487 </tr>
4488 <tr>
4489 <td id="L922" class="blob-num js-line-number" data-line-number="922"></td>
4490 <td id="LC922" class="blob-code blob-code-inner js-file-line"> vertkey <span class="pl-k">=</span> Vertex(v.index, vertco, vertno, vertuv, vertweights, vertcol)</td>
4491 </tr>
4492 <tr>
4493 <td id="L923" class="blob-num js-line-number" data-line-number="923"></td>
4494 <td id="LC923" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> filetype <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>IQM<span class="pl-pds">'</span></span>:</td>
4495 </tr>
4496 <tr>
4497 <td id="L924" class="blob-num js-line-number" data-line-number="924"></td>
4498 <td id="LC924" class="blob-code blob-code-inner js-file-line"> vertkey.normalizeWeights()</td>
4499 </tr>
4500 <tr>
4501 <td id="L925" class="blob-num js-line-number" data-line-number="925"></td>
4502 <td id="LC925" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-k">not</span> verts[v.index]:</td>
4503 </tr>
4504 <tr>
4505 <td id="L926" class="blob-num js-line-number" data-line-number="926"></td>
4506 <td id="LC926" class="blob-code blob-code-inner js-file-line"> verts[v.index] <span class="pl-k">=</span> vertkey</td>
4507 </tr>
4508 <tr>
4509 <td id="L927" class="blob-num js-line-number" data-line-number="927"></td>
4510 <td id="LC927" class="blob-code blob-code-inner js-file-line"> faceverts.append(vertkey)</td>
4511 </tr>
4512 <tr>
4513 <td id="L928" class="blob-num js-line-number" data-line-number="928"></td>
4514 <td id="LC928" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">elif</span> verts[v.index] <span class="pl-k">==</span> vertkey:</td>
4515 </tr>
4516 <tr>
4517 <td id="L929" class="blob-num js-line-number" data-line-number="929"></td>
4518 <td id="LC929" class="blob-code blob-code-inner js-file-line"> faceverts.append(verts[v.index])</td>
4519 </tr>
4520 <tr>
4521 <td id="L930" class="blob-num js-line-number" data-line-number="930"></td>
4522 <td id="LC930" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4523 </tr>
4524 <tr>
4525 <td id="L931" class="blob-num js-line-number" data-line-number="931"></td>
4526 <td id="LC931" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>:</td>
4527 </tr>
4528 <tr>
4529 <td id="L932" class="blob-num js-line-number" data-line-number="932"></td>
4530 <td id="LC932" class="blob-code blob-code-inner js-file-line"> vertindex <span class="pl-k">=</span> vertmap[vertkey]</td>
4531 </tr>
4532 <tr>
4533 <td id="L933" class="blob-num js-line-number" data-line-number="933"></td>
4534 <td id="LC933" class="blob-code blob-code-inner js-file-line"> faceverts.append(verts[vertindex])</td>
4535 </tr>
4536 <tr>
4537 <td id="L934" class="blob-num js-line-number" data-line-number="934"></td>
4538 <td id="LC934" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>:</td>
4539 </tr>
4540 <tr>
4541 <td id="L935" class="blob-num js-line-number" data-line-number="935"></td>
4542 <td id="LC935" class="blob-code blob-code-inner js-file-line"> vertindex <span class="pl-k">=</span> <span class="pl-c1">len</span>(verts)</td>
4543 </tr>
4544 <tr>
4545 <td id="L936" class="blob-num js-line-number" data-line-number="936"></td>
4546 <td id="LC936" class="blob-code blob-code-inner js-file-line"> vertmap[vertkey] <span class="pl-k">=</span> vertindex</td>
4547 </tr>
4548 <tr>
4549 <td id="L937" class="blob-num js-line-number" data-line-number="937"></td>
4550 <td id="LC937" class="blob-code blob-code-inner js-file-line"> verts.append(vertkey)</td>
4551 </tr>
4552 <tr>
4553 <td id="L938" class="blob-num js-line-number" data-line-number="938"></td>
4554 <td id="LC938" class="blob-code blob-code-inner js-file-line"> faceverts.append(vertkey)</td>
4555 </tr>
4556 <tr>
4557 <td id="L939" class="blob-num js-line-number" data-line-number="939"></td>
4558 <td id="LC939" class="blob-code blob-code-inner js-file-line">
4559</td>
4560 </tr>
4561 <tr>
4562 <td id="L940" class="blob-num js-line-number" data-line-number="940"></td>
4563 <td id="LC940" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"><span class="pl-c">#</span> Quake winding is reversed</span></td>
4564 </tr>
4565 <tr>
4566 <td id="L941" class="blob-num js-line-number" data-line-number="941"></td>
4567 <td id="LC941" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> i <span class="pl-k">in</span> <span class="pl-c1">range</span>(<span class="pl-c1">2</span>, <span class="pl-c1">len</span>(faceverts)):</td>
4568 </tr>
4569 <tr>
4570 <td id="L942" class="blob-num js-line-number" data-line-number="942"></td>
4571 <td id="LC942" class="blob-code blob-code-inner js-file-line"> mesh.tris.append((faceverts[<span class="pl-c1">0</span>], faceverts[i], faceverts[i<span class="pl-k">-</span><span class="pl-c1">1</span>])) </td>
4572 </tr>
4573 <tr>
4574 <td id="L943" class="blob-num js-line-number" data-line-number="943"></td>
4575 <td id="LC943" class="blob-code blob-code-inner js-file-line"> </td>
4576 </tr>
4577 <tr>
4578 <td id="L944" class="blob-num js-line-number" data-line-number="944"></td>
4579 <td id="LC944" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> meshes:</td>
4580 </tr>
4581 <tr>
4582 <td id="L945" class="blob-num js-line-number" data-line-number="945"></td>
4583 <td id="LC945" class="blob-code blob-code-inner js-file-line"> mesh.optimize()</td>
4584 </tr>
4585 <tr>
4586 <td id="L946" class="blob-num js-line-number" data-line-number="946"></td>
4587 <td id="LC946" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> filetype <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>IQM<span class="pl-pds">'</span></span>:</td>
4588 </tr>
4589 <tr>
4590 <td id="L947" class="blob-num js-line-number" data-line-number="947"></td>
4591 <td id="LC947" class="blob-code blob-code-inner js-file-line"> mesh.calcTangents()</td>
4592 </tr>
4593 <tr>
4594 <td id="L948" class="blob-num js-line-number" data-line-number="948"></td>
4595 <td id="LC948" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-c1">%s</span> <span class="pl-c1">%s</span>: generated <span class="pl-c1">%d</span> triangles<span class="pl-pds">'</span></span> <span class="pl-k">%</span> (mesh.name, mesh.material, <span class="pl-c1">len</span>(mesh.tris)))</td>
4596 </tr>
4597 <tr>
4598 <td id="L949" class="blob-num js-line-number" data-line-number="949"></td>
4599 <td id="LC949" class="blob-code blob-code-inner js-file-line">
4600</td>
4601 </tr>
4602 <tr>
4603 <td id="L950" class="blob-num js-line-number" data-line-number="950"></td>
4604 <td id="LC950" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> meshes</td>
4605 </tr>
4606 <tr>
4607 <td id="L951" class="blob-num js-line-number" data-line-number="951"></td>
4608 <td id="LC951" class="blob-code blob-code-inner js-file-line">
4609</td>
4610 </tr>
4611 <tr>
4612 <td id="L952" class="blob-num js-line-number" data-line-number="952"></td>
4613 <td id="LC952" class="blob-code blob-code-inner js-file-line">
4614</td>
4615 </tr>
4616 <tr>
4617 <td id="L953" class="blob-num js-line-number" data-line-number="953"></td>
4618 <td id="LC953" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">exportIQE</span>(<span class="pl-smi">file</span>, <span class="pl-smi">meshes</span>, <span class="pl-smi">bones</span>, <span class="pl-smi">anims</span>):</td>
4619 </tr>
4620 <tr>
4621 <td id="L954" class="blob-num js-line-number" data-line-number="954"></td>
4622 <td id="LC954" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span># Inter-Quake Export<span class="pl-cce">\n\n</span><span class="pl-pds">'</span></span>)</td>
4623 </tr>
4624 <tr>
4625 <td id="L955" class="blob-num js-line-number" data-line-number="955"></td>
4626 <td id="LC955" class="blob-code blob-code-inner js-file-line">
4627</td>
4628 </tr>
4629 <tr>
4630 <td id="L956" class="blob-num js-line-number" data-line-number="956"></td>
4631 <td id="LC956" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> bone <span class="pl-k">in</span> bones:</td>
4632 </tr>
4633 <tr>
4634 <td id="L957" class="blob-num js-line-number" data-line-number="957"></td>
4635 <td id="LC957" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bone.parent:</td>
4636 </tr>
4637 <tr>
4638 <td id="L958" class="blob-num js-line-number" data-line-number="958"></td>
4639 <td id="LC958" class="blob-code blob-code-inner js-file-line"> parent <span class="pl-k">=</span> bone.parent.index</td>
4640 </tr>
4641 <tr>
4642 <td id="L959" class="blob-num js-line-number" data-line-number="959"></td>
4643 <td id="LC959" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4644 </tr>
4645 <tr>
4646 <td id="L960" class="blob-num js-line-number" data-line-number="960"></td>
4647 <td id="LC960" class="blob-code blob-code-inner js-file-line"> parent <span class="pl-k">=</span> <span class="pl-k">-</span><span class="pl-c1">1</span></td>
4648 </tr>
4649 <tr>
4650 <td id="L961" class="blob-num js-line-number" data-line-number="961"></td>
4651 <td id="LC961" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span>joint "<span class="pl-c1">%s</span>" <span class="pl-c1">%d</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (bone.name, parent))</td>
4652 </tr>
4653 <tr>
4654 <td id="L962" class="blob-num js-line-number" data-line-number="962"></td>
4655 <td id="LC962" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> meshes:</td>
4656 </tr>
4657 <tr>
4658 <td id="L963" class="blob-num js-line-number" data-line-number="963"></td>
4659 <td id="LC963" class="blob-code blob-code-inner js-file-line"> pos <span class="pl-k">=</span> bone.localmatrix.to_translation()</td>
4660 </tr>
4661 <tr>
4662 <td id="L964" class="blob-num js-line-number" data-line-number="964"></td>
4663 <td id="LC964" class="blob-code blob-code-inner js-file-line"> orient <span class="pl-k">=</span> bone.localmatrix.to_quaternion()</td>
4664 </tr>
4665 <tr>
4666 <td id="L965" class="blob-num js-line-number" data-line-number="965"></td>
4667 <td id="LC965" class="blob-code blob-code-inner js-file-line"> orient.normalize()</td>
4668 </tr>
4669 <tr>
4670 <td id="L966" class="blob-num js-line-number" data-line-number="966"></td>
4671 <td id="LC966" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> orient.w <span class="pl-k">></span> <span class="pl-c1">0</span>:</td>
4672 </tr>
4673 <tr>
4674 <td id="L967" class="blob-num js-line-number" data-line-number="967"></td>
4675 <td id="LC967" class="blob-code blob-code-inner js-file-line"> orient.negate()</td>
4676 </tr>
4677 <tr>
4678 <td id="L968" class="blob-num js-line-number" data-line-number="968"></td>
4679 <td id="LC968" class="blob-code blob-code-inner js-file-line"> scale <span class="pl-k">=</span> bone.localmatrix.to_scale()</td>
4680 </tr>
4681 <tr>
4682 <td id="L969" class="blob-num js-line-number" data-line-number="969"></td>
4683 <td id="LC969" class="blob-code blob-code-inner js-file-line"> scale.x <span class="pl-k">=</span> <span class="pl-c1">round</span>(scale.x<span class="pl-k">*</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span>)<span class="pl-k">/</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span></td>
4684 </tr>
4685 <tr>
4686 <td id="L970" class="blob-num js-line-number" data-line-number="970"></td>
4687 <td id="LC970" class="blob-code blob-code-inner js-file-line"> scale.y <span class="pl-k">=</span> <span class="pl-c1">round</span>(scale.y<span class="pl-k">*</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span>)<span class="pl-k">/</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span></td>
4688 </tr>
4689 <tr>
4690 <td id="L971" class="blob-num js-line-number" data-line-number="971"></td>
4691 <td id="LC971" class="blob-code blob-code-inner js-file-line"> scale.z <span class="pl-k">=</span> <span class="pl-c1">round</span>(scale.z<span class="pl-k">*</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span>)<span class="pl-k">/</span><span class="pl-c1"><span class="pl-k">0x</span>10000</span></td>
4692 </tr>
4693 <tr>
4694 <td id="L972" class="blob-num js-line-number" data-line-number="972"></td>
4695 <td id="LC972" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> scale.x <span class="pl-k">==</span> <span class="pl-c1">1.0</span> <span class="pl-k">and</span> scale.y <span class="pl-k">==</span> <span class="pl-c1">1.0</span> <span class="pl-k">and</span> scale.z <span class="pl-k">==</span> <span class="pl-c1">1.0</span>:</td>
4696 </tr>
4697 <tr>
4698 <td id="L973" class="blob-num js-line-number" data-line-number="973"></td>
4699 <td id="LC973" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\t</span>pq <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (pos.x, pos.y, pos.z, orient.x, orient.y, orient.z, orient.w))</td>
4700 </tr>
4701 <tr>
4702 <td id="L974" class="blob-num js-line-number" data-line-number="974"></td>
4703 <td id="LC974" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4704 </tr>
4705 <tr>
4706 <td id="L975" class="blob-num js-line-number" data-line-number="975"></td>
4707 <td id="LC975" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\t</span>pq <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (pos.x, pos.y, pos.z, orient.x, orient.y, orient.z, orient.w, scale.x, scale.y, scale.z))</td>
4708 </tr>
4709 <tr>
4710 <td id="L976" class="blob-num js-line-number" data-line-number="976"></td>
4711 <td id="LC976" class="blob-code blob-code-inner js-file-line">
4712</td>
4713 </tr>
4714 <tr>
4715 <td id="L977" class="blob-num js-line-number" data-line-number="977"></td>
4716 <td id="LC977" class="blob-code blob-code-inner js-file-line"> hascolors <span class="pl-k">=</span> <span class="pl-c1">any</span>(mesh.verts <span class="pl-k">and</span> mesh.verts[<span class="pl-c1">0</span>].color <span class="pl-k">for</span> mesh <span class="pl-k">in</span> meshes)</td>
4717 </tr>
4718 <tr>
4719 <td id="L978" class="blob-num js-line-number" data-line-number="978"></td>
4720 <td id="LC978" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> mesh <span class="pl-k">in</span> meshes:</td>
4721 </tr>
4722 <tr>
4723 <td id="L979" class="blob-num js-line-number" data-line-number="979"></td>
4724 <td id="LC979" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\n</span>mesh "<span class="pl-c1">%s</span>"<span class="pl-cce">\n\t</span>material "<span class="pl-c1">%s</span>"<span class="pl-cce">\n\n</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (mesh.name, mesh.material))</td>
4725 </tr>
4726 <tr>
4727 <td id="L980" class="blob-num js-line-number" data-line-number="980"></td>
4728 <td id="LC980" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> v <span class="pl-k">in</span> mesh.verts:</td>
4729 </tr>
4730 <tr>
4731 <td id="L981" class="blob-num js-line-number" data-line-number="981"></td>
4732 <td id="LC981" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span>vp <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span><span class="pl-cce">\n\t</span>vt <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span><span class="pl-cce">\n\t</span>vn <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (v.coord.x, v.coord.y, v.coord.z, v.uv.x, v.uv.y, v.normal.x, v.normal.y, v.normal.z))</td>
4733 </tr>
4734 <tr>
4735 <td id="L982" class="blob-num js-line-number" data-line-number="982"></td>
4736 <td id="LC982" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> bones:</td>
4737 </tr>
4738 <tr>
4739 <td id="L983" class="blob-num js-line-number" data-line-number="983"></td>
4740 <td id="LC983" class="blob-code blob-code-inner js-file-line"> weights <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\t</span>vb<span class="pl-pds">'</span></span></td>
4741 </tr>
4742 <tr>
4743 <td id="L984" class="blob-num js-line-number" data-line-number="984"></td>
4744 <td id="LC984" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> weight <span class="pl-k">in</span> v.weights:</td>
4745 </tr>
4746 <tr>
4747 <td id="L985" class="blob-num js-line-number" data-line-number="985"></td>
4748 <td id="LC985" class="blob-code blob-code-inner js-file-line"> weights <span class="pl-k">+=</span> <span class="pl-s"><span class="pl-pds">'</span> <span class="pl-c1">%d</span> <span class="pl-c1">%.8f</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (weight[<span class="pl-c1">1</span>], weight[<span class="pl-c1">0</span>])</td>
4749 </tr>
4750 <tr>
4751 <td id="L986" class="blob-num js-line-number" data-line-number="986"></td>
4752 <td id="LC986" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(weights <span class="pl-k">+</span> <span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span>)</td>
4753 </tr>
4754 <tr>
4755 <td id="L987" class="blob-num js-line-number" data-line-number="987"></td>
4756 <td id="LC987" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> hascolors:</td>
4757 </tr>
4758 <tr>
4759 <td id="L988" class="blob-num js-line-number" data-line-number="988"></td>
4760 <td id="LC988" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> v.color:</td>
4761 </tr>
4762 <tr>
4763 <td id="L989" class="blob-num js-line-number" data-line-number="989"></td>
4764 <td id="LC989" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\t</span>vc <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (v.color[<span class="pl-c1">0</span>] <span class="pl-k">/</span> <span class="pl-c1">255.0</span>, v.color[<span class="pl-c1">1</span>] <span class="pl-k">/</span> <span class="pl-c1">255.0</span>, v.color[<span class="pl-c1">2</span>] <span class="pl-k">/</span> <span class="pl-c1">255.0</span>, v.color[<span class="pl-c1">3</span>] <span class="pl-k">/</span> <span class="pl-c1">255.0</span>))</td>
4765 </tr>
4766 <tr>
4767 <td id="L990" class="blob-num js-line-number" data-line-number="990"></td>
4768 <td id="LC990" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4769 </tr>
4770 <tr>
4771 <td id="L991" class="blob-num js-line-number" data-line-number="991"></td>
4772 <td id="LC991" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\t</span>vc 0 0 0 1<span class="pl-cce">\n</span><span class="pl-pds">'</span></span>)</td>
4773 </tr>
4774 <tr>
4775 <td id="L992" class="blob-num js-line-number" data-line-number="992"></td>
4776 <td id="LC992" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span>)</td>
4777 </tr>
4778 <tr>
4779 <td id="L993" class="blob-num js-line-number" data-line-number="993"></td>
4780 <td id="LC993" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> (v0, v1, v2) <span class="pl-k">in</span> mesh.tris:</td>
4781 </tr>
4782 <tr>
4783 <td id="L994" class="blob-num js-line-number" data-line-number="994"></td>
4784 <td id="LC994" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span>fm <span class="pl-c1">%d</span> <span class="pl-c1">%d</span> <span class="pl-c1">%d</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (v0.index, v1.index, v2.index))</td>
4785 </tr>
4786 <tr>
4787 <td id="L995" class="blob-num js-line-number" data-line-number="995"></td>
4788 <td id="LC995" class="blob-code blob-code-inner js-file-line">
4789</td>
4790 </tr>
4791 <tr>
4792 <td id="L996" class="blob-num js-line-number" data-line-number="996"></td>
4793 <td id="LC996" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> anim <span class="pl-k">in</span> anims:</td>
4794 </tr>
4795 <tr>
4796 <td id="L997" class="blob-num js-line-number" data-line-number="997"></td>
4797 <td id="LC997" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\n</span>animation "<span class="pl-c1">%s</span>"<span class="pl-cce">\n\t</span>framerate <span class="pl-c1">%.8f</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (anim.name, anim.fps))</td>
4798 </tr>
4799 <tr>
4800 <td id="L998" class="blob-num js-line-number" data-line-number="998"></td>
4801 <td id="LC998" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> anim.flags<span class="pl-k">&</span><span class="pl-c1">IQM_LOOP</span>:</td>
4802 </tr>
4803 <tr>
4804 <td id="L999" class="blob-num js-line-number" data-line-number="999"></td>
4805 <td id="LC999" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\t</span>loop<span class="pl-cce">\n</span><span class="pl-pds">'</span></span>)</td>
4806 </tr>
4807 <tr>
4808 <td id="L1000" class="blob-num js-line-number" data-line-number="1000"></td>
4809 <td id="LC1000" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> frame <span class="pl-k">in</span> anim.frames:</td>
4810 </tr>
4811 <tr>
4812 <td id="L1001" class="blob-num js-line-number" data-line-number="1001"></td>
4813 <td id="LC1001" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\n</span>frame<span class="pl-cce">\n</span><span class="pl-pds">'</span></span>)</td>
4814 </tr>
4815 <tr>
4816 <td id="L1002" class="blob-num js-line-number" data-line-number="1002"></td>
4817 <td id="LC1002" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> (pos, orient, scale, mat) <span class="pl-k">in</span> frame:</td>
4818 </tr>
4819 <tr>
4820 <td id="L1003" class="blob-num js-line-number" data-line-number="1003"></td>
4821 <td id="LC1003" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> scale.x <span class="pl-k">==</span> <span class="pl-c1">1.0</span> <span class="pl-k">and</span> scale.y <span class="pl-k">==</span> <span class="pl-c1">1.0</span> <span class="pl-k">and</span> scale.z <span class="pl-k">==</span> <span class="pl-c1">1.0</span>:</td>
4822 </tr>
4823 <tr>
4824 <td id="L1004" class="blob-num js-line-number" data-line-number="1004"></td>
4825 <td id="LC1004" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span>pq <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (pos.x, pos.y, pos.z, orient.x, orient.y, orient.z, orient.w))</td>
4826 </tr>
4827 <tr>
4828 <td id="L1005" class="blob-num js-line-number" data-line-number="1005"></td>
4829 <td id="LC1005" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4830 </tr>
4831 <tr>
4832 <td id="L1006" class="blob-num js-line-number" data-line-number="1006"></td>
4833 <td id="LC1006" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span>pq <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span> <span class="pl-c1">%.8f</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (pos.x, pos.y, pos.z, orient.x, orient.y, orient.z, orient.w, scale.x, scale.y, scale.z))</td>
4834 </tr>
4835 <tr>
4836 <td id="L1007" class="blob-num js-line-number" data-line-number="1007"></td>
4837 <td id="LC1007" class="blob-code blob-code-inner js-file-line">
4838</td>
4839 </tr>
4840 <tr>
4841 <td id="L1008" class="blob-num js-line-number" data-line-number="1008"></td>
4842 <td id="LC1008" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.write(<span class="pl-s"><span class="pl-pds">'</span><span class="pl-cce">\n</span><span class="pl-pds">'</span></span>)</td>
4843 </tr>
4844 <tr>
4845 <td id="L1009" class="blob-num js-line-number" data-line-number="1009"></td>
4846 <td id="LC1009" class="blob-code blob-code-inner js-file-line">
4847</td>
4848 </tr>
4849 <tr>
4850 <td id="L1010" class="blob-num js-line-number" data-line-number="1010"></td>
4851 <td id="LC1010" class="blob-code blob-code-inner js-file-line">
4852</td>
4853 </tr>
4854 <tr>
4855 <td id="L1011" class="blob-num js-line-number" data-line-number="1011"></td>
4856 <td id="LC1011" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">exportIQM</span>(<span class="pl-smi">context</span>, <span class="pl-smi">filename</span>, <span class="pl-smi">usemesh</span> <span class="pl-k">=</span> <span class="pl-c1">True</span>, <span class="pl-smi">usemods</span> <span class="pl-k">=</span> <span class="pl-c1">False</span>, <span class="pl-smi">useskel</span> <span class="pl-k">=</span> <span class="pl-c1">True</span>, <span class="pl-smi">usebbox</span> <span class="pl-k">=</span> <span class="pl-c1">True</span>, <span class="pl-smi">usecol</span> <span class="pl-k">=</span> <span class="pl-c1">False</span>, <span class="pl-smi">scale</span> <span class="pl-k">=</span> <span class="pl-c1">1.0</span>, <span class="pl-smi">animspecs</span> <span class="pl-k">=</span> <span class="pl-c1">None</span>, <span class="pl-smi">matfun</span> <span class="pl-k">=</span> (<span class="pl-k">lambda</span> <span class="pl-smi">prefix</span>, <span class="pl-smi">image</span>: image), <span class="pl-smi">derigify</span> <span class="pl-k">=</span> <span class="pl-c1">False</span>, <span class="pl-smi">boneorder</span> <span class="pl-k">=</span> <span class="pl-c1">None</span>):</td>
4857 </tr>
4858 <tr>
4859 <td id="L1012" class="blob-num js-line-number" data-line-number="1012"></td>
4860 <td id="LC1012" class="blob-code blob-code-inner js-file-line"> armature <span class="pl-k">=</span> findArmature(context)</td>
4861 </tr>
4862 <tr>
4863 <td id="L1013" class="blob-num js-line-number" data-line-number="1013"></td>
4864 <td id="LC1013" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> useskel <span class="pl-k">and</span> <span class="pl-k">not</span> armature:</td>
4865 </tr>
4866 <tr>
4867 <td id="L1014" class="blob-num js-line-number" data-line-number="1014"></td>
4868 <td id="LC1014" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>No armature selected<span class="pl-pds">'</span></span>)</td>
4869 </tr>
4870 <tr>
4871 <td id="L1015" class="blob-num js-line-number" data-line-number="1015"></td>
4872 <td id="LC1015" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span></td>
4873 </tr>
4874 <tr>
4875 <td id="L1016" class="blob-num js-line-number" data-line-number="1016"></td>
4876 <td id="LC1016" class="blob-code blob-code-inner js-file-line">
4877</td>
4878 </tr>
4879 <tr>
4880 <td id="L1017" class="blob-num js-line-number" data-line-number="1017"></td>
4881 <td id="LC1017" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> filename.lower().endswith(<span class="pl-s"><span class="pl-pds">'</span>.iqm<span class="pl-pds">'</span></span>):</td>
4882 </tr>
4883 <tr>
4884 <td id="L1018" class="blob-num js-line-number" data-line-number="1018"></td>
4885 <td id="LC1018" class="blob-code blob-code-inner js-file-line"> filetype <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">'</span>IQM<span class="pl-pds">'</span></span></td>
4886 </tr>
4887 <tr>
4888 <td id="L1019" class="blob-num js-line-number" data-line-number="1019"></td>
4889 <td id="LC1019" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">elif</span> filename.lower().endswith(<span class="pl-s"><span class="pl-pds">'</span>.iqe<span class="pl-pds">'</span></span>):</td>
4890 </tr>
4891 <tr>
4892 <td id="L1020" class="blob-num js-line-number" data-line-number="1020"></td>
4893 <td id="LC1020" class="blob-code blob-code-inner js-file-line"> filetype <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">'</span>IQE<span class="pl-pds">'</span></span></td>
4894 </tr>
4895 <tr>
4896 <td id="L1021" class="blob-num js-line-number" data-line-number="1021"></td>
4897 <td id="LC1021" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4898 </tr>
4899 <tr>
4900 <td id="L1022" class="blob-num js-line-number" data-line-number="1022"></td>
4901 <td id="LC1022" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Unknown file type: <span class="pl-c1">%s</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> filename)</td>
4902 </tr>
4903 <tr>
4904 <td id="L1023" class="blob-num js-line-number" data-line-number="1023"></td>
4905 <td id="LC1023" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span></td>
4906 </tr>
4907 <tr>
4908 <td id="L1024" class="blob-num js-line-number" data-line-number="1024"></td>
4909 <td id="LC1024" class="blob-code blob-code-inner js-file-line">
4910</td>
4911 </tr>
4912 <tr>
4913 <td id="L1025" class="blob-num js-line-number" data-line-number="1025"></td>
4914 <td id="LC1025" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> useskel:</td>
4915 </tr>
4916 <tr>
4917 <td id="L1026" class="blob-num js-line-number" data-line-number="1026"></td>
4918 <td id="LC1026" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> derigify:</td>
4919 </tr>
4920 <tr>
4921 <td id="L1027" class="blob-num js-line-number" data-line-number="1027"></td>
4922 <td id="LC1027" class="blob-code blob-code-inner js-file-line"> bones <span class="pl-k">=</span> derigifyBones(context, armature, scale)</td>
4923 </tr>
4924 <tr>
4925 <td id="L1028" class="blob-num js-line-number" data-line-number="1028"></td>
4926 <td id="LC1028" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4927 </tr>
4928 <tr>
4929 <td id="L1029" class="blob-num js-line-number" data-line-number="1029"></td>
4930 <td id="LC1029" class="blob-code blob-code-inner js-file-line"> bones <span class="pl-k">=</span> collectBones(context, armature, scale)</td>
4931 </tr>
4932 <tr>
4933 <td id="L1030" class="blob-num js-line-number" data-line-number="1030"></td>
4934 <td id="LC1030" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
4935 </tr>
4936 <tr>
4937 <td id="L1031" class="blob-num js-line-number" data-line-number="1031"></td>
4938 <td id="LC1031" class="blob-code blob-code-inner js-file-line"> bones <span class="pl-k">=</span> {}</td>
4939 </tr>
4940 <tr>
4941 <td id="L1032" class="blob-num js-line-number" data-line-number="1032"></td>
4942 <td id="LC1032" class="blob-code blob-code-inner js-file-line">
4943</td>
4944 </tr>
4945 <tr>
4946 <td id="L1033" class="blob-num js-line-number" data-line-number="1033"></td>
4947 <td id="LC1033" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> boneorder:</td>
4948 </tr>
4949 <tr>
4950 <td id="L1034" class="blob-num js-line-number" data-line-number="1034"></td>
4951 <td id="LC1034" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>:</td>
4952 </tr>
4953 <tr>
4954 <td id="L1035" class="blob-num js-line-number" data-line-number="1035"></td>
4955 <td id="LC1035" class="blob-code blob-code-inner js-file-line"> f <span class="pl-k">=</span> <span class="pl-c1">open</span>(bpy_extras.io_utils.path_reference(boneorder, os.path.dirname(bpy.data.filepath), os.path.dirname(filename)), <span class="pl-s"><span class="pl-pds">"</span>r<span class="pl-pds">"</span></span>, <span class="pl-v">encoding</span> <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">"</span>utf-8<span class="pl-pds">"</span></span>)</td>
4956 </tr>
4957 <tr>
4958 <td id="L1036" class="blob-num js-line-number" data-line-number="1036"></td>
4959 <td id="LC1036" class="blob-code blob-code-inner js-file-line"> names <span class="pl-k">=</span> [line.strip() <span class="pl-k">for</span> line <span class="pl-k">in</span> f.readlines()]</td>
4960 </tr>
4961 <tr>
4962 <td id="L1037" class="blob-num js-line-number" data-line-number="1037"></td>
4963 <td id="LC1037" class="blob-code blob-code-inner js-file-line"> f.close()</td>
4964 </tr>
4965 <tr>
4966 <td id="L1038" class="blob-num js-line-number" data-line-number="1038"></td>
4967 <td id="LC1038" class="blob-code blob-code-inner js-file-line"> names <span class="pl-k">=</span> [name <span class="pl-k">for</span> name <span class="pl-k">in</span> names <span class="pl-k">if</span> name <span class="pl-k">in</span> [bone.name <span class="pl-k">for</span> bone <span class="pl-k">in</span> bones.values()]]</td>
4968 </tr>
4969 <tr>
4970 <td id="L1039" class="blob-num js-line-number" data-line-number="1039"></td>
4971 <td id="LC1039" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">len</span>(names) <span class="pl-k">!=</span> <span class="pl-c1">len</span>(bones):</td>
4972 </tr>
4973 <tr>
4974 <td id="L1040" class="blob-num js-line-number" data-line-number="1040"></td>
4975 <td id="LC1040" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Bone order (<span class="pl-c1">%d</span>) does not match skeleton (<span class="pl-c1">%d</span>)<span class="pl-pds">'</span></span> <span class="pl-k">%</span> (<span class="pl-c1">len</span>(names), <span class="pl-c1">len</span>(bones)))</td>
4976 </tr>
4977 <tr>
4978 <td id="L1041" class="blob-num js-line-number" data-line-number="1041"></td>
4979 <td id="LC1041" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> </td>
4980 </tr>
4981 <tr>
4982 <td id="L1042" class="blob-num js-line-number" data-line-number="1042"></td>
4983 <td id="LC1042" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Reordering bones<span class="pl-pds">'</span></span>)</td>
4984 </tr>
4985 <tr>
4986 <td id="L1043" class="blob-num js-line-number" data-line-number="1043"></td>
4987 <td id="LC1043" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">for</span> bone <span class="pl-k">in</span> bones.values():</td>
4988 </tr>
4989 <tr>
4990 <td id="L1044" class="blob-num js-line-number" data-line-number="1044"></td>
4991 <td id="LC1044" class="blob-code blob-code-inner js-file-line"> bone.index <span class="pl-k">=</span> names.index(bone.name)</td>
4992 </tr>
4993 <tr>
4994 <td id="L1045" class="blob-num js-line-number" data-line-number="1045"></td>
4995 <td id="LC1045" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>:</td>
4996 </tr>
4997 <tr>
4998 <td id="L1046" class="blob-num js-line-number" data-line-number="1046"></td>
4999 <td id="LC1046" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Failed opening bone order: <span class="pl-c1">%s</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> boneorder)</td>
5000 </tr>
5001 <tr>
5002 <td id="L1047" class="blob-num js-line-number" data-line-number="1047"></td>
5003 <td id="LC1047" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span></td>
5004 </tr>
5005 <tr>
5006 <td id="L1048" class="blob-num js-line-number" data-line-number="1048"></td>
5007 <td id="LC1048" class="blob-code blob-code-inner js-file-line">
5008</td>
5009 </tr>
5010 <tr>
5011 <td id="L1049" class="blob-num js-line-number" data-line-number="1049"></td>
5012 <td id="LC1049" class="blob-code blob-code-inner js-file-line"> bonelist <span class="pl-k">=</span> <span class="pl-c1">sorted</span>(bones.values(), <span class="pl-v">key</span> <span class="pl-k">=</span> <span class="pl-k">lambda</span> <span class="pl-smi">bone</span>: bone.index)</td>
5013 </tr>
5014 <tr>
5015 <td id="L1050" class="blob-num js-line-number" data-line-number="1050"></td>
5016 <td id="LC1050" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> usemesh:</td>
5017 </tr>
5018 <tr>
5019 <td id="L1051" class="blob-num js-line-number" data-line-number="1051"></td>
5020 <td id="LC1051" class="blob-code blob-code-inner js-file-line"> meshes <span class="pl-k">=</span> collectMeshes(context, bones, scale, matfun, useskel, usecol, usemods, filetype)</td>
5021 </tr>
5022 <tr>
5023 <td id="L1052" class="blob-num js-line-number" data-line-number="1052"></td>
5024 <td id="LC1052" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
5025 </tr>
5026 <tr>
5027 <td id="L1053" class="blob-num js-line-number" data-line-number="1053"></td>
5028 <td id="LC1053" class="blob-code blob-code-inner js-file-line"> meshes <span class="pl-k">=</span> []</td>
5029 </tr>
5030 <tr>
5031 <td id="L1054" class="blob-num js-line-number" data-line-number="1054"></td>
5032 <td id="LC1054" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> useskel <span class="pl-k">and</span> animspecs:</td>
5033 </tr>
5034 <tr>
5035 <td id="L1055" class="blob-num js-line-number" data-line-number="1055"></td>
5036 <td id="LC1055" class="blob-code blob-code-inner js-file-line"> anims <span class="pl-k">=</span> collectAnims(context, armature, scale, bonelist, animspecs)</td>
5037 </tr>
5038 <tr>
5039 <td id="L1056" class="blob-num js-line-number" data-line-number="1056"></td>
5040 <td id="LC1056" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
5041 </tr>
5042 <tr>
5043 <td id="L1057" class="blob-num js-line-number" data-line-number="1057"></td>
5044 <td id="LC1057" class="blob-code blob-code-inner js-file-line"> anims <span class="pl-k">=</span> []</td>
5045 </tr>
5046 <tr>
5047 <td id="L1058" class="blob-num js-line-number" data-line-number="1058"></td>
5048 <td id="LC1058" class="blob-code blob-code-inner js-file-line">
5049</td>
5050 </tr>
5051 <tr>
5052 <td id="L1059" class="blob-num js-line-number" data-line-number="1059"></td>
5053 <td id="LC1059" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> filetype <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>IQM<span class="pl-pds">'</span></span>:</td>
5054 </tr>
5055 <tr>
5056 <td id="L1060" class="blob-num js-line-number" data-line-number="1060"></td>
5057 <td id="LC1060" class="blob-code blob-code-inner js-file-line"> iqm <span class="pl-k">=</span> IQMFile()</td>
5058 </tr>
5059 <tr>
5060 <td id="L1061" class="blob-num js-line-number" data-line-number="1061"></td>
5061 <td id="LC1061" class="blob-code blob-code-inner js-file-line"> iqm.addMeshes(meshes)</td>
5062 </tr>
5063 <tr>
5064 <td id="L1062" class="blob-num js-line-number" data-line-number="1062"></td>
5065 <td id="LC1062" class="blob-code blob-code-inner js-file-line"> iqm.addJoints(bonelist)</td>
5066 </tr>
5067 <tr>
5068 <td id="L1063" class="blob-num js-line-number" data-line-number="1063"></td>
5069 <td id="LC1063" class="blob-code blob-code-inner js-file-line"> iqm.addAnims(anims)</td>
5070 </tr>
5071 <tr>
5072 <td id="L1064" class="blob-num js-line-number" data-line-number="1064"></td>
5073 <td id="LC1064" class="blob-code blob-code-inner js-file-line"> iqm.calcFrameSize()</td>
5074 </tr>
5075 <tr>
5076 <td id="L1065" class="blob-num js-line-number" data-line-number="1065"></td>
5077 <td id="LC1065" class="blob-code blob-code-inner js-file-line"> iqm.calcNeighbors()</td>
5078 </tr>
5079 <tr>
5080 <td id="L1066" class="blob-num js-line-number" data-line-number="1066"></td>
5081 <td id="LC1066" class="blob-code blob-code-inner js-file-line">
5082</td>
5083 </tr>
5084 <tr>
5085 <td id="L1067" class="blob-num js-line-number" data-line-number="1067"></td>
5086 <td id="LC1067" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> filename:</td>
5087 </tr>
5088 <tr>
5089 <td id="L1068" class="blob-num js-line-number" data-line-number="1068"></td>
5090 <td id="LC1068" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">try</span>:</td>
5091 </tr>
5092 <tr>
5093 <td id="L1069" class="blob-num js-line-number" data-line-number="1069"></td>
5094 <td id="LC1069" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> filetype <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>IQM<span class="pl-pds">'</span></span>:</td>
5095 </tr>
5096 <tr>
5097 <td id="L1070" class="blob-num js-line-number" data-line-number="1070"></td>
5098 <td id="LC1070" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span> <span class="pl-k">=</span> <span class="pl-c1">open</span>(filename, <span class="pl-s"><span class="pl-pds">'</span>wb<span class="pl-pds">'</span></span>)</td>
5099 </tr>
5100 <tr>
5101 <td id="L1071" class="blob-num js-line-number" data-line-number="1071"></td>
5102 <td id="LC1071" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
5103 </tr>
5104 <tr>
5105 <td id="L1072" class="blob-num js-line-number" data-line-number="1072"></td>
5106 <td id="LC1072" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span> <span class="pl-k">=</span> <span class="pl-c1">open</span>(filename, <span class="pl-s"><span class="pl-pds">'</span>w<span class="pl-pds">'</span></span>)</td>
5107 </tr>
5108 <tr>
5109 <td id="L1073" class="blob-num js-line-number" data-line-number="1073"></td>
5110 <td id="LC1073" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">except</span>:</td>
5111 </tr>
5112 <tr>
5113 <td id="L1074" class="blob-num js-line-number" data-line-number="1074"></td>
5114 <td id="LC1074" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span> (<span class="pl-s"><span class="pl-pds">'</span>Failed writing to <span class="pl-c1">%s</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (filename))</td>
5115 </tr>
5116 <tr>
5117 <td id="L1075" class="blob-num js-line-number" data-line-number="1075"></td>
5118 <td id="LC1075" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span></td>
5119 </tr>
5120 <tr>
5121 <td id="L1076" class="blob-num js-line-number" data-line-number="1076"></td>
5122 <td id="LC1076" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> filetype <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>IQM<span class="pl-pds">'</span></span>:</td>
5123 </tr>
5124 <tr>
5125 <td id="L1077" class="blob-num js-line-number" data-line-number="1077"></td>
5126 <td id="LC1077" class="blob-code blob-code-inner js-file-line"> iqm.export(<span class="pl-v">file</span>, usebbox)</td>
5127 </tr>
5128 <tr>
5129 <td id="L1078" class="blob-num js-line-number" data-line-number="1078"></td>
5130 <td id="LC1078" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">elif</span> filetype <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">'</span>IQE<span class="pl-pds">'</span></span>:</td>
5131 </tr>
5132 <tr>
5133 <td id="L1079" class="blob-num js-line-number" data-line-number="1079"></td>
5134 <td id="LC1079" class="blob-code blob-code-inner js-file-line"> exportIQE(<span class="pl-v">file</span>, meshes, bonelist, anims)</td>
5135 </tr>
5136 <tr>
5137 <td id="L1080" class="blob-num js-line-number" data-line-number="1080"></td>
5138 <td id="LC1080" class="blob-code blob-code-inner js-file-line"> <span class="pl-v">file</span>.close()</td>
5139 </tr>
5140 <tr>
5141 <td id="L1081" class="blob-num js-line-number" data-line-number="1081"></td>
5142 <td id="LC1081" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>Saved <span class="pl-c1">%s</span> file to <span class="pl-c1">%s</span><span class="pl-pds">'</span></span> <span class="pl-k">%</span> (filetype, filename))</td>
5143 </tr>
5144 <tr>
5145 <td id="L1082" class="blob-num js-line-number" data-line-number="1082"></td>
5146 <td id="LC1082" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
5147 </tr>
5148 <tr>
5149 <td id="L1083" class="blob-num js-line-number" data-line-number="1083"></td>
5150 <td id="LC1083" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">print</span>(<span class="pl-s"><span class="pl-pds">'</span>No <span class="pl-c1">%s</span> file was generated<span class="pl-pds">'</span></span> <span class="pl-k">%</span> (filetype))</td>
5151 </tr>
5152 <tr>
5153 <td id="L1084" class="blob-num js-line-number" data-line-number="1084"></td>
5154 <td id="LC1084" class="blob-code blob-code-inner js-file-line">
5155</td>
5156 </tr>
5157 <tr>
5158 <td id="L1085" class="blob-num js-line-number" data-line-number="1085"></td>
5159 <td id="LC1085" class="blob-code blob-code-inner js-file-line">
5160</td>
5161 </tr>
5162 <tr>
5163 <td id="L1086" class="blob-num js-line-number" data-line-number="1086"></td>
5164 <td id="LC1086" class="blob-code blob-code-inner js-file-line"><span class="pl-k">class</span> <span class="pl-en">ExportIQM</span>(<span class="pl-e">bpy</span>.<span class="pl-e">types</span>.<span class="pl-e">Operator</span>, <span class="pl-e">bpy_extras</span>.<span class="pl-e">io_utils</span>.<span class="pl-e">ExportHelper</span>):</td>
5165 </tr>
5166 <tr>
5167 <td id="L1087" class="blob-num js-line-number" data-line-number="1087"></td>
5168 <td id="LC1087" class="blob-code blob-code-inner js-file-line"> <span class="pl-s"><span class="pl-pds">'''</span>Export an Inter-Quake Model IQM or IQE file<span class="pl-pds">'''</span></span></td>
5169 </tr>
5170 <tr>
5171 <td id="L1088" class="blob-num js-line-number" data-line-number="1088"></td>
5172 <td id="LC1088" class="blob-code blob-code-inner js-file-line"> bl_idname <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">"</span>export.iqm<span class="pl-pds">"</span></span></td>
5173 </tr>
5174 <tr>
5175 <td id="L1089" class="blob-num js-line-number" data-line-number="1089"></td>
5176 <td id="LC1089" class="blob-code blob-code-inner js-file-line"> bl_label <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">'</span>Export IQM<span class="pl-pds">'</span></span></td>
5177 </tr>
5178 <tr>
5179 <td id="L1090" class="blob-num js-line-number" data-line-number="1090"></td>
5180 <td id="LC1090" class="blob-code blob-code-inner js-file-line"> filename_ext <span class="pl-k">=</span> <span class="pl-s"><span class="pl-pds">"</span>.iqm<span class="pl-pds">"</span></span></td>
5181 </tr>
5182 <tr>
5183 <td id="L1091" class="blob-num js-line-number" data-line-number="1091"></td>
5184 <td id="LC1091" class="blob-code blob-code-inner js-file-line"> animspec <span class="pl-k">=</span> bpy.props.StringProperty(<span class="pl-v">name</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Animations<span class="pl-pds">"</span></span>, <span class="pl-v">description</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Animations to export<span class="pl-pds">"</span></span>, <span class="pl-v">maxlen</span><span class="pl-k">=</span><span class="pl-c1">1024</span>, <span class="pl-v">default</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>)</td>
5185 </tr>
5186 <tr>
5187 <td id="L1092" class="blob-num js-line-number" data-line-number="1092"></td>
5188 <td id="LC1092" class="blob-code blob-code-inner js-file-line"> usemesh <span class="pl-k">=</span> bpy.props.BoolProperty(<span class="pl-v">name</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Meshes<span class="pl-pds">"</span></span>, <span class="pl-v">description</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Generate meshes<span class="pl-pds">"</span></span>, <span class="pl-v">default</span><span class="pl-k">=</span><span class="pl-c1">True</span>)</td>
5189 </tr>
5190 <tr>
5191 <td id="L1093" class="blob-num js-line-number" data-line-number="1093"></td>
5192 <td id="LC1093" class="blob-code blob-code-inner js-file-line"> usemods <span class="pl-k">=</span> bpy.props.BoolProperty(<span class="pl-v">name</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Modifiers<span class="pl-pds">"</span></span>, <span class="pl-v">description</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Apply modifiers<span class="pl-pds">"</span></span>, <span class="pl-v">default</span><span class="pl-k">=</span><span class="pl-c1">True</span>)</td>
5193 </tr>
5194 <tr>
5195 <td id="L1094" class="blob-num js-line-number" data-line-number="1094"></td>
5196 <td id="LC1094" class="blob-code blob-code-inner js-file-line"> useskel <span class="pl-k">=</span> bpy.props.BoolProperty(<span class="pl-v">name</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Skeleton<span class="pl-pds">"</span></span>, <span class="pl-v">description</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Generate skeleton<span class="pl-pds">"</span></span>, <span class="pl-v">default</span><span class="pl-k">=</span><span class="pl-c1">True</span>)</td>
5197 </tr>
5198 <tr>
5199 <td id="L1095" class="blob-num js-line-number" data-line-number="1095"></td>
5200 <td id="LC1095" class="blob-code blob-code-inner js-file-line"> usebbox <span class="pl-k">=</span> bpy.props.BoolProperty(<span class="pl-v">name</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Bounding boxes<span class="pl-pds">"</span></span>, <span class="pl-v">description</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Generate bounding boxes<span class="pl-pds">"</span></span>, <span class="pl-v">default</span><span class="pl-k">=</span><span class="pl-c1">True</span>)</td>
5201 </tr>
5202 <tr>
5203 <td id="L1096" class="blob-num js-line-number" data-line-number="1096"></td>
5204 <td id="LC1096" class="blob-code blob-code-inner js-file-line"> usecol <span class="pl-k">=</span> bpy.props.BoolProperty(<span class="pl-v">name</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Vertex colors<span class="pl-pds">"</span></span>, <span class="pl-v">description</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Export vertex colors<span class="pl-pds">"</span></span>, <span class="pl-v">default</span><span class="pl-k">=</span><span class="pl-c1">False</span>)</td>
5205 </tr>
5206 <tr>
5207 <td id="L1097" class="blob-num js-line-number" data-line-number="1097"></td>
5208 <td id="LC1097" class="blob-code blob-code-inner js-file-line"> usescale <span class="pl-k">=</span> bpy.props.FloatProperty(<span class="pl-v">name</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Scale<span class="pl-pds">"</span></span>, <span class="pl-v">description</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Scale of exported model<span class="pl-pds">"</span></span>, <span class="pl-v">default</span><span class="pl-k">=</span><span class="pl-c1">1.0</span>, <span class="pl-v">min</span><span class="pl-k">=</span><span class="pl-c1">0.0</span>, <span class="pl-v">step</span><span class="pl-k">=</span><span class="pl-c1">50</span>, <span class="pl-v">precision</span><span class="pl-k">=</span><span class="pl-c1">2</span>)</td>
5209 </tr>
5210 <tr>
5211 <td id="L1098" class="blob-num js-line-number" data-line-number="1098"></td>
5212 <td id="LC1098" class="blob-code blob-code-inner js-file-line"> <span class="pl-c"><span class="pl-c">#</span>usetrans = bpy.props.FloatVectorProperty(name="Translate", description="Translate position of exported model", step=50, precision=2, size=3)</span></td>
5213 </tr>
5214 <tr>
5215 <td id="L1099" class="blob-num js-line-number" data-line-number="1099"></td>
5216 <td id="LC1099" class="blob-code blob-code-inner js-file-line"> matfmt <span class="pl-k">=</span> bpy.props.EnumProperty(<span class="pl-v">name</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Materials<span class="pl-pds">"</span></span>, <span class="pl-v">description</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Material name format<span class="pl-pds">"</span></span>, <span class="pl-v">items</span><span class="pl-k">=</span>[(<span class="pl-s"><span class="pl-pds">"</span>m+i-e<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>material+image-ext<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>), (<span class="pl-s"><span class="pl-pds">"</span>m<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>material<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>), (<span class="pl-s"><span class="pl-pds">"</span>i<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span>image<span class="pl-pds">"</span></span>, <span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>)], <span class="pl-v">default</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>m+i-e<span class="pl-pds">"</span></span>)</td>
5217 </tr>
5218 <tr>
5219 <td id="L1100" class="blob-num js-line-number" data-line-number="1100"></td>
5220 <td id="LC1100" class="blob-code blob-code-inner js-file-line"> derigify <span class="pl-k">=</span> bpy.props.BoolProperty(<span class="pl-v">name</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>De-rigify<span class="pl-pds">"</span></span>, <span class="pl-v">description</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Export only deformation bones from rigify<span class="pl-pds">"</span></span>, <span class="pl-v">default</span><span class="pl-k">=</span><span class="pl-c1">False</span>)</td>
5221 </tr>
5222 <tr>
5223 <td id="L1101" class="blob-num js-line-number" data-line-number="1101"></td>
5224 <td id="LC1101" class="blob-code blob-code-inner js-file-line"> boneorder <span class="pl-k">=</span> bpy.props.StringProperty(<span class="pl-v">name</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Bone order<span class="pl-pds">"</span></span>, <span class="pl-v">description</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Override ordering of bones<span class="pl-pds">"</span></span>, <span class="pl-v">subtype</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>FILE_NAME<span class="pl-pds">"</span></span>, <span class="pl-v">default</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span><span class="pl-pds">"</span></span>)</td>
5225 </tr>
5226 <tr>
5227 <td id="L1102" class="blob-num js-line-number" data-line-number="1102"></td>
5228 <td id="LC1102" class="blob-code blob-code-inner js-file-line">
5229</td>
5230 </tr>
5231 <tr>
5232 <td id="L1103" class="blob-num js-line-number" data-line-number="1103"></td>
5233 <td id="LC1103" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">execute</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">context</span>):</td>
5234 </tr>
5235 <tr>
5236 <td id="L1104" class="blob-num js-line-number" data-line-number="1104"></td>
5237 <td id="LC1104" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> <span class="pl-c1">self</span>.properties.matfmt <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">"</span>m+i-e<span class="pl-pds">"</span></span>:</td>
5238 </tr>
5239 <tr>
5240 <td id="L1105" class="blob-num js-line-number" data-line-number="1105"></td>
5241 <td id="LC1105" class="blob-code blob-code-inner js-file-line"> matfun <span class="pl-k">=</span> <span class="pl-k">lambda</span> <span class="pl-smi">prefix</span>, <span class="pl-smi">image</span>: prefix <span class="pl-k">+</span> os.path.splitext(image)[<span class="pl-c1">0</span>]</td>
5242 </tr>
5243 <tr>
5244 <td id="L1106" class="blob-num js-line-number" data-line-number="1106"></td>
5245 <td id="LC1106" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">elif</span> <span class="pl-c1">self</span>.properties.matfmt <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">"</span>m<span class="pl-pds">"</span></span>:</td>
5246 </tr>
5247 <tr>
5248 <td id="L1107" class="blob-num js-line-number" data-line-number="1107"></td>
5249 <td id="LC1107" class="blob-code blob-code-inner js-file-line"> matfun <span class="pl-k">=</span> <span class="pl-k">lambda</span> <span class="pl-smi">prefix</span>, <span class="pl-smi">image</span>: prefix</td>
5250 </tr>
5251 <tr>
5252 <td id="L1108" class="blob-num js-line-number" data-line-number="1108"></td>
5253 <td id="LC1108" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">else</span>:</td>
5254 </tr>
5255 <tr>
5256 <td id="L1109" class="blob-num js-line-number" data-line-number="1109"></td>
5257 <td id="LC1109" class="blob-code blob-code-inner js-file-line"> matfun <span class="pl-k">=</span> <span class="pl-k">lambda</span> <span class="pl-smi">prefix</span>, <span class="pl-smi">image</span>: image</td>
5258 </tr>
5259 <tr>
5260 <td id="L1110" class="blob-num js-line-number" data-line-number="1110"></td>
5261 <td id="LC1110" class="blob-code blob-code-inner js-file-line"> exportIQM(context, <span class="pl-c1">self</span>.properties.filepath, <span class="pl-c1">self</span>.properties.usemesh, <span class="pl-c1">self</span>.properties.usemods, <span class="pl-c1">self</span>.properties.useskel, <span class="pl-c1">self</span>.properties.usebbox, <span class="pl-c1">self</span>.properties.usecol, <span class="pl-c1">self</span>.properties.usescale, <span class="pl-c1">self</span>.properties.animspec, matfun, <span class="pl-c1">self</span>.properties.derigify, <span class="pl-c1">self</span>.properties.boneorder)</td>
5262 </tr>
5263 <tr>
5264 <td id="L1111" class="blob-num js-line-number" data-line-number="1111"></td>
5265 <td id="LC1111" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> {<span class="pl-s"><span class="pl-pds">'</span>FINISHED<span class="pl-pds">'</span></span>}</td>
5266 </tr>
5267 <tr>
5268 <td id="L1112" class="blob-num js-line-number" data-line-number="1112"></td>
5269 <td id="LC1112" class="blob-code blob-code-inner js-file-line">
5270</td>
5271 </tr>
5272 <tr>
5273 <td id="L1113" class="blob-num js-line-number" data-line-number="1113"></td>
5274 <td id="LC1113" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">def</span> <span class="pl-en">check</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">context</span>):</td>
5275 </tr>
5276 <tr>
5277 <td id="L1114" class="blob-num js-line-number" data-line-number="1114"></td>
5278 <td id="LC1114" class="blob-code blob-code-inner js-file-line"> filepath <span class="pl-k">=</span> bpy.path.ensure_ext(<span class="pl-c1">self</span>.filepath, <span class="pl-s"><span class="pl-pds">'</span>.iqm<span class="pl-pds">'</span></span>)</td>
5279 </tr>
5280 <tr>
5281 <td id="L1115" class="blob-num js-line-number" data-line-number="1115"></td>
5282 <td id="LC1115" class="blob-code blob-code-inner js-file-line"> filepathalt <span class="pl-k">=</span> bpy.path.ensure_ext(<span class="pl-c1">self</span>.filepath, <span class="pl-s"><span class="pl-pds">'</span>.iqe<span class="pl-pds">'</span></span>)</td>
5283 </tr>
5284 <tr>
5285 <td id="L1116" class="blob-num js-line-number" data-line-number="1116"></td>
5286 <td id="LC1116" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">if</span> filepath <span class="pl-k">!=</span> <span class="pl-c1">self</span>.filepath <span class="pl-k">and</span> filepathalt <span class="pl-k">!=</span> <span class="pl-c1">self</span>.filepath:</td>
5287 </tr>
5288 <tr>
5289 <td id="L1117" class="blob-num js-line-number" data-line-number="1117"></td>
5290 <td id="LC1117" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.filepath <span class="pl-k">=</span> filepath</td>
5291 </tr>
5292 <tr>
5293 <td id="L1118" class="blob-num js-line-number" data-line-number="1118"></td>
5294 <td id="LC1118" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-c1">True</span></td>
5295 </tr>
5296 <tr>
5297 <td id="L1119" class="blob-num js-line-number" data-line-number="1119"></td>
5298 <td id="LC1119" class="blob-code blob-code-inner js-file-line"> <span class="pl-k">return</span> <span class="pl-c1">False</span></td>
5299 </tr>
5300 <tr>
5301 <td id="L1120" class="blob-num js-line-number" data-line-number="1120"></td>
5302 <td id="LC1120" class="blob-code blob-code-inner js-file-line">
5303</td>
5304 </tr>
5305 <tr>
5306 <td id="L1121" class="blob-num js-line-number" data-line-number="1121"></td>
5307 <td id="LC1121" class="blob-code blob-code-inner js-file-line">
5308</td>
5309 </tr>
5310 <tr>
5311 <td id="L1122" class="blob-num js-line-number" data-line-number="1122"></td>
5312 <td id="LC1122" class="blob-code blob-code-inner js-file-line">
5313</td>
5314 </tr>
5315 <tr>
5316 <td id="L1123" class="blob-num js-line-number" data-line-number="1123"></td>
5317 <td id="LC1123" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">menu_func</span>(<span class="pl-smi"><span class="pl-smi">self</span></span>, <span class="pl-smi">context</span>):</td>
5318 </tr>
5319 <tr>
5320 <td id="L1124" class="blob-num js-line-number" data-line-number="1124"></td>
5321 <td id="LC1124" class="blob-code blob-code-inner js-file-line"> <span class="pl-c1">self</span>.layout.operator(ExportIQM.bl_idname, <span class="pl-v">text</span><span class="pl-k">=</span><span class="pl-s"><span class="pl-pds">"</span>Inter-Quake Model (.iqm, .iqe)<span class="pl-pds">"</span></span>)</td>
5322 </tr>
5323 <tr>
5324 <td id="L1125" class="blob-num js-line-number" data-line-number="1125"></td>
5325 <td id="LC1125" class="blob-code blob-code-inner js-file-line">
5326</td>
5327 </tr>
5328 <tr>
5329 <td id="L1126" class="blob-num js-line-number" data-line-number="1126"></td>
5330 <td id="LC1126" class="blob-code blob-code-inner js-file-line">
5331</td>
5332 </tr>
5333 <tr>
5334 <td id="L1127" class="blob-num js-line-number" data-line-number="1127"></td>
5335 <td id="LC1127" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">register</span>():</td>
5336 </tr>
5337 <tr>
5338 <td id="L1128" class="blob-num js-line-number" data-line-number="1128"></td>
5339 <td id="LC1128" class="blob-code blob-code-inner js-file-line"> bpy.utils.register_class(ExportIQM)</td>
5340 </tr>
5341 <tr>
5342 <td id="L1129" class="blob-num js-line-number" data-line-number="1129"></td>
5343 <td id="LC1129" class="blob-code blob-code-inner js-file-line"> bpy.types.<span class="pl-c1">TOPBAR_MT_file_export</span>.append(menu_func)</td>
5344 </tr>
5345 <tr>
5346 <td id="L1130" class="blob-num js-line-number" data-line-number="1130"></td>
5347 <td id="LC1130" class="blob-code blob-code-inner js-file-line">
5348</td>
5349 </tr>
5350 <tr>
5351 <td id="L1131" class="blob-num js-line-number" data-line-number="1131"></td>
5352 <td id="LC1131" class="blob-code blob-code-inner js-file-line"><span class="pl-k">def</span> <span class="pl-en">unregister</span>():</td>
5353 </tr>
5354 <tr>
5355 <td id="L1132" class="blob-num js-line-number" data-line-number="1132"></td>
5356 <td id="LC1132" class="blob-code blob-code-inner js-file-line"> bpy.utils.unregister_class(ExportIQM)</td>
5357 </tr>
5358 <tr>
5359 <td id="L1133" class="blob-num js-line-number" data-line-number="1133"></td>
5360 <td id="LC1133" class="blob-code blob-code-inner js-file-line"> bpy.types.<span class="pl-c1">TOPBAR_MT_file_export</span>.remove(menu_func)</td>
5361 </tr>
5362 <tr>
5363 <td id="L1134" class="blob-num js-line-number" data-line-number="1134"></td>
5364 <td id="LC1134" class="blob-code blob-code-inner js-file-line">
5365</td>
5366 </tr>
5367 <tr>
5368 <td id="L1135" class="blob-num js-line-number" data-line-number="1135"></td>
5369 <td id="LC1135" class="blob-code blob-code-inner js-file-line">
5370</td>
5371 </tr>
5372 <tr>
5373 <td id="L1136" class="blob-num js-line-number" data-line-number="1136"></td>
5374 <td id="LC1136" class="blob-code blob-code-inner js-file-line"><span class="pl-k">if</span> <span class="pl-c1">__name__</span> <span class="pl-k">==</span> <span class="pl-s"><span class="pl-pds">"</span>__main__<span class="pl-pds">"</span></span>:</td>
5375 </tr>
5376 <tr>
5377 <td id="L1137" class="blob-num js-line-number" data-line-number="1137"></td>
5378 <td id="LC1137" class="blob-code blob-code-inner js-file-line"> register()</td>
5379 </tr>
5380 <tr>
5381 <td id="L1138" class="blob-num js-line-number" data-line-number="1138"></td>
5382 <td id="LC1138" class="blob-code blob-code-inner js-file-line">
5383</td>
5384 </tr>
5385</table>
5386
5387 <details class="details-reset details-overlay BlobToolbar position-absolute js-file-line-actions dropdown d-none" aria-hidden="true">
5388 <summary class="btn-octicon ml-0 px-2 p-0 bg-white border border-gray-dark rounded-1" aria-label="Inline file action toolbar">
5389 <svg class="octicon octicon-kebab-horizontal" viewBox="0 0 13 16" version="1.1" width="13" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M1.5 9a1.5 1.5 0 100-3 1.5 1.5 0 000 3zm5 0a1.5 1.5 0 100-3 1.5 1.5 0 000 3zM13 7.5a1.5 1.5 0 11-3 0 1.5 1.5 0 013 0z"/></svg>
5390 </summary>
5391 <details-menu>
5392 <ul class="BlobToolbar-dropdown dropdown-menu dropdown-menu-se mt-2" style="width:185px">
5393 <li>
5394 <clipboard-copy role="menuitem" class="dropdown-item" id="js-copy-lines" style="cursor:pointer;">
5395 Copy lines
5396 </clipboard-copy>
5397 </li>
5398 <li>
5399 <clipboard-copy role="menuitem" class="dropdown-item" id="js-copy-permalink" style="cursor:pointer;">
5400 Copy permalink
5401 </clipboard-copy>
5402 </li>
5403 <li><a class="dropdown-item js-update-url-with-hash" id="js-view-git-blame" role="menuitem" href="/lsalzman/iqm/blame/33d7a85ae241924a9317124b5fcada48d8e928d2/blender-2.80/iqm_export.py">View git blame</a></li>
5404 <li><a class="dropdown-item" id="js-new-issue" role="menuitem" href="/lsalzman/iqm/issues/new">Reference in new issue</a></li>
5405 </ul>
5406 </details-menu>
5407 </details>
5408
5409 </div>
5410
5411 </div>
5412
5413
5414
5415 <details class="details-reset details-overlay details-overlay-dark">
5416 <summary data-hotkey="l" aria-label="Jump to line"></summary>
5417 <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast linejump" aria-label="Jump to line">
5418 <!-- '"` --><!-- </textarea></xmp> --></option></form><form class="js-jump-to-line-form Box-body d-flex" action="" accept-charset="UTF-8" method="get"><input name="utf8" type="hidden" value="✓" />
5419 <input class="form-control flex-auto mr-3 linejump-input js-jump-to-line-field" type="text" placeholder="Jump to line…" aria-label="Jump to line" autofocus>
5420 <button type="submit" class="btn" data-close-dialog>Go</button>
5421</form> </details-dialog>
5422 </details>
5423
5424
5425
5426 </div>
5427</div>
5428
5429 </main>
5430 </div>
5431
5432
5433 </div>
5434
5435
5436<div class="footer container-lg width-full p-responsive" role="contentinfo">
5437 <div class="position-relative d-flex flex-row-reverse flex-lg-row flex-wrap flex-lg-nowrap flex-justify-center flex-lg-justify-between pt-6 pb-2 mt-6 f6 text-gray border-top border-gray-light ">
5438 <ul class="list-style-none d-flex flex-wrap col-12 col-lg-5 flex-justify-center flex-lg-justify-between mb-2 mb-lg-0">
5439 <li class="mr-3 mr-lg-0">© 2019 GitHub, Inc.</li>
5440 <li class="mr-3 mr-lg-0"><a data-ga-click="Footer, go to terms, text:terms" href="https://github.com/site/terms">Terms</a></li>
5441 <li class="mr-3 mr-lg-0"><a data-ga-click="Footer, go to privacy, text:privacy" href="https://github.com/site/privacy">Privacy</a></li>
5442 <li class="mr-3 mr-lg-0"><a data-ga-click="Footer, go to security, text:security" href="https://github.com/security">Security</a></li>
5443 <li class="mr-3 mr-lg-0"><a href="https://githubstatus.com/" data-ga-click="Footer, go to status, text:status">Status</a></li>
5444 <li><a data-ga-click="Footer, go to help, text:help" href="https://help.github.com">Help</a></li>
5445 </ul>
5446
5447 <a aria-label="Homepage" title="GitHub" class="footer-octicon d-none d-lg-block mx-lg-4" href="https://github.com">
5448 <svg height="24" class="octicon octicon-mark-github" viewBox="0 0 16 16" version="1.1" width="24" aria-hidden="true"><path fill-rule="evenodd" d="M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82.64-.18 1.32-.27 2-.27.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z"/></svg>
5449</a>
5450 <ul class="list-style-none d-flex flex-wrap col-12 col-lg-5 flex-justify-center flex-lg-justify-between mb-2 mb-lg-0">
5451 <li class="mr-3 mr-lg-0"><a data-ga-click="Footer, go to contact, text:contact" href="https://github.com/contact">Contact GitHub</a></li>
5452 <li class="mr-3 mr-lg-0"><a href="https://github.com/pricing" data-ga-click="Footer, go to Pricing, text:Pricing">Pricing</a></li>
5453 <li class="mr-3 mr-lg-0"><a href="https://developer.github.com" data-ga-click="Footer, go to api, text:api">API</a></li>
5454 <li class="mr-3 mr-lg-0"><a href="https://training.github.com" data-ga-click="Footer, go to training, text:training">Training</a></li>
5455 <li class="mr-3 mr-lg-0"><a href="https://github.blog" data-ga-click="Footer, go to blog, text:blog">Blog</a></li>
5456 <li><a data-ga-click="Footer, go to about, text:about" href="https://github.com/about">About</a></li>
5457
5458 </ul>
5459 </div>
5460 <div class="d-flex flex-justify-center pb-6">
5461 <span class="f6 text-gray-light"></span>
5462 </div>
5463</div>
5464
5465
5466
5467 <div id="ajax-error-message" class="ajax-error-message flash flash-error">
5468 <svg class="octicon octicon-alert" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 000 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 00.01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"/></svg>
5469 <button type="button" class="flash-close js-ajax-error-dismiss" aria-label="Dismiss error">
5470 <svg class="octicon octicon-x" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
5471 </button>
5472 You can’t perform that action at this time.
5473 </div>
5474
5475
5476 <script crossorigin="anonymous" integrity="sha512-+HrX8ahxgj74CUPPmM6Z3OU9WEiCyL7ZNdFDi1qwf32rgamIx9tGkQuWb4dFkMHthTaCuRbi3x2Zu8qtC88+6A==" type="application/javascript" src="https://github.githubassets.com/assets/compat-bootstrap-f87ad7f1.js"></script>
5477 <script crossorigin="anonymous" integrity="sha512-5KoX4P/b8KhUNxooQhWIxRhCSnSw7EES28pOUYsNnqBMWDDUp6W7cPBV1MTAudwSwofIkpGapbXCgVTgn563Lg==" type="application/javascript" src="https://github.githubassets.com/assets/frameworks-e4aa17e0.js"></script>
5478
5479 <script crossorigin="anonymous" async="async" integrity="sha512-0Igj5XKVaZAYxfH8dn/Vb0uoHCOGYqxJh2pXL3DHrgVOMa1ETDHd6ZMm4C+U4fKv8TiaHP7htak2hJOHwYGDoA==" type="application/javascript" src="https://github.githubassets.com/assets/github-bootstrap-d08823e5.js"></script>
5480
5481
5482
5483 <div class="js-stale-session-flash flash flash-warn flash-banner" hidden
5484 >
5485 <svg class="octicon octicon-alert" viewBox="0 0 16 16" version="1.1" width="16" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 000 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 00.01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"/></svg>
5486 <span class="js-stale-session-flash-signed-in" hidden>You signed in with another tab or window. <a href="">Reload</a> to refresh your session.</span>
5487 <span class="js-stale-session-flash-signed-out" hidden>You signed out in another tab or window. <a href="">Reload</a> to refresh your session.</span>
5488 </div>
5489 <template id="site-details-dialog">
5490 <details class="details-reset details-overlay details-overlay-dark lh-default text-gray-dark hx_rsm" open>
5491 <summary role="button" aria-label="Close dialog"></summary>
5492 <details-dialog class="Box Box--overlay d-flex flex-column anim-fade-in fast hx_rsm-dialog hx_rsm-modal">
5493 <button class="Box-btn-octicon m-0 btn-octicon position-absolute right-0 top-0" type="button" aria-label="Close dialog" data-close-dialog>
5494 <svg class="octicon octicon-x" viewBox="0 0 12 16" version="1.1" width="12" height="16" aria-hidden="true"><path fill-rule="evenodd" d="M7.48 8l3.75 3.75-1.48 1.48L6 9.48l-3.75 3.75-1.48-1.48L4.52 8 .77 4.25l1.48-1.48L6 6.52l3.75-3.75 1.48 1.48L7.48 8z"/></svg>
5495 </button>
5496 <div class="octocat-spinner my-6 js-details-dialog-spinner"></div>
5497 </details-dialog>
5498 </details>
5499</template>
5500
5501 <div class="Popover js-hovercard-content position-absolute" style="display: none; outline: none;" tabindex="0">
5502 <div class="Popover-message Popover-message--bottom-left Popover-message--large Box box-shadow-large" style="width:360px;">
5503 </div>
5504</div>
5505
5506 <div aria-live="polite" class="js-global-screen-reader-notice sr-only"></div>
5507
5508 </body>
5509</html>