home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / MEDIT.LZH / PERS.CPP < prev    next >
C/C++ Source or Header  |  1996-06-06  |  14KB  |  515 lines

  1. /*  Project medit
  2.     Project Team DoGA
  3.     Copyright (c) 1995. All Rights Reserved.
  4.  
  5.     サブシステム:    medit.apx Application
  6.     ファイル:        pers.cpp
  7.     作成者:          Taka2
  8.  
  9.  
  10.     概要
  11.     ====
  12.     TWinPers (TWindow) のインプリメンテーション用のソースファイル
  13. */
  14.  
  15. #include <owl\owlpch.h>
  16. #pragma hdrstop
  17. #include <stdio.h>
  18. #include "syscolor.h"
  19. #include "pers.h"
  20. #include "anim.h"
  21. #include "mecha.h"
  22. #include "display.h"
  23.  
  24. //
  25. // このアプリケーションで処理するすべてのメッセージ/コマンドの
  26. // 応答テーブルを作成する
  27. //
  28. DEFINE_RESPONSE_TABLE1(TWinPers, TWindow)
  29. //{{TWinPersRSP_TBL_BEGIN}}
  30.     EV_WM_LBUTTONDOWN,
  31. //{{TWinPersRSP_TBL_END}}
  32. END_RESPONSE_TABLE;
  33.  
  34.  
  35. //{{TWinPers Implementation}}
  36.  
  37. TWinPers::TWinPers (TWindow* parent, AnimationData *dat, int x, int y, int w, int h):
  38.     TWindow(parent, 0, 0)
  39. {
  40.     // INSERT>> コンストラクタ用のコードはここに
  41.  
  42.     SetBkgndColor(TColor::LtGray);
  43.  
  44.     Attr.X = x;
  45.     Attr.Y = y;
  46.     Attr.W = w;
  47.     Attr.H = h;
  48.     anim = dat;
  49.  
  50. }
  51.  
  52. TWinPers::~TWinPers ()
  53. {
  54.     Destroy();
  55.  
  56.     // INSERT>> デストラクタ用のコードはここに
  57.  
  58. }
  59.  
  60. void TWinPers::Paint (TDC& dc, BOOL erase, TRect& rect)
  61. {
  62.     TWindow::Paint(dc, erase, rect);
  63.  
  64.     // INSERT>> 追加のコードはここに
  65.  
  66. //    anim->Redraw(SelPers, FALSE);
  67.     Redraw();
  68. }
  69.  
  70. void TWinPers::RedrawMain(TDC& dc)
  71. {
  72.     dc.SelectObject(TPen(cBackGround));
  73.     dc.SelectObject(TBrush(cBackGround));
  74.     dc.Rectangle(dc.GetClipBox());
  75.  
  76.     if (anim->opstat != OpPlay) {
  77.         ShowMesh(dc);
  78.     }
  79.     if (anim->hiddenremove && anim->drawmode == DrawWire && anim->opstat != OpPlay) {
  80.         if (anim->wireframe.line == NULL) {
  81.             anim->BuildWireFrame(anim->selectframe);
  82.         }
  83.         LineSegment *l = anim->wireframe.line;
  84.         if (anim->select != NULL && anim->select != anim->camera) {
  85.             dc.SelectObject(TPen(cWireNoSelect));
  86.             int sel = FALSE;
  87.             for (int i = anim->wireframe.lines; i > 0; --i) {
  88.                 if (!sel && l->id == anim->select) {
  89.                     dc.SelectObject(TPen(cWireSelect));
  90.                     sel = TRUE;
  91.                 } else if (sel && l->id != anim->select) {
  92.                     dc.SelectObject(TPen(cWireNoSelect));
  93.                     sel = FALSE;
  94.                 }
  95.                 dc.MoveTo(l->x1, l->y1);
  96.                 dc.LineTo(l->x2, l->y2);
  97.                 l++;
  98.             }
  99.         } else {
  100.             dc.SelectObject(TPen(cWireNormal));
  101.             for (int i = anim->wireframe.lines; i > 0; --i) {
  102.                 dc.MoveTo(l->x1, l->y1);
  103.                 dc.LineTo(l->x2, l->y2);
  104.                 l++;
  105.             }
  106.         }
  107. #if 0
  108.         if (anim->select != NULL && anim->select != anim->camera) {
  109.             dc.SelectObject(TPen(cWireNoSelect));
  110.         } else {
  111.             dc.SelectObject(TPen(cWireNormal));
  112.         }
  113.         for (int i = anim->wireframe.lines; i > 0; --i) {
  114.             dc.MoveTo(l->x1, l->y1);
  115.             dc.LineTo(l->x2, l->y2);
  116.             l++;
  117.         }
  118.         if (anim->select != NULL && anim->select != anim->camera && anim->select != anim->camera->target) {
  119.             ShowMotion(dc, anim->select);
  120.         }
  121. #endif
  122.     } else {
  123.         for (Motion *mot = anim->motion; mot != NULL; mot = mot->next) {
  124.             if (mot != anim->select) {
  125.                 ShowMotion(dc, mot);
  126.             }
  127.         }
  128.         if (anim->select != NULL && anim->select != anim->camera && anim->select != anim->camera->target) {
  129.             ShowMotion(dc, anim->select);
  130.         }
  131.     }
  132. }
  133.  
  134. void TWinPers::Redraw(void)
  135. {
  136. #if 0
  137.     TClientDC dc(*this);
  138.     if (anim->opstat != OpPlay) {
  139.         RedrawMain(dc);
  140.     } else {
  141.         TMemoryDC mdc(dc);
  142.         TBitmap bitmap(dc, Attr.W, Attr.H);
  143.         mdc.SelectObject(bitmap);
  144.         RedrawMain(mdc);
  145.         dc.BitBlt(0,0,Attr.W, Attr.H, mdc, 0, 0, SRCCOPY);
  146.     }
  147. #else
  148.     TClientDC dc(*this);
  149.     TMemoryDC mdc(dc);
  150.     TBitmap bitmap(dc, Attr.W, Attr.H);
  151.     mdc.SelectObject(bitmap);
  152.     RedrawMain(mdc);
  153.     dc.BitBlt(0,0,Attr.W, Attr.H, mdc, 0, 0, SRCCOPY);
  154. #endif
  155. }
  156.  
  157.  
  158. void TWinPers::ShowMotion(TDC& dc, Motion *mot)
  159. {
  160.     if (anim->selectframe < mot->beginframe || mot->endframe < anim->selectframe) {
  161.         return;
  162.     }
  163.     if (mot == anim->select) {
  164.         dc.SelectObject(TPen(cWireSelect));
  165.     } else if (mot == anim->camera) {
  166.         dc.SelectObject(TPen(cWireCamera));
  167.     } else if ((anim->select != NULL && anim->select != anim->camera)
  168.      || anim->opstat == OpLight) {
  169.         dc.SelectObject(TPen(cWireNoSelect));
  170.     } else {
  171.         dc.SelectObject(TPen(cWireNormal));
  172.     }
  173.  
  174.     if (mot->boxflag == FALSE) {
  175.         int begin, end = -1;
  176.         for (int i = 0; i < mot->lines; ++i) {
  177.             if (mot->view_z[mot->line_1[i]] <= 0 || mot->view_z[mot->line_2[i]] <= 0) {
  178.                 end = -1;
  179.             } else {
  180.                 if ((begin = mot->line_1[i]) != end) {
  181.                     dc.MoveTo(mot->view_x[begin], mot->view_y[begin]);
  182.                 }
  183.                 end = mot->line_2[i];
  184.                 dc.LineTo(mot->view_x[end], mot->view_y[end]);
  185.             }
  186.         }
  187.     } else if (mot->motiondata == NULL) {
  188.         if (mot->view_z[0] > 0) {
  189.             dc.MoveTo(mot->view_x[0], mot->view_y[0]);
  190.             dc.LineTo(mot->view_x[1], mot->view_y[1]);
  191.             dc.LineTo(mot->view_x[2], mot->view_y[2]);
  192.             dc.LineTo(mot->view_x[3], mot->view_y[3]);
  193.             dc.LineTo(mot->view_x[0], mot->view_y[0]);
  194.             dc.LineTo(mot->view_x[4], mot->view_y[4]);
  195.             dc.LineTo(mot->view_x[5], mot->view_y[5]);
  196.             dc.LineTo(mot->view_x[6], mot->view_y[6]);
  197.             dc.LineTo(mot->view_x[7], mot->view_y[7]);
  198.             dc.LineTo(mot->view_x[4], mot->view_y[4]);
  199.             dc.MoveTo(mot->view_x[1], mot->view_y[1]);
  200.             dc.LineTo(mot->view_x[5], mot->view_y[5]);
  201.             dc.MoveTo(mot->view_x[2], mot->view_y[2]);
  202.             dc.LineTo(mot->view_x[6], mot->view_y[6]);
  203.             dc.MoveTo(mot->view_x[3], mot->view_y[3]);
  204.             dc.LineTo(mot->view_x[7], mot->view_y[7]);
  205.         }
  206.     } else {
  207.         if (mot->view_z[0] > 0) {
  208.             dc.MoveTo(mot->view_x[0], mot->view_y[0]);
  209.             dc.LineTo(mot->view_x[1], mot->view_y[1]);
  210.             dc.LineTo(mot->view_x[2], mot->view_y[2]);
  211.             dc.LineTo(mot->view_x[0], mot->view_y[0]);
  212.             dc.LineTo(mot->view_x[3], mot->view_y[3]);
  213.             dc.LineTo(mot->view_x[4], mot->view_y[4]);
  214.         }
  215.     }
  216. #if 0
  217.     if (anim->drawmode == DrawWire) {
  218.         int begin, end = -1;
  219.         for (int i = 0; i < mot->lines; ++i) {
  220.             if (mot->view_z[mot->line_1[i]] <= 0 || mot->view_z[mot->line_2[i]] <= 0) {
  221.                 end = -1;
  222.             } else {
  223.                 if ((begin = mot->line_1[i]) != end) {
  224.                     dc.MoveTo(mot->view_x[begin], mot->view_y[begin]);
  225.                 }
  226.                 end = mot->line_2[i];
  227.                 dc.LineTo(mot->view_x[end], mot->view_y[end]);
  228.             }
  229.         }
  230.     } else if (anim->drawmode == DrawPlane || anim->drawmode == DrawPlaneObject) {
  231.         double maxx = 0, maxy = 0, maxz = 0;
  232.         Mechanic *mecha = mot->mecha;
  233.         if (mecha != NULL) {
  234.             if (mecha->maxx > -mecha->minx) {
  235.                 maxx = mecha->maxx;
  236.             } else {
  237.                 maxx = -mecha->minx;
  238.             }
  239.             if (mecha->maxy > -mecha->miny) {
  240.                 maxy = mecha->maxy;
  241.             } else {
  242.                 maxy = -mecha->miny;
  243.             }
  244.             if (mecha->maxz > -mecha->minz) {
  245.                 maxz = mecha->maxz;
  246.             } else {
  247.                 maxz = -mecha->minz;
  248.             }
  249.         }
  250.  
  251.         Matrix cm = anim->viewmat * mot->GetMatrix(anim->selectframe);
  252.         Vector p[8];
  253.         if (mot->motiondata == NULL) {
  254.             p[0] = cm * Vector( maxx, maxy, maxz);
  255.             p[1] = cm * Vector( maxx, maxy,-maxz);
  256.             p[2] = cm * Vector( maxx,-maxy,-maxz);
  257.             p[3] = cm * Vector( maxx,-maxy, maxz);
  258.             p[4] = cm * Vector(-maxx, maxy, maxz);
  259.             p[5] = cm * Vector(-maxx, maxy,-maxz);
  260.             p[6] = cm * Vector(-maxx,-maxy,-maxz);
  261.             p[7] = cm * Vector(-maxx,-maxy, maxz);
  262.             int vx[8], vy[8], drawflag = TRUE;
  263.             for (int i = 0; i < 8; ++i) {
  264.                 if (p[i].z <= 1.0) {
  265.                     drawflag = FALSE;
  266.                     break;
  267.                 }
  268.                 vx[i] = int(p[i].x / p[i].z);
  269.                 vy[i] = int(p[i].y / p[i].z);
  270.             }
  271.             if (drawflag != FALSE) {
  272.                 dc.MoveTo(vx[0], vy[0]);
  273.                 dc.LineTo(vx[1], vy[1]);
  274.                 dc.LineTo(vx[2], vy[2]);
  275.                 dc.LineTo(vx[3], vy[3]);
  276.                 dc.LineTo(vx[0], vy[0]);
  277.                 dc.LineTo(vx[4], vy[4]);
  278.                 dc.LineTo(vx[5], vy[5]);
  279.                 dc.LineTo(vx[6], vy[6]);
  280.                 dc.LineTo(vx[7], vy[7]);
  281.                 dc.LineTo(vx[4], vy[4]);
  282.                 dc.MoveTo(vx[1], vy[1]);
  283.                 dc.LineTo(vx[5], vy[5]);
  284.                 dc.MoveTo(vx[2], vy[2]);
  285.                 dc.LineTo(vx[6], vy[6]);
  286.                 dc.MoveTo(vx[3], vy[3]);
  287.                 dc.LineTo(vx[7], vy[7]);
  288.             }
  289.         } else {
  290.             p[0] = cm * Vector( maxx,  0.0,  0.0);
  291.             p[1] = cm * Vector(-maxx, maxy,  0.0);
  292.             p[2] = cm * Vector(-maxx,-maxy,  0.0);
  293.             p[3] = cm * Vector(-maxx,  0.0, maxz);
  294.             p[4] = cm * Vector(-maxx,  0.0,  0.0);
  295.             int vx[5], vy[5], drawflag = TRUE;
  296.             for (int i = 0; i < 5; ++i) {
  297.                 if (p[i].z <= 1.0) {
  298.                     drawflag = FALSE;
  299.                     break;
  300.                 }
  301.                 vx[i] = int(p[i].x / p[i].z);
  302.                 vy[i] = int(p[i].y / p[i].z);
  303.             }
  304.             if (drawflag != FALSE) {
  305.                 dc.MoveTo(vx[0], vy[0]);
  306.                 dc.LineTo(vx[1], vy[1]);
  307.                 dc.LineTo(vx[2], vy[2]);
  308.                 dc.LineTo(vx[0], vy[0]);
  309.                 dc.LineTo(vx[3], vy[3]);
  310.                 dc.LineTo(vx[4], vy[4]);
  311.             }
  312.         }
  313.     }
  314. #endif
  315. }
  316.  
  317. static void DrawLine(TDC& dc, Vector& v0, Vector& v1)
  318. {
  319.     if (v0.z <= 1.5 && v1.z <= 1.5) {
  320.         return;
  321.     }
  322.     if (v0.z <= 1.0) {
  323.         double rate = (1.0 - v1.z) / (v0.z - v1.z);
  324.         v0 = Vector(v1.x + (v0.x - v1.x) * rate,
  325.                     v1.y + (v0.y - v1.y) * rate,
  326.                     1.0);
  327.     } else if (v1.z <= 1.0) {
  328.         double rate = (1.0 - v0.z) / (v1.z - v0.z);
  329.         v1 = Vector(v0.x + (v1.x - v0.x) * rate,
  330.                     v0.y + (v1.y - v0.y) * rate,
  331.                     1.0);
  332.     }
  333.     double x0 = v0.x/v0.z, y0 = v0.y/v0.z;
  334.     double x1 = v1.x/v1.z, y1 = v1.y/v1.z;
  335.     if ((x0 < 0 && x1 < 0) || (x0 > 2048 && x1 > 2048)) {
  336.         return;
  337.     }
  338.     if (x0 < 0) {
  339.         y0 = y1 + (y0-y1) * (   0-x1) / (x0-x1);
  340.         x0 = 0;
  341.     } else if (x0 > 2048) {
  342.         y0 = y1 + (y0-y1) * (2048-x1) / (x0-x1);
  343.         x0 = 2048;
  344.     }
  345.     if (x1 < 0) {
  346.         y1 = y0 + (y1-y0) * (   0-x0) / (x1-x0);
  347.         x1 = 0;
  348.     } else if (x1 > 2048) {
  349.         y1 = y0 + (y1-y0) * (2048-x0) / (x1-x0);
  350.         x1 = 2048;
  351.     }
  352.     if ((y0 < 0 && y1 < 0) || (y0 > 2048 && y1 > 2048)) {
  353.         return;
  354.     }
  355.     if (y0 < 0) {
  356.         x0 = x1 + (x0-x1) * (   0-y1) / (y0-y1);
  357.         y0 = 0;
  358.     } else if (y0 > 2048) {
  359.         x0 = x1 + (x0-x1) * (2048-y1) / (y0-y1);
  360.         y0 = 2048;
  361.     }
  362.     if (y1 < 0) {
  363.         x1 = x0 + (x1-x0) * (   0-y0) / (y1-y0);
  364.         y1 = 0;
  365.     } else if (y1 > 2048) {
  366.         x1 = x0 + (x1-x0) * (2048-y0) / (y1-y0);
  367.         y1 = 2048;
  368.     }
  369.  
  370.     dc.MoveTo(x0,y0);
  371.     dc.LineTo(x1,y1);
  372. }
  373.  
  374.  
  375. void TWinPers::ShowMesh(TDC& dc)
  376. {
  377.     if (anim->meshflag == FALSE) {
  378.         return;
  379.     }
  380.     Vector& v = anim->displayoffset;
  381.     double bx = - (1.0 / anim->displayscale) * (v.x + anim->TopView->Attr.W / 2);
  382.     double by = - (1.0 / anim->displayscale) * (v.y + anim->TopView->Attr.H / 2);
  383. //    int cx = (1.0 / anim->displayscale) * anim->TopView->Attr.W / anim->meshspacing+1;
  384. //    int cy = (1.0 / anim->displayscale) * anim->TopView->Attr.H / anim->meshspacing+1;
  385.  
  386.  
  387.     dc.SetROP2(R2_COPYPEN);
  388.     dc.SelectObject(TPen(cGrid));
  389.     dc.SelectObject(TPen(cGrid,1,PS_DOT));
  390.     dc.SetBkMode(TRANSPARENT);
  391.     int i;
  392.  
  393.     double xb = bx, yb = by;
  394.     double xe = - (1.0 / anim->displayscale) * (v.x - anim->TopView->Attr.W / 2);
  395.     double ye = - (1.0 / anim->displayscale) * (v.y - anim->TopView->Attr.H / 2);
  396.  
  397.     if (bx < 0) {
  398.         bx = -((long)(-bx/anim->meshspacing)  ) * anim->meshspacing;
  399.     } else {
  400.         bx =  ((long)( bx/anim->meshspacing)+1) * anim->meshspacing;
  401.     }
  402.     if (by < 0) {
  403.         by = -((long)(-by/anim->meshspacing)) * anim->meshspacing;
  404.     } else {
  405.         by =  ((long)( by/anim->meshspacing)+1) * anim->meshspacing;
  406.     }
  407.  
  408.     int cx = (xe - bx) / anim->meshspacing + 1;
  409.     int cy = (ye - by) / anim->meshspacing + 1;
  410.  
  411. //    double xb = bx, xe = bx + (double)(cx) * anim->meshspacing;
  412. //    double yb = by, ye = by + (double)(cy) * anim->meshspacing;
  413.  
  414.     for (i = 0; i < cx; ++i,bx += anim->meshspacing) {
  415.         Vector v0 = anim->viewmat * Vector(bx, yb, 0.0);
  416.         Vector v1 = anim->viewmat * Vector(bx, ye, 0.0);
  417.         if (-anim->meshspacing/2 < bx && bx < anim->meshspacing/2) {
  418.             dc.SelectObject(TPen(cGridZero));
  419.             DrawLine(dc, v0, v1);
  420.             dc.SelectObject(TPen(cGrid,1,PS_DOT));
  421.         } else {
  422.             DrawLine(dc, v0, v1);
  423.         }
  424.     }
  425.     for (i = 0; i < cy; ++i,by += anim->meshspacing) {
  426.         Vector v0 = anim->viewmat * Vector(xb, by, 0.0);
  427.         Vector v1 = anim->viewmat * Vector(xe, by, 0.0);
  428.         if (-anim->meshspacing/2 < by && by     < anim->meshspacing/2) {
  429.             dc.SelectObject(TPen(cGridZero));
  430.             DrawLine(dc, v0, v1);
  431.             dc.SelectObject(TPen(cGrid,1,PS_DOT));
  432.         } else {
  433.             DrawLine(dc, v0, v1);
  434.         }
  435.     }
  436. }
  437.  
  438. void TWinPers::ShowLight(Vector& vec, int /*flag*/)
  439. {
  440.     TClientDC dc(*this);
  441.  
  442.     dc.SetROP2(R2_NOTXORPEN);
  443.     dc.SelectObject(TPen(cBackGround));
  444.  
  445. #define ARROW_POINTS 7
  446. #define W1 (1.0/16.0)
  447. #define W2 (1.0/4.0)
  448. #define L1 1.0
  449. #define L2 (1.0/3.0)
  450. //    static double ratex[ARROW_POINTS] = {0, L2, L2, L1, L1, L2, L2};
  451. //    static double ratey[ARROW_POINTS] = {0, W2, W1, W1,-W1,-W1,-W2};
  452.     static double ratex[ARROW_POINTS] = {0, L2, L2, L1, L1, L2, L2};
  453.     static double ratey[ARROW_POINTS] = {0, W2, W1, W1,-W1,-W1,-W2};
  454.  
  455.     Vector vx, vy;
  456.     double l = (anim->camera->position - anim->camera->target->position).length() / 1.2 / vec.length();
  457.     vx = -l * vec;
  458.     vy = vx * (anim->camera->position - anim->camera->target->position);
  459.     double ly = vy.length();
  460.     if (ly < minimumdouble) return;
  461.     vy *= (vx.length()/ly);
  462.  
  463.     Vector v0 = anim->camera->target->position - 0.5 * vx;
  464.     int i, px[ARROW_POINTS], py[ARROW_POINTS];
  465.     for (i = 0; i < ARROW_POINTS; i++) {
  466.         Vector v = anim->viewmat * (v0 + vx * ratex[i] + vy * ratey[i]);
  467.         if (v.z < 1) return;
  468.         px[i] = v.x / v.z;
  469.         py[i] = v.y / v.z;
  470.     }
  471.     dc.MoveTo(px[ARROW_POINTS-1], py[ARROW_POINTS-1]);
  472.     for (i = 0; i < ARROW_POINTS; i++) {
  473.         dc.LineTo(px[i], py[i]);
  474.     }
  475.  
  476. #if 0
  477.     double l = (anim->camera->position - anim->camera->target->position).length() / 2.0 / vec.length();
  478.     Vector v = anim->viewmat * (anim->camera->target->position - l * vec);
  479.  
  480.     double vx, vy;
  481.     if (v.z < 1) {
  482.         return;
  483.     }
  484.     TPoint pc(Attr.W/2, Attr.H/2);
  485.     TPoint vl(v.x/v.z,  v.y/v.z);
  486.  
  487.     vx =  vl.x - pc.x;
  488.     vy = -vl.y + pc.y;
  489.  
  490.     dc.MoveTo(pc);
  491.     dc.LineTo(vl);
  492.  
  493.     l = sqrt(vx*vx+vy*vy);
  494.     if (l > 1.0) {
  495.         vx *= ((double)(markersize*8) /l);
  496.         vy *= ((double)(markersize*8) /l);
  497.  
  498.         TPoint v1(vx + 0.5 * vy, -vy + 0.5 * vx);
  499.         TPoint v2(vx - 0.5 * vy, -vy - 0.5 * vx);
  500.         dc.MoveTo(pc+v1);
  501.         dc.LineTo(pc);
  502.         dc.LineTo(pc+v2);
  503.     }
  504. #endif
  505. }
  506.  
  507. void TWinPers::EvLButtonDown (UINT modKeys, TPoint& point)
  508. {
  509.     TWindow::EvLButtonDown(modKeys, point);
  510.     if (anim->opstat == OpPlay) {
  511.         anim->OpModeDefault();
  512.     }
  513. }
  514.  
  515.