Teapot 3D model data moved to app resources

* GLTeapot 3D model data moved from the text file "teapot.data" into
  Application resources;
* Fixes #4934 and completes GCI 2011 task made by Aleksas Pantechovskis.
  Thanks for contribution!!!

Signed-off-by: Siarzhuk Zharski <[email protected]>
This commit is contained in:
Aleksas Pantechovskis
2011-12-05 22:35:20 +01:00
committed by Siarzhuk Zharski
parent a2ef4fa88a
commit 1bc51c2392
4 changed files with 2531 additions and 58 deletions
+66 -40
View File
@@ -16,12 +16,17 @@
This file may be used under the terms of the Be Sample Code License. This file may be used under the terms of the Be Sample Code License.
*/ */
#include "GLObject.h" #include "GLObject.h"
#include <Application.h>
#include <GL/gl.h> #include <GL/gl.h>
#include <stdlib.h>
#include <InterfaceKit.h> #include <InterfaceKit.h>
#include <Resources.h>
#include "glob.h" #include "glob.h"
struct material { struct material {
float ambient[3], diffuse[3], specular[3]; float ambient[3], diffuse[3], specular[3];
}; };
@@ -141,6 +146,7 @@ GLObject::MenuInvoked(BPoint point)
setEvent(fObjView->drawEvent); setEvent(fObjView->drawEvent);
} }
int int
GLObject::Solidity() const GLObject::Solidity() const
{ {
@@ -148,6 +154,7 @@ GLObject::Solidity() const
} }
bool bool
GLObject::SpinIt() GLObject::SpinIt()
{ {
@@ -200,55 +207,67 @@ GLObject::Draw(bool forID, float IDcolor[])
} }
TriangleObject::TriangleObject(ObjectView* ov, char* filename) TriangleObject::TriangleObject(ObjectView* ov)
: GLObject(ov), :
fPoints(100,100), GLObject(ov),
fTriangles(100,100), fStatus(B_NO_INIT),
fQs(50,50) fPoints(100, 100),
fTriangles(100, 100),
fQs(50, 50)
{ {
BResources *res = BApplication::AppResources();
if (res == NULL)
return;
size_t size = 0;
int32 *arrayOfPoints
= (int32*)res->LoadResource(B_RAW_TYPE, "points", &size);
if (arrayOfPoints == NULL)
return;
float maxp = 0; float maxp = 0;
int numPt,numTri; size_t numPt = size / sizeof(int32);
for (size_t i = 0; i < numPt; i += 6) {
FILE* f = fopen(filename,"r");
fscanf(f,"%d",&numPt);
// printf("Points: %d\n",numPt);
for (int i = 0; i < numPt; i++) {
point p; point p;
fscanf(f,"%f %f %f %f %f %f", p.x = 1e-6 * arrayOfPoints[i];
&p.x, p.y = 1e-6 * arrayOfPoints[i + 1];
&p.y, p.z = 1e-6 * arrayOfPoints[i + 2];
&p.z, p.nx = 1e-6 * arrayOfPoints[i + 3];
&p.nx, p.ny = 1e-6 * arrayOfPoints[i + 4];
&p.ny, p.nz = 1e-6 * arrayOfPoints[i + 5];
&p.nz);
if (fabs(p.x) > maxp) if (fabs(p.x) > maxp)
maxp = fabs(p.x); maxp = fabs(p.x);
if (fabs(p.y) > maxp) if (fabs(p.y) > maxp)
maxp = fabs(p.y); maxp = fabs(p.y);
if (fabs(p.z) > maxp) if (fabs(p.z) > maxp)
maxp = fabs(p.z); maxp = fabs(p.z);
fPoints.add(p); fPoints.add(p);
} }
for (int i = 0; i < fPoints.num_items; i++) { for (int i = 0; i < fPoints.num_items; i++) {
fPoints[i].x /= maxp; fPoints[i].x /= maxp;
fPoints[i].y /= maxp; fPoints[i].y /= maxp;
fPoints[i].z /= maxp; fPoints[i].z /= maxp;
} }
fscanf(f,"%d",&numTri); int32 *arrayOfTriangles
// printf("Triangles: %d\n",numTri); = (int32*)res->LoadResource(B_RAW_TYPE, "triangles", &size);
int tpts = 0; if (arrayOfTriangles == NULL)
for (int i = 0; i < numTri; i++) { return;
size_t numTriPoints = size / sizeof(int32);
for (size_t i = 0; i < numTriPoints; i += 3) {
tri t; tri t;
fscanf(f,"%d %d %d", t.p1 = arrayOfTriangles[i];
&t.p1, t.p2 = arrayOfTriangles[i + 1];
&t.p2, t.p3 = arrayOfTriangles[i + 2];
&t.p3);
fTriangles.add(t); fTriangles.add(t);
tpts += 3;
} }
size_t numTri = numTriPoints / 3;
int qpts = 4; int qpts = 4;
int qp[1024]; int qp[1024];
quadStrip q; quadStrip q;
@@ -259,37 +278,37 @@ TriangleObject::TriangleObject(ObjectView* ov, char* filename)
q.pts[1] = fTriangles[0].p3; q.pts[1] = fTriangles[0].p3;
q.pts[3] = fTriangles[1].p3; q.pts[3] = fTriangles[1].p3;
for (int i = 2; i < numTri; i += 2) { for (size_t i = 2; i < numTri; i += 2) {
if ((fTriangles[i-1].p1 == fTriangles[i].p2) && if ((fTriangles[i - 1].p1 == fTriangles[i].p2) &&
(fTriangles[i-1].p3 == fTriangles[i].p3)) { (fTriangles[i - 1].p3 == fTriangles[i].p3)) {
q.pts[q.numpts++] = fTriangles[i+1].p1; q.pts[q.numpts++] = fTriangles[i + 1].p1;
q.pts[q.numpts++] = fTriangles[i+1].p3; q.pts[q.numpts++] = fTriangles[i + 1].p3;
qpts+=2; qpts+=2;
} else { } else {
int *np = (int*)malloc(sizeof(int)*q.numpts); int *np = (int*)malloc(sizeof(int)*q.numpts);
memcpy(np,qp,q.numpts*sizeof(int)); memcpy(np, qp, q.numpts * sizeof(int));
quadStrip nqs; quadStrip nqs;
nqs.numpts = q.numpts; nqs.numpts = q.numpts;
nqs.pts = np; nqs.pts = np;
fQs.add(nqs); fQs.add(nqs);
qpts += 4; qpts += 4;
q.numpts = 4; q.numpts = 4;
q.pts[2] = fTriangles[i].p1; q.pts[2] = fTriangles[i].p1;
q.pts[0] = fTriangles[i].p2; q.pts[0] = fTriangles[i].p2;
q.pts[1] = fTriangles[i].p3; q.pts[1] = fTriangles[i].p3;
q.pts[3] = fTriangles[i+1].p3; q.pts[3] = fTriangles[i + 1].p3;
} }
} }
int* np = (int*)malloc(sizeof(int)*q.numpts); int* np = (int*)malloc(sizeof(int)*q.numpts);
memcpy(np,qp,q.numpts*sizeof(int)); memcpy(np, qp, q.numpts * sizeof(int));
quadStrip nqs; quadStrip nqs;
nqs.numpts = q.numpts; nqs.numpts = q.numpts;
nqs.pts = np; nqs.pts = np;
fQs.add(nqs); fQs.add(nqs);
fclose(f); fStatus = B_OK;
} }
@@ -301,6 +320,13 @@ TriangleObject::~TriangleObject()
} }
status_t
TriangleObject::InitCheck() const
{
return fStatus;
}
void void
TriangleObject::DoDrawing(bool forID) TriangleObject::DoDrawing(bool forID)
{ {
+5 -3
View File
@@ -50,7 +50,7 @@ class GLObject {
void RotateWorldSpace(float rx, float ry); void RotateWorldSpace(float rx, float ry);
virtual void MenuInvoked(BPoint point); virtual void MenuInvoked(BPoint point);
virtual void DoDrawing(bool forID) {}; virtual void DoDrawing(bool forID) {};
int Solidity() const; int Solidity() const;
float x, y, z; float x, y, z;
Quaternion fRotation; Quaternion fRotation;
@@ -68,11 +68,13 @@ class GLObject {
class TriangleObject : public GLObject { class TriangleObject : public GLObject {
public: public:
TriangleObject(ObjectView* ov, char* filename); TriangleObject(ObjectView* ov);
virtual ~TriangleObject(); virtual ~TriangleObject();
status_t InitCheck() const;
virtual void DoDrawing(bool forID); virtual void DoDrawing(bool forID);
private: private:
status_t fStatus;
BufferArray<point> fPoints; BufferArray<point> fPoints;
BufferArray<tri> fTriangles; BufferArray<tri> fTriangles;
BufferArray<quadStrip> fQs; BufferArray<quadStrip> fQs;
File diff suppressed because it is too large Load Diff
+34 -15
View File
@@ -18,9 +18,8 @@
#include "ObjectView.h" #include "ObjectView.h"
#include <stdio.h> #include <Application.h>
#include <stdlib.h> #include <Catalog.h>
#include <Cursor.h> #include <Cursor.h>
#include <InterfaceKit.h> #include <InterfaceKit.h>
#include <FindDirectory.h> #include <FindDirectory.h>
@@ -29,8 +28,8 @@
#include "GLObject.h" #include "GLObject.h"
#include "ResScroll.h" #include "ResScroll.h"
#define teapotData "teapot.data" #undef B_TRANSLATE_CONTEXT
char teapotPath[PATH_MAX]; #define B_TRANSLATE_CONTEXT "ObjectView"
float displayScale = 1.0; float displayScale = 1.0;
float depthOfView = 30.0; float depthOfView = 30.0;
@@ -50,6 +49,9 @@ float red[3] = {1.0, 0.0, 0.0};
float* bgColor = black; float* bgColor = black;
const char *kNoResourceError = B_TRANSLATE("The Teapot 3D model was "
"not found in application resources. "
"Please repair the program installation.");
struct light { struct light {
float *ambient; float *ambient;
@@ -166,12 +168,18 @@ ObjectView::ObjectView(BRect rect, const char *name, ulong resizingMode,
quittingSem = create_sem(1, "quitting sem"); quittingSem = create_sem(1, "quitting sem");
drawEvent = create_sem(0, "draw event"); drawEvent = create_sem(0, "draw event");
char findDir[PATH_MAX]; TriangleObject *Tri = new TriangleObject(this);
find_directory(B_SYSTEM_DATA_DIRECTORY, -1, true, findDir, PATH_MAX); if (Tri->InitCheck() == B_OK) {
sprintf(teapotPath, "%s/%s", findDir, teapotData); fObjListLock.Lock();
fObjListLock.Lock(); fObjects.AddItem(Tri);
fObjects.AddItem(new TriangleObject(this, teapotPath)); fObjListLock.Unlock();
fObjListLock.Unlock(); } else {
BAlert *NoResourceAlert = new BAlert(B_TRANSLATE("Error"),
kNoResourceError, B_TRANSLATE("OK"), NULL, NULL,
B_WIDTH_AS_USUAL, B_OFFSET_SPACING, B_STOP_ALERT);
NoResourceAlert->Go();
delete Tri;
}
} }
@@ -304,12 +312,23 @@ ObjectView::MessageReceived(BMessage* msg)
fForceRedraw = true; fForceRedraw = true;
setEvent(drawEvent); setEvent(drawEvent);
break; break;
case kMsgAddModel: case kMsgAddModel:
fObjListLock.Lock(); {
fObjects.AddItem(new TriangleObject(this, teapotPath)); TriangleObject *Tri = new TriangleObject(this);
fObjListLock.Unlock(); if (Tri->InitCheck() == B_OK) {
fObjListLock.Lock();
fObjects.AddItem(Tri);
fObjListLock.Unlock();
} else {
BAlert *NoResourceAlert = new BAlert(B_TRANSLATE("Error"),
kNoResourceError, B_TRANSLATE("OK"), NULL, NULL,
B_WIDTH_AS_USUAL, B_OFFSET_SPACING, B_STOP_ALERT);
NoResourceAlert->Go();
delete Tri;
}
setEvent(drawEvent); setEvent(drawEvent);
break; break;
}
case kMsgLights: case kMsgLights:
{ {
msg->FindPointer("source", reinterpret_cast<void**>(&item)); msg->FindPointer("source", reinterpret_cast<void**>(&item));