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
+53 -27
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,33 +207,42 @@ GLObject::Draw(bool forID, float IDcolor[])
} }
TriangleObject::TriangleObject(ObjectView* ov, char* filename) TriangleObject::TriangleObject(ObjectView* ov)
: GLObject(ov), :
GLObject(ov),
fStatus(B_NO_INIT),
fPoints(100, 100), fPoints(100, 100),
fTriangles(100, 100), fTriangles(100, 100),
fQs(50, 50) fQs(50, 50)
{ {
float maxp = 0; BResources *res = BApplication::AppResources();
int numPt,numTri; if (res == NULL)
return;
FILE* f = fopen(filename,"r"); size_t size = 0;
fscanf(f,"%d",&numPt); int32 *arrayOfPoints
// printf("Points: %d\n",numPt); = (int32*)res->LoadResource(B_RAW_TYPE, "points", &size);
for (int i = 0; i < numPt; i++) { if (arrayOfPoints == NULL)
return;
float maxp = 0;
size_t numPt = size / sizeof(int32);
for (size_t i = 0; i < numPt; i += 6) {
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);
} }
@@ -236,19 +252,22 @@ TriangleObject::TriangleObject(ObjectView* ov, char* filename)
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,7 +278,7 @@ 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;
@@ -289,7 +308,7 @@ TriangleObject::TriangleObject(ObjectView* ov, char* filename)
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)
{ {
+3 -1
View File
@@ -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
+29 -10
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(new TriangleObject(this, teapotPath)); fObjects.AddItem(Tri);
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;
}
} }
@@ -305,11 +313,22 @@ ObjectView::MessageReceived(BMessage* msg)
setEvent(drawEvent); setEvent(drawEvent);
break; break;
case kMsgAddModel: case kMsgAddModel:
{
TriangleObject *Tri = new TriangleObject(this);
if (Tri->InitCheck() == B_OK) {
fObjListLock.Lock(); fObjListLock.Lock();
fObjects.AddItem(new TriangleObject(this, teapotPath)); fObjects.AddItem(Tri);
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;
}
setEvent(drawEvent); setEvent(drawEvent);
break; break;
}
case kMsgLights: case kMsgLights:
{ {
msg->FindPointer("source", reinterpret_cast<void**>(&item)); msg->FindPointer("source", reinterpret_cast<void**>(&item));