| 267 PrimitiveCategory cat; |
269 PrimitiveCategory cat; |
| 268 cat.setName ("Other"); |
270 cat.setName ("Other"); |
| 269 g_PrimitiveCategories << cat; |
271 g_PrimitiveCategories << cat; |
| 270 } |
272 } |
| 271 |
273 |
| 272 bool primitiveLoaderBusy() { |
274 // ============================================================================= |
| |
275 bool primitiveLoaderBusy() |
| |
276 { |
| 273 return g_primListerMutex; |
277 return g_primListerMutex; |
| 274 } |
278 } |
| |
279 |
| |
280 vector<LDObject*> makePrimitive( PrimitiveType type, int segs, int divs, int num ) |
| |
281 { |
| |
282 vector<LDObject*> objs; |
| |
283 |
| |
284 for( int i = 0; i < segs; ++i ) |
| |
285 { |
| |
286 double x0 = cos(( i * 2 * pi ) / divs ), |
| |
287 x1 = cos((( i + 1 ) * 2 * pi) / divs ), |
| |
288 z0 = sin(( i * 2 * pi ) / divs ), |
| |
289 z1 = sin((( i + 1 ) * 2 * pi ) / divs ); |
| |
290 |
| |
291 LDObject* obj = null; |
| |
292 |
| |
293 switch( type ) |
| |
294 { |
| |
295 case Circle: |
| |
296 { |
| |
297 vertex v0( x0, 0.0f, z0 ), |
| |
298 v1( x1, 0.0f, z1 ); |
| |
299 |
| |
300 LDLine* line = new LDLine; |
| |
301 line->setVertex( 0, v0 ); |
| |
302 line->setVertex( 1, v1 ); |
| |
303 line->setColor( edgecolor ); |
| |
304 obj = line; |
| |
305 } |
| |
306 break; |
| |
307 |
| |
308 case Cylinder: |
| |
309 case Ring: |
| |
310 case Cone: |
| |
311 { |
| |
312 double x2, x3, z2, z3; |
| |
313 double y0, y1, y2, y3; |
| |
314 |
| |
315 if( type == Cylinder ) |
| |
316 { |
| |
317 x2 = x1; |
| |
318 x3 = x0; |
| |
319 z2 = z1; |
| |
320 z3 = z0; |
| |
321 |
| |
322 y0 = y1 = 0.0f; |
| |
323 y2 = y3 = 1.0f; |
| |
324 } else { |
| |
325 x2 = x1 * (num + 1); |
| |
326 x3 = x0 * (num + 1); |
| |
327 z2 = z1 * (num + 1); |
| |
328 z3 = z0 * (num + 1); |
| |
329 |
| |
330 x0 *= num; |
| |
331 x1 *= num; |
| |
332 z0 *= num; |
| |
333 z1 *= num; |
| |
334 |
| |
335 if( type == Ring ) |
| |
336 y0 = y1 = y2 = y3 = 0.0f; |
| |
337 else |
| |
338 { |
| |
339 y0 = y1 = 1.0f; |
| |
340 y2 = y3 = 0.0f; |
| |
341 } |
| |
342 } |
| |
343 |
| |
344 vertex v0( x0, y0, z0 ), |
| |
345 v1( x1, y1, z1 ), |
| |
346 v2( x2, y2, z2 ), |
| |
347 v3( x3, y3, z3 ); |
| |
348 |
| |
349 LDQuad* quad = new LDQuad; |
| |
350 quad->setColor( maincolor ); |
| |
351 quad->setVertex( 0, v0 ); |
| |
352 quad->setVertex( 1, v1 ); |
| |
353 quad->setVertex( 2, v2 ); |
| |
354 quad->setVertex( 3, v3 ); |
| |
355 obj = quad; |
| |
356 } |
| |
357 break; |
| |
358 |
| |
359 case Disc: |
| |
360 case DiscNeg: |
| |
361 { |
| |
362 double x2, z2; |
| |
363 |
| |
364 if( type == Disc ) |
| |
365 x2 = z2 = 0.0f; |
| |
366 else |
| |
367 { |
| |
368 x2 = ( x0 >= 0.0f ) ? 1.0f : -1.0f; |
| |
369 z2 = ( z0 >= 0.0f ) ? 1.0f : -1.0f; |
| |
370 } |
| |
371 |
| |
372 vertex v0( x0, 0.0f, z0 ), |
| |
373 v1( x1, 0.0f, z1 ), |
| |
374 v2( x2, 0.0f, z2 ); |
| |
375 |
| |
376 LDTriangle* seg = new LDTriangle; |
| |
377 seg->setColor( maincolor ); |
| |
378 seg->setVertex( 0, v0 ); |
| |
379 seg->setVertex( 1, v1 ); |
| |
380 seg->setVertex( 2, v2 ); |
| |
381 obj = seg; |
| |
382 } |
| |
383 break; |
| |
384 |
| |
385 default: |
| |
386 break; |
| |
387 } |
| |
388 |
| |
389 if( obj ) |
| |
390 objs << obj; |
| |
391 } |
| |
392 |
| |
393 return objs; |
| |
394 } |
| |
395 |
| |
396 str primitiveTypeName( PrimitiveType type ) |
| |
397 { |
| |
398 return type == Circle ? "Circle" : |
| |
399 type == Cylinder ? "Cylinder" : |
| |
400 type == Disc ? "Disc" : |
| |
401 type == DiscNeg ? "Disc Negative" : |
| |
402 type == Ring ? "Ring" : |
| |
403 "Cone"; |
| |
404 } |
| |
405 |
| |
406 // ============================================================================= |
| |
407 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * |
| |
408 // ============================================================================= |
| |
409 void generatePrimitive() |
| |
410 { |
| |
411 QDialog* dlg = new QDialog( g_win ); |
| |
412 Ui::MakePrimUI ui; |
| |
413 ui.setupUi( dlg ); |
| |
414 |
| |
415 exec: |
| |
416 if( !dlg->exec() ) |
| |
417 return; |
| |
418 |
| |
419 int segs = ui.sb_segs->value(); |
| |
420 int divs = ui.cb_hires->isChecked() ? hires : lores; |
| |
421 int num = ui.sb_ringnum->value(); |
| |
422 PrimitiveType type = |
| |
423 ui.rb_circle->isChecked() ? Circle : |
| |
424 ui.rb_cylinder->isChecked() ? Cylinder : |
| |
425 ui.rb_disc->isChecked() ? Disc : |
| |
426 ui.rb_ndisc->isChecked() ? DiscNeg : |
| |
427 ui.rb_ring->isChecked() ? Ring : |
| |
428 Cone; |
| |
429 |
| |
430 // Make the description |
| |
431 str descr = fmt ("%1 / %2 %3", segs, divs, primitiveTypeName( type )); |
| |
432 |
| |
433 if (type == Ring || type == Cone) |
| |
434 descr += fmt (" %1", num); |
| |
435 |
| |
436 LDOpenFile* f = new LDOpenFile; |
| |
437 |
| |
438 *f << new LDComment( descr ); |
| |
439 *f << new LDComment( fmt( "Name: ???.dat" )); |
| |
440 *f << new LDComment( fmt( "Author: LDForge" )); |
| |
441 *f << new LDComment( fmt( "!LDRAW_ORG Unofficial_%1Primitive", divs == hires ? "48_" : "" )); |
| |
442 *f << new LDComment( "Redistributable under CCAL version 2.0 : see CAreadme.txt" ); |
| |
443 *f << new LDEmpty; |
| |
444 *f << new LDBFC( LDBFC::CertifyCCW ); |
| |
445 *f << new LDEmpty; |
| |
446 *f << makePrimitive( type, segs, divs, num ); |
| |
447 |
| |
448 g_win->save( f, true ); |
| |
449 delete f; |
| |
450 } |