20 #include "renderworld.h"
21 #include "physphere.h"
22 #include "phyellipsoid.h"
24 #include "phycylinder.h"
27 #include "phycompoundobject.h"
29 #include "graphicalwobject.h"
30 #include "private/renderwobjecthierarchy.h"
44 # include <GLUT/glut.h>
49 using namespace qglviewer;
51 #define GLMultMatrix glMultMatrixf
66 virtual void render( QGLContext* gw ) {
69 const wMatrix& m = obj->matrix();
70 GLMultMatrix(&m[0][0]);
79 calculateAABB( minpoint, maxpoint, obj->matrix() );
84 minPoint = tm.w_pos - rds;
85 maxPoint = tm.w_pos + rds;
89 dimension[0] = rad*2.0;
90 dimension[1] = rad*2.0;
91 dimension[2] = rad*2.0;
103 wmesh = (
WMesh*)wobj;
106 virtual void render( QGLContext* gw ) {
109 if ( wmesh->attachedTo() ) {
110 m = m * wmesh->attachedTo()->matrix();
112 GLMultMatrix(&m[0][0]);
113 int m_numMeshes = wmesh->meshesCount();
121 for (
int i = 0; i < m_numMeshes; i++ ) {
122 int materialIndex = m_pMeshes[i].m_materialIndex;
123 if ( materialIndex >= 0 ) {
124 glMaterialfv( GL_FRONT, GL_AMBIENT, m_pMaterials[materialIndex].m_ambient );
125 glMaterialfv( GL_FRONT, GL_DIFFUSE, m_pMaterials[materialIndex].m_diffuse );
126 glMaterialfv( GL_FRONT, GL_SPECULAR, m_pMaterials[materialIndex].m_specular );
127 glMaterialfv( GL_FRONT, GL_EMISSION, m_pMaterials[materialIndex].m_emissive );
128 glMaterialf( GL_FRONT, GL_SHININESS, m_pMaterials[materialIndex].m_shininess );
132 glBegin( GL_TRIANGLES );
133 for (
int j = 0; j < m_pMeshes[i].m_numTriangles; j++ ) {
134 int triangleIndex = m_pMeshes[i].m_pTriangleIndices[j];
136 for (
int k = 0; k < 3; k++ ) {
137 int index = pTri->m_vertexIndices[k];
138 glNormal3fv( pTri->m_vertexNormals[k] );
139 glTexCoord2f( pTri->m_s[k], pTri->m_t[k] );
140 glVertex3fv( m_pVertices[index].m_location );
170 virtual void render( QGLContext* gw ) {
173 const wMatrix& m = box->matrix();
174 GLMultMatrix(&m[0][0]);
180 float hdx = (dx/2.0);
181 float hdy = (dy/2.0);
182 float hdz = (dz/2.0);
184 glNormal3f(0.0, 0.0, 1.0);
185 glTexCoord2f(0.0, 0.0); glVertex3f(-hdx, -hdy, hdz);
186 glTexCoord2f(1.0, 0.0); glVertex3f( hdx, -hdy, hdz);
187 glTexCoord2f(1.0, 1.0); glVertex3f( hdx, hdy, hdz);
188 glTexCoord2f(0.0, 1.0); glVertex3f(-hdx, hdy, hdz);
191 glNormal3f(0.0, 0.0, -1.0);
192 glTexCoord2f(0.0, 0.0); glVertex3f( hdx, -hdy, -hdz);
193 glTexCoord2f(1.0, 0.0); glVertex3f(-hdx, -hdy, -hdz);
194 glTexCoord2f(1.0, 1.0); glVertex3f(-hdx, hdy, -hdz);
195 glTexCoord2f(0.0, 1.0); glVertex3f( hdx, hdy, -hdz);
198 glNormal3f(0.0, 1.0, 0.0);
199 glTexCoord2f(0.0, 0.0); glVertex3f(-hdx, hdy, hdz);
200 glTexCoord2f(1.0, 0.0); glVertex3f( hdx, hdy, hdz);
201 glTexCoord2f(1.0, 1.0); glVertex3f( hdx, hdy, -hdz);
202 glTexCoord2f(0.0, 1.0); glVertex3f(-hdx, hdy, -hdz);
205 glNormal3f(0.0, -1.0, 0.0);
206 glTexCoord2f(0.0, 0.0); glVertex3f(-hdx, -hdy, -hdz);
207 glTexCoord2f(1.0, 0.0); glVertex3f( hdx, -hdy, -hdz);
208 glTexCoord2f(1.0, 1.0); glVertex3f( hdx, -hdy, hdz);
209 glTexCoord2f(0.0, 1.0); glVertex3f(-hdx, -hdy, hdz);
212 glNormal3f(-1.0, 0.0, 0.0);
213 glTexCoord2f(0.0, 0.0); glVertex3f(-hdx, -hdy, -hdz);
214 glTexCoord2f(1.0, 0.0); glVertex3f(-hdx, -hdy, hdz);
215 glTexCoord2f(1.0, 1.0); glVertex3f(-hdx, hdy, hdz);
216 glTexCoord2f(0.0, 1.0); glVertex3f(-hdx, hdy, -hdz);
219 glNormal3f(1.0, 0.0, 0.0);
220 glTexCoord2f(0.0, 0.0); glVertex3f( hdx, -hdy, hdz);
221 glTexCoord2f(1.0, 0.0); glVertex3f( hdx, -hdy, -hdz);
222 glTexCoord2f(1.0, 1.0); glVertex3f( hdx, hdy, -hdz);
223 glTexCoord2f(0.0, 1.0); glVertex3f( hdx, hdy, hdz);
228 if (box->localAxesDrawn()) {
229 const float radius =
min(dx,
min(dy, dz)) * 0.1;
231 RenderWObjectContainer::drawArrow(
wVector(dx, 0.0, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::red);
232 RenderWObjectContainer::drawArrow(
wVector(0.0, dy, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::green);
233 RenderWObjectContainer::drawArrow(
wVector(0.0, 0.0, dz),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::blue);
243 calculateAABB( minpoint, maxpoint, obj->matrix() );
247 real tdx = fabs(tm.x_ax[0]*dx) + fabs(tm.y_ax[0]*dy) + fabs(tm.z_ax[0]*dz);
248 real tdy = fabs(tm.x_ax[1]*dx) + fabs(tm.y_ax[1]*dy) + fabs(tm.z_ax[1]*dz);
249 real tdz = fabs(tm.x_ax[2]*dx) + fabs(tm.y_ax[2]*dy) + fabs(tm.z_ax[2]*dz);
251 wVector hds( tdx/2.0, tdy/2.0, tdz/2.0 );
252 minPoint = tm.w_pos - hds;
253 maxPoint = tm.w_pos + hds;
260 wVector hds( dx/2.0, dy/2.0, dz/2.0 );
277 virtual void render( QGLContext* gw ) {
285 GLMultMatrix(&mat[0][0]);
288 pObj = gluNewQuadric();
290 gluQuadricTexture(pObj,
true);
291 gluSphere(pObj, rad, 20, 20);
292 gluDeleteQuadric(pObj);
295 if (sph->localAxesDrawn()) {
296 const float radius = rad * 0.1;
298 RenderWObjectContainer::drawArrow(
wVector(2.0 * rad, 0.0, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::red);
299 RenderWObjectContainer::drawArrow(
wVector(0.0, 2.0 * rad, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::green);
300 RenderWObjectContainer::drawArrow(
wVector(0.0, 0.0, 2.0 * rad),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::blue);
310 calculateAABB( minpoint, maxpoint, obj->matrix() );
315 minPoint = tm.w_pos - rds;
316 maxPoint = tm.w_pos + rds;
320 dimension[0] = rad*2.0;
321 dimension[1] = rad*2.0;
322 dimension[2] = rad*2.0;
336 radx = sph->radiusX();
337 rady = sph->radiusY();
338 radz = sph->radiusZ();
341 virtual void render( QGLContext* gw ) {
346 mat.x_ax = mat.x_ax.
scale( radx );
347 mat.y_ax = mat.y_ax.
scale( rady );
348 mat.z_ax = mat.z_ax.
scale( radz );
349 GLMultMatrix(&mat[0][0]);
352 pObj = gluNewQuadric();
354 gluQuadricTexture(pObj,
true);
355 gluSphere(pObj, 1, 20, 20);
356 gluDeleteQuadric(pObj);
359 if (sph->localAxesDrawn()) {
360 const float radius = qMax( qMax(radx, rady), radz ) * 0.1;
362 RenderWObjectContainer::drawArrow(
wVector(2.0 * radx, 0.0, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::red);
363 RenderWObjectContainer::drawArrow(
wVector(0.0, 2.0 * rady, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::green);
364 RenderWObjectContainer::drawArrow(
wVector(0.0, 0.0, 2.0 * radz),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::blue);
374 calculateAABB( minpoint, maxpoint, obj->matrix() );
378 wVector rds( radx, rady, radz );
379 minPoint = tm.w_pos - rds;
380 maxPoint = tm.w_pos + rds;
384 dimension[0] = radx*2.0;
385 dimension[1] = rady*2.0;
386 dimension[2] = radz*2.0;
482 m_height(m_cylinder->height()),
483 m_radius(m_cylinder->radius()),
484 m_cylinderVertexes(),
487 m_cylinderTextureCoords(),
488 m_upperBaseVertexes(),
489 m_upperBaseNormals(),
491 m_upperBaseTextureCoords(),
492 m_upperBaseSegmentsLength(),
493 m_lowerBaseVertexes(),
494 m_lowerBaseNormals(),
496 m_lowerBaseTextureCoords(),
497 m_lowerBaseSegmentsLength()
515 virtual void render(QGLContext* gw)
518 if (m_cylinder->graphicalRepresentationNeedsUpdate(
this)) {
519 updateRepresentation();
523 container()->setupColorTexture(gw,
this);
524 GLMultMatrix(&(m_cylinder->matrix()[0][0]));
528 glEnableClientState(GL_NORMAL_ARRAY);
529 glEnableClientState(GL_COLOR_ARRAY);
530 glEnableClientState(GL_VERTEX_ARRAY);
531 glEnableClientState(GL_TEXTURE_COORD_ARRAY);
533 glNormalPointer(GL_FLOAT, 0, m_cylinderNormals.data());
534 glColorPointer(3, GL_FLOAT, 0, m_cylinderColors.data());
535 glVertexPointer(3, GL_FLOAT, 0, m_cylinderVertexes.data());
536 glTexCoordPointer(2, GL_FLOAT, 0, m_cylinderTextureCoords.data());
538 glDrawArrays(GL_TRIANGLE_STRIP, 0, m_cylinderVertexes.size() / 3);
541 glNormalPointer(GL_FLOAT, 0, m_upperBaseNormals.data());
542 glColorPointer(3, GL_FLOAT, 0, m_upperBaseColors.data());
543 glVertexPointer(3, GL_FLOAT, 0, m_upperBaseVertexes.data());
544 glTexCoordPointer(2, GL_FLOAT, 0, m_upperBaseTextureCoords.data());
546 unsigned int startIndex = 0;
547 foreach (
unsigned int curLength, m_upperBaseSegmentsLength) {
548 glDrawArrays(GL_TRIANGLE_FAN, startIndex, curLength);
549 startIndex += curLength;
553 glNormalPointer(GL_FLOAT, 0, m_lowerBaseNormals.data());
554 glColorPointer(3, GL_FLOAT, 0, m_lowerBaseColors.data());
555 glVertexPointer(3, GL_FLOAT, 0, m_lowerBaseVertexes.data());
556 glTexCoordPointer(2, GL_FLOAT, 0, m_lowerBaseTextureCoords.data());
559 foreach (
unsigned int curLength, m_lowerBaseSegmentsLength) {
560 glDrawArrays(GL_TRIANGLE_FAN, startIndex, curLength);
561 startIndex += curLength;
564 glDisableClientState(GL_VERTEX_ARRAY);
565 glDisableClientState(GL_COLOR_ARRAY);
566 glDisableClientState(GL_NORMAL_ARRAY);
567 glDisableClientState(GL_TEXTURE_COORD_ARRAY);
570 if (m_cylinder->localAxesDrawn()) {
571 const float radius =
min(m_radius, m_height) * 0.1;
573 RenderWObjectContainer::drawArrow(
wVector(m_height, 0.0, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::red);
574 RenderWObjectContainer::drawArrow(
wVector(0.0, 2.0 * m_radius, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::green);
575 RenderWObjectContainer::drawArrow(
wVector(0.0, 0.0, 2.0 * m_radius),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::blue);
592 if (m_cylinder->graphicalRepresentationNeedsUpdate()) {
593 updateRepresentation();
597 calculateAABB(minpoint, maxpoint, obj->matrix());
611 if (m_cylinder->graphicalRepresentationNeedsUpdate()) {
612 updateRepresentation();
615 const real h2 = m_height / 2.0;
616 const real tdx = fabs(tm.x_ax[0] * h2) + fabs(tm.y_ax[0] * m_radius) + fabs(tm.z_ax[0] * m_radius);
617 const real tdy = fabs(tm.x_ax[1] * h2) + fabs(tm.y_ax[1] * m_radius) + fabs(tm.z_ax[1] * m_radius);
618 const real tdz = fabs(tm.x_ax[2] * h2) + fabs(tm.y_ax[2] * m_radius) + fabs(tm.z_ax[2] * m_radius);
619 const wVector hds(tdx, tdy, tdz);
620 minPoint = tm.w_pos - hds;
621 maxPoint = tm.w_pos + hds;
634 if (m_cylinder->graphicalRepresentationNeedsUpdate()) {
635 updateRepresentation();
638 dimension[0] = m_height;
639 dimension[1] = m_radius * 2.0;
640 dimension[2] = m_radius * 2.0;
641 const wVector rds(m_height / 2.0, m_radius, m_radius);
652 void updateRepresentation()
655 const int numDivs = 20;
656 const float anglePerDiv = (2 * M_PI) /
float(numDivs);
657 const float lowerBaseX = -m_height / 2.0;
658 const float upperBaseX = +m_height / 2.0;
661 m_cylinderVertexes.clear();
662 m_cylinderNormals.clear();
663 m_cylinderColors.clear();
664 m_cylinderTextureCoords.clear();
665 m_upperBaseVertexes.clear();
666 m_upperBaseNormals.clear();
667 m_upperBaseColors.clear();
668 m_upperBaseTextureCoords.clear();
669 m_upperBaseSegmentsLength.clear();
670 m_lowerBaseVertexes.clear();
671 m_lowerBaseNormals.clear();
672 m_lowerBaseColors.clear();
673 m_lowerBaseTextureCoords.clear();
674 m_lowerBaseSegmentsLength.clear();
677 QColor cylinderColor;
678 if (m_cylinder->useColorTextureOfOwner()) {
689 cylinderColor = obj->
color();
691 cylinderColor = m_cylinder->color();
697 QList<PhyCylinder::SegmentColor> tmpCylinderColors;
698 if (cylinderColor.isValid()){
702 tmpCylinderColors = m_cylinder->segmentsColor();
705 QList<PhyCylinder::SegmentColor> cylinderColors;
706 for (
int i = 0; i < tmpCylinderColors.size(); ++i) {
707 if (tmpCylinderColors[i].intervals.length() < anglePerDiv) {
708 cylinderColors << tmpCylinderColors[i];
711 const int numDivisions = int(ceil(tmpCylinderColors[i].intervals.length() / anglePerDiv));
712 if (numDivisions == 0) {
715 const real divisionsLength = tmpCylinderColors[i].intervals.length() /
real(numDivisions);
718 if (numDivisions == 1) {
719 cylinderColors << tmpCylinderColors[i];
722 const real firstIntervalStart = tmpCylinderColors[i].intervals.begin()->start;
724 for (
int j = 1; j < numDivisions - 1; j++) {
725 const real curIntervalStart = cylinderColors.last().intervals.begin()->end;
726 cylinderColors << PhyCylinder::SegmentColor(
SimpleInterval(curIntervalStart, curIntervalStart + divisionsLength), tmpCylinderColors[i].color);
729 const real lastIntervalStart = cylinderColors.last().intervals.begin()->end;
730 const real lastIntervalEnd = tmpCylinderColors[i].intervals.begin()->end;
731 cylinderColors << PhyCylinder::SegmentColor(
SimpleInterval(lastIntervalStart, lastIntervalEnd), tmpCylinderColors[i].color);
738 const QColor color = cylinderColors[0].color;
739 const float normY = cos(-PI_GRECO);
740 const float normZ = sin(-PI_GRECO);
741 const float y = m_radius * normY;
742 const float z = m_radius * normZ;
743 m_cylinderVertexes.append(lowerBaseX);
744 m_cylinderVertexes.append(y);
745 m_cylinderVertexes.append(z);
746 m_cylinderNormals.append(0.0);
747 m_cylinderNormals.append(normY);
748 m_cylinderNormals.append(normZ);
749 m_cylinderColors.append(color.redF());
750 m_cylinderColors.append(color.greenF());
751 m_cylinderColors.append(color.blueF());
752 m_cylinderTextureCoords.append(0.0);
753 m_cylinderTextureCoords.append(0.0);
754 m_cylinderVertexes.append(upperBaseX);
755 m_cylinderVertexes.append(y);
756 m_cylinderVertexes.append(z);
757 m_cylinderNormals.append(0.0);
758 m_cylinderNormals.append(normY);
759 m_cylinderNormals.append(normZ);
760 m_cylinderColors.append(color.redF());
761 m_cylinderColors.append(color.greenF());
762 m_cylinderColors.append(color.blueF());
763 m_cylinderTextureCoords.append(1.0);
764 m_cylinderTextureCoords.append(0.0);
767 QColor prevColor = cylinderColors[0].color;
768 for (
int i = 0; i < cylinderColors.size(); ++i) {
769 const QColor color = cylinderColors[i].color;
771 if (prevColor != color) {
774 const real prevAngle = cylinderColors[i].intervals.begin()->start;
775 const float normY = cos(prevAngle);
776 const float normZ = sin(prevAngle);
777 const float y = m_radius * normY;
778 const float z = m_radius * normZ;
780 m_cylinderVertexes.append(lowerBaseX);
781 m_cylinderVertexes.append(y);
782 m_cylinderVertexes.append(z);
783 m_cylinderNormals.append(0.0);
784 m_cylinderNormals.append(normY);
785 m_cylinderNormals.append(normZ);
786 m_cylinderColors.append(color.redF());
787 m_cylinderColors.append(color.greenF());
788 m_cylinderColors.append(color.blueF());
789 m_cylinderTextureCoords.append(0.0);
790 m_cylinderTextureCoords.append((prevAngle + PI_GRECO) / (2.0 * PI_GRECO));
791 m_cylinderVertexes.append(upperBaseX);
792 m_cylinderVertexes.append(y);
793 m_cylinderVertexes.append(z);
794 m_cylinderNormals.append(0.0);
795 m_cylinderNormals.append(normY);
796 m_cylinderNormals.append(normZ);
797 m_cylinderColors.append(color.redF());
798 m_cylinderColors.append(color.greenF());
799 m_cylinderColors.append(color.blueF());
800 m_cylinderTextureCoords.append(1.0);
801 m_cylinderTextureCoords.append((prevAngle + PI_GRECO) / (2.0 * PI_GRECO));
804 const real curAngle = cylinderColors[i].intervals.begin()->end;
805 const float normY = cos(curAngle);
806 const float normZ = sin(curAngle);
807 const float y = m_radius * normY;
808 const float z = m_radius * normZ;
811 m_cylinderVertexes.append(lowerBaseX);
812 m_cylinderVertexes.append(y);
813 m_cylinderVertexes.append(z);
814 m_cylinderNormals.append(0.0);
815 m_cylinderNormals.append(normY);
816 m_cylinderNormals.append(normZ);
817 m_cylinderColors.append(color.redF());
818 m_cylinderColors.append(color.greenF());
819 m_cylinderColors.append(color.blueF());
820 m_cylinderTextureCoords.append(0.0);
821 m_cylinderTextureCoords.append((curAngle + PI_GRECO) / (2.0 * PI_GRECO));
822 m_cylinderVertexes.append(upperBaseX);
823 m_cylinderVertexes.append(y);
824 m_cylinderVertexes.append(z);
825 m_cylinderNormals.append(0.0);
826 m_cylinderNormals.append(normY);
827 m_cylinderNormals.append(normZ);
828 m_cylinderColors.append(color.redF());
829 m_cylinderColors.append(color.greenF());
830 m_cylinderColors.append(color.blueF());
831 m_cylinderTextureCoords.append(1.0);
832 m_cylinderTextureCoords.append((curAngle + PI_GRECO) / (2.0 * PI_GRECO));
834 prevColor = cylinderColors[i].color;
840 QList<PhyCylinder::SegmentColor> upperBaseColor;
841 QColor colorForUpperBase;
842 if (cylinderColor.isValid()) {
844 colorForUpperBase = cylinderColor;
845 }
else if (m_cylinder->upperBaseColor().isValid()) {
847 colorForUpperBase = m_cylinder->upperBaseColor();
849 if (colorForUpperBase.isValid()) {
850 for (
int i = 0; i < cylinderColors.size(); i++) {
852 s.
color = colorForUpperBase;
856 upperBaseColor = cylinderColors;
861 unsigned int numVertexesCurSegment = 0;
866 const QColor color = upperBaseColor[0].color;
867 m_upperBaseVertexes.append(upperBaseX);
868 m_upperBaseVertexes.append(0.0);
869 m_upperBaseVertexes.append(0.0);
870 m_upperBaseNormals.append(1.0);
871 m_upperBaseNormals.append(0.0);
872 m_upperBaseNormals.append(0.0);
873 m_upperBaseColors.append(color.redF());
874 m_upperBaseColors.append(color.greenF());
875 m_upperBaseColors.append(color.blueF());
876 m_upperBaseTextureCoords.append(0.5);
877 m_upperBaseTextureCoords.append(0.5);
878 ++numVertexesCurSegment;
880 const real curAngle = upperBaseColor[0].intervals.begin()->start;
881 const float normY = cos(curAngle);
882 const float normZ = sin(curAngle);
883 const float y = m_radius * normY;
884 const float z = m_radius * normZ;
886 m_upperBaseVertexes.append(upperBaseX);
887 m_upperBaseVertexes.append(y);
888 m_upperBaseVertexes.append(z);
889 m_upperBaseNormals.append(1.0);
890 m_upperBaseNormals.append(0.0);
891 m_upperBaseNormals.append(0.0);
892 m_upperBaseColors.append(color.redF());
893 m_upperBaseColors.append(color.greenF());
894 m_upperBaseColors.append(color.blueF());
895 m_upperBaseTextureCoords.append((normY + 1.0) / 2.0);
896 m_upperBaseTextureCoords.append((normZ + 1.0) / 2.0);
897 ++numVertexesCurSegment;
900 prevColor = upperBaseColor[0].color;
901 for (
int i = 0; i < upperBaseColor.size(); ++i) {
902 const QColor color = upperBaseColor[i].color;
904 if (prevColor != color) {
906 m_upperBaseSegmentsLength.append(numVertexesCurSegment);
907 numVertexesCurSegment = 0;
911 const real prevAngle = upperBaseColor[i].intervals.begin()->start;
912 const float normY = cos(prevAngle);
913 const float normZ = sin(prevAngle);
914 const float y = m_radius * normY;
915 const float z = m_radius * normZ;
916 m_upperBaseVertexes.append(upperBaseX);
917 m_upperBaseVertexes.append(0.0);
918 m_upperBaseVertexes.append(0.0);
919 m_upperBaseNormals.append(1.0);
920 m_upperBaseNormals.append(0.0);
921 m_upperBaseNormals.append(0.0);
922 m_upperBaseColors.append(color.redF());
923 m_upperBaseColors.append(color.greenF());
924 m_upperBaseColors.append(color.blueF());
925 m_upperBaseTextureCoords.append(0.5);
926 m_upperBaseTextureCoords.append(0.5);
927 ++numVertexesCurSegment;
928 m_upperBaseVertexes.append(upperBaseX);
929 m_upperBaseVertexes.append(y);
930 m_upperBaseVertexes.append(z);
931 m_upperBaseNormals.append(1.0);
932 m_upperBaseNormals.append(0.0);
933 m_upperBaseNormals.append(0.0);
934 m_upperBaseColors.append(color.redF());
935 m_upperBaseColors.append(color.greenF());
936 m_upperBaseColors.append(color.blueF());
937 m_upperBaseTextureCoords.append((normY + 1.0) / 2.0);
938 m_upperBaseTextureCoords.append((normZ + 1.0) / 2.0);
939 ++numVertexesCurSegment;
942 const real curAngle = upperBaseColor[i].intervals.begin()->end;
943 const float normY = cos(curAngle);
944 const float normZ = sin(curAngle);
945 const float y = m_radius * normY;
946 const float z = m_radius * normZ;
948 m_upperBaseVertexes.append(upperBaseX);
949 m_upperBaseVertexes.append(y);
950 m_upperBaseVertexes.append(z);
951 m_upperBaseNormals.append(1.0);
952 m_upperBaseNormals.append(0.0);
953 m_upperBaseNormals.append(0.0);
954 m_upperBaseColors.append(color.redF());
955 m_upperBaseColors.append(color.greenF());
956 m_upperBaseColors.append(color.blueF());
957 m_upperBaseTextureCoords.append((normY + 1.0) / 2.0);
958 m_upperBaseTextureCoords.append((normZ + 1.0) / 2.0);
959 ++numVertexesCurSegment;
961 prevColor = upperBaseColor[i].color;
964 m_upperBaseSegmentsLength.append(numVertexesCurSegment);
967 QList<PhyCylinder::SegmentColor> lowerBaseColor;
968 QColor colorForLowerBase;
969 if (cylinderColor.isValid()) {
971 colorForLowerBase = cylinderColor;
972 }
else if (m_cylinder->lowerBaseColor().isValid()) {
974 colorForLowerBase = m_cylinder->lowerBaseColor();
976 if (colorForLowerBase.isValid()) {
977 for (
int i = 0; i < cylinderColors.size(); i++) {
979 s.
color = colorForLowerBase;
983 lowerBaseColor = cylinderColors;
986 numVertexesCurSegment = 0;
989 const QColor color = lowerBaseColor[0].color;
990 m_lowerBaseVertexes.append(lowerBaseX);
991 m_lowerBaseVertexes.append(0.0);
992 m_lowerBaseVertexes.append(0.0);
993 m_lowerBaseNormals.append(-1.0);
994 m_lowerBaseNormals.append(0.0);
995 m_lowerBaseNormals.append(0.0);
996 m_lowerBaseColors.append(color.redF());
997 m_lowerBaseColors.append(color.greenF());
998 m_lowerBaseColors.append(color.blueF());
999 m_lowerBaseTextureCoords.append(0.5);
1000 m_lowerBaseTextureCoords.append(0.5);
1001 ++numVertexesCurSegment;
1003 const real curAngle = lowerBaseColor[0].intervals.begin()->start;
1004 const float normY = cos(curAngle);
1005 const float normZ = sin(curAngle);
1006 const float y = m_radius * normY;
1007 const float z = m_radius * normZ;
1009 m_lowerBaseVertexes.append(lowerBaseX);
1010 m_lowerBaseVertexes.append(y);
1011 m_lowerBaseVertexes.append(z);
1012 m_lowerBaseNormals.append(-1.0);
1013 m_lowerBaseNormals.append(0.0);
1014 m_lowerBaseNormals.append(0.0);
1015 m_lowerBaseColors.append(color.redF());
1016 m_lowerBaseColors.append(color.greenF());
1017 m_lowerBaseColors.append(color.blueF());
1018 m_lowerBaseTextureCoords.append((normY + 1.0) / 2.0);
1019 m_lowerBaseTextureCoords.append((normZ + 1.0) / 2.0);
1020 ++numVertexesCurSegment;
1023 prevColor = lowerBaseColor[0].color;
1024 for (
int i = 0; i < lowerBaseColor.size(); ++i) {
1025 const QColor color = lowerBaseColor[i].color;
1027 if (prevColor != color) {
1029 m_lowerBaseSegmentsLength.append(numVertexesCurSegment);
1030 numVertexesCurSegment = 0;
1034 const real prevAngle = lowerBaseColor[i].intervals.begin()->start;
1035 const float normY = cos(prevAngle);
1036 const float normZ = sin(prevAngle);
1037 const float y = m_radius * normY;
1038 const float z = m_radius * normZ;
1039 m_lowerBaseVertexes.append(lowerBaseX);
1040 m_lowerBaseVertexes.append(0.0);
1041 m_lowerBaseVertexes.append(0.0);
1042 m_lowerBaseNormals.append(-1.0);
1043 m_lowerBaseNormals.append(0.0);
1044 m_lowerBaseNormals.append(0.0);
1045 m_lowerBaseColors.append(color.redF());
1046 m_lowerBaseColors.append(color.greenF());
1047 m_lowerBaseColors.append(color.blueF());
1048 m_lowerBaseTextureCoords.append(0.5);
1049 m_lowerBaseTextureCoords.append(0.5);
1050 ++numVertexesCurSegment;
1051 m_lowerBaseVertexes.append(lowerBaseX);
1052 m_lowerBaseVertexes.append(y);
1053 m_lowerBaseVertexes.append(z);
1054 m_lowerBaseNormals.append(-1.0);
1055 m_lowerBaseNormals.append(0.0);
1056 m_lowerBaseNormals.append(0.0);
1057 m_lowerBaseColors.append(color.redF());
1058 m_lowerBaseColors.append(color.greenF());
1059 m_lowerBaseColors.append(color.blueF());
1060 m_lowerBaseTextureCoords.append((normY + 1.0) / 2.0);
1061 m_lowerBaseTextureCoords.append((normZ + 1.0) / 2.0);
1062 ++numVertexesCurSegment;
1065 const real curAngle = lowerBaseColor[i].intervals.begin()->end;
1066 const float normY = cos(curAngle);
1067 const float normZ = sin(curAngle);
1068 const float y = m_radius * normY;
1069 const float z = m_radius * normZ;
1071 m_lowerBaseVertexes.append(lowerBaseX);
1072 m_lowerBaseVertexes.append(y);
1073 m_lowerBaseVertexes.append(z);
1074 m_lowerBaseNormals.append(-1.0);
1075 m_lowerBaseNormals.append(0.0);
1076 m_lowerBaseNormals.append(0.0);
1077 m_lowerBaseColors.append(color.redF());
1078 m_lowerBaseColors.append(color.greenF());
1079 m_lowerBaseColors.append(color.blueF());
1080 m_lowerBaseTextureCoords.append((normY + 1.0) / 2.0);
1081 m_lowerBaseTextureCoords.append((normZ + 1.0) / 2.0);
1082 ++numVertexesCurSegment;
1084 prevColor = lowerBaseColor[i].color;
1087 m_lowerBaseSegmentsLength.append(numVertexesCurSegment);
1212 rad = cone->radius();
1213 hei = cone->height();
1216 virtual void render( QGLContext* gw ) {
1218 GLUquadricObj *pObj;
1223 wMatrix matrix = wMatrix::yaw( PI_GRECO * 0.5 );
1225 matrix = matrix * cone->matrix();
1226 GLMultMatrix(&matrix[0][0]);
1229 pObj = gluNewQuadric();
1230 gluQuadricTexture(pObj,
true);
1231 gluCylinder(pObj, rad, 0, hei, 20, 2);
1234 gluQuadricOrientation(pObj, GLU_INSIDE);
1235 gluDisk(pObj, 0.0f, rad, 20, 1);
1237 gluDeleteQuadric(pObj);
1240 if (cone->localAxesDrawn()) {
1241 const float radius =
min(rad, hei) * 0.1;
1243 RenderWObjectContainer::drawArrow(
wVector(hei, 0.0, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::red);
1244 RenderWObjectContainer::drawArrow(
wVector(0.0, 2.0 * rad, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::green);
1245 RenderWObjectContainer::drawArrow(
wVector(0.0, 0.0, 2.0 * rad),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::blue);
1255 calculateAABB( minpoint, maxpoint, obj->matrix() );
1260 real tdx = fabs(tm.x_ax[0]*h2) + fabs(tm.y_ax[0]*rad) + fabs(tm.z_ax[0]*rad);
1261 real tdy = fabs(tm.x_ax[1]*h2) + fabs(tm.y_ax[1]*rad) + fabs(tm.z_ax[1]*rad);
1262 real tdz = fabs(tm.x_ax[2]*h2) + fabs(tm.y_ax[2]*rad) + fabs(tm.z_ax[2]*rad);
1264 minPoint = tm.w_pos - hds;
1265 maxPoint = tm.w_pos + hds;
1270 dimension[1] = rad*2.0;
1271 dimension[2] = rad*2.0;
1376 initRobjv( container );
1383 virtual void render( QGLContext* gw ) {
1386 wMatrix matrix = co->matrix();
1387 GLMultMatrix(&matrix[0][0]);
1393 if (co->localAxesDrawn()) {
1398 calculateOBB(dimension, minPoint, maxPoint);
1399 const float radius =
min(dimension.x,
min(dimension.y, dimension.z)) * 0.1;
1401 RenderWObjectContainer::drawArrow(
wVector(dimension.x, 0.0, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::red);
1402 RenderWObjectContainer::drawArrow(
wVector(0.0, dimension.y, 0.0),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::green);
1403 RenderWObjectContainer::drawArrow(
wVector(0.0, 0.0, dimension.z),
wVector(0.0, 0.0, 0.0), radius, 2.0 * radius, 2.0 * radius, Qt::blue);
1413 calculateAABB( minpoint, maxpoint, obj->matrix() );
1417 robjv[0]->calculateAABB( minPoint, maxPoint, robjv[0]->
object()->matrix()*tm );
1419 for(
int i=1; i<robjv.size(); i++ ) {
1420 robjv[i]->calculateAABB( minP, maxP, robjv[i]->
object()->matrix()*tm );
1421 mergeAABB( minPoint, maxPoint, minP, maxP );
1428 if ( robjv.size() == 0 ) {
1429 qWarning(
"== this point should never reached: renderwobjecthierarchy.cpp:435" );
1432 robjv[0]->calculateAABB( minPoint, maxPoint, robjv[0]->
object()->matrix() );
1433 for(
int i=1; i<robjv.size(); i++ ) {
1434 robjv[i]->calculateAABB( minP, maxP, robjv[i]->
object()->matrix() );
1435 mergeAABB( minPoint, maxPoint, minP, maxP );
1437 dimension[0] = fabs( maxPoint[0] - minPoint[0] );
1438 dimension[1] = fabs( maxPoint[1] - minPoint[1] );
1439 dimension[2] = fabs( maxPoint[2] - minPoint[2] );
1443 QVector<RenderWObject*> robjv;
1446 foreach(
WObject* obj, co->bodies() ) {
1447 robjv << RenderWObjectContainer::createRenderWObjectFor( obj, container );
1450 void mergeAABB( wVector& minPointA, wVector& maxPointA,
const wVector& minPointB,
const wVector& maxPointB ) {
1451 minPointA[0] =
min( minPointA[0], minPointB[0] );
1452 minPointA[1] =
min( minPointA[1], minPointB[1] );
1453 minPointA[2] =
min( minPointA[2], minPointB[2] );
1454 maxPointA[0] =
max( maxPointA[0], maxPointB[0] );
1455 maxPointA[1] =
max( maxPointA[1], maxPointB[1] );
1456 maxPointA[2] =
max( maxPointA[2], maxPointB[2] );
1467 m_graphicalWObject(dynamic_cast<GraphicalWObject*>(obj))
1475 virtual void render(QGLContext *gw)
1477 m_graphicalWObject->updateAndRender(
this, gw);
1482 m_graphicalWObject->updateAndRenderAABB(
this, gw);
1487 m_graphicalWObject->updateAndCalculateAABB(minPoint, maxPoint, tm);
1492 m_graphicalWObject->updateAndCalculateOBB(dimension, minPoint, maxPoint);
1499 bool RenderWObjectContainer::facInited =
false;
1500 QMap<QString, WAbstractCreator*>* RenderWObjectContainer::fac;
1501 void RenderWObjectContainer::initFactory() {
1502 if ( facInited )
return;
1504 fac =
new QMap<QString, WAbstractCreator*>();
1506 (*fac)[
"farsa::WMesh"] =
new WCreator<RenderWMesh>();
1507 (*fac)[
"farsa::PhyBox"] =
new WCreator<RenderPhyBox>();
1508 (*fac)[
"farsa::PhySphere"] =
new WCreator<RenderPhySphere>();
1509 (*fac)[
"farsa::PhyEllipsoid"] =
new WCreator<RenderPhyEllipsoid>();
1510 (*fac)[
"farsa::PhyCylinder"] =
new WCreator<RenderPhyCylinder>();
1511 (*fac)[
"farsa::PhyCone"] =
new WCreator<RenderPhyCone>();
1513 (*fac)[
"farsa::PhyCompoundObject"] =
new WCreator<RenderCompoundObject>();
1514 (*fac)[
"farsa::GraphicalWObject"] =
new WCreator<GraphicalWObjectRenderer>();
1517 (*fac)[
"farsa::WObject"] =
new WCreator<RenderGenericObject>();
1518 (*fac)[
"farsa::WorldController"] =
new WCreator<RenderGenericObject>();