|
Dear All,
I am a starter in OpenGL and SharpGL. I am using C# and SharpGL. However, I do not know how to write glutSwapBuffers() in OpenGL to SharpGL format.
Thanks in advance.
|
|
|
|
|
I am using SharpGL to add a solid object to a scene by clicking a button.
private void InitElements(Scene scene)
{
var objectRoot = new SharpGL.SceneGraph.Primitives.Folder() { Name = "Root" };
scene.SceneContainer.AddChild(objectRoot);
// This implements free rotation(with translation and rotation).
var camera = GetCamera();
float cmX = camera.Position.X; float cmY = camera.Position.Y; float cmZ = camera.Position.Z;
float tgX = camera.Target.X; float tgY = camera.Target.Y; float tgZ = camera.Target.Z;
float upX = camera.UpVector.X; float upY = camera.UpVector.Y; float upZ = camera.UpVector.Z;
objectArcBallEffect = new ArcBallEffect(cmX, cmY, cmZ, tgX, tgY, tgZ, upX, upY, upZ);
objectRoot.AddEffect(objectArcBallEffect);
var axisRoot = new SharpGL.SceneGraph.Primitives.Folder() { Name = "axis root" };
scene.SceneContainer.AddChild(axisRoot);
axisArcBallEffect = new ArcBallEffect(cmX, cmY, cmZ, tgX, tgY, tgZ, upX, upY, upZ);
axisRoot.AddEffect(axisArcBallEffect);
InitLight(objectRoot);
InitAxis(objectRoot);
InitAxis(axisRoot);
InitFrameElement(6, 24, 7, objectRoot);
}
After I initiate the solid elements in scene, I would like to add a solid object to that scene by clicking a button. I successfully add it in scene. But I cannot drag and rotate it with the initial elements in the scene. It means I didn't successfully add it to the same scene. Thanks in advance.
private void btnAddEllement_Click(object sender, EventArgs e)
{
var objectRoot = new SharpGL.SceneGraph.Primitives.Folder() { Name = "Root" };
var scene = this.sceneControl1.Scene;
addCylinder(objectRoot, 50, 30, 100, 5);
scene.SceneContainer.AddChild(objectRoot);
}
|
|
|
|
|
|
Hi,
When I printed a text on screen, I saw the text height equal to "tmHeight- tmInternalLeading".
For example: I printed a text size "8" on screen, I got the actual text height "tmHeight - tmInternalLeading" which is less than "8".
I printed a letter of "H" which height is less than "8", when I used "Arial" true type font of size "8".
Is there a way to make a actual text height (on screen) (ascent) equal to "8"?
Best,
-- modified 12-Jun-14 15:38pm.
|
|
|
|
|
8 points, 8 pixel, 8em? And where?
transoft wrote: Is there a way to make a actual text height (on screen) (ascent) equal to "8"? Yes, by setting the font-size. Do keep in mind that different characters have different heights', unless you're using a monospace font like courier.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Thanks for reply.
Maybe I did not make clear.
I set font size to be 8 unit which should be printed on screen to be (suppose) 100. But I got 90 (letter height) which equals to ascent.
It looks like font size is defined to be equal to "ascent + InternalLeading".
My question is: Is there a way to let (letter height) to be "ascent + InternalLeading".
|
|
|
|
|
transoft wrote: Maybe I did not make clear.
True. Which "unit"? A pixel can be a unit, a centimeter can be one.
Printed on screen? On a form as a label? Drawed as a bitmap?
transoft wrote: It looks like font size is defined to be equal to "ascent + InternalLeading". Where did you get that information? The font size is usually set by specifying the size property, as shown here[^]. Can you post some code that explains what you're doing?
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
The information -- is correct. There is internal leading (rhymes with sledding) and external leading. They are there to pad the character within its space and to provide space between lines for things like ascenders and descenders, which exceed the character's space.
|
|
|
|
|
I am using C++ and GDI+. I am drawing 2D diagrams. I am using the standard lines, ellipse, rotation transformations and Fonts. I need to scale the print so the screen image fills a single page. I need to avoid pixilation, the print should retain the curved lines and curves in the font. The GDI+ print tutorials I am finding are very basic. Can someone point me to a GDI+ printing tutorial that shows this type of scaled printing.
Thanks
Larry
|
|
|
|
|
|
I have been surprised how difficult it is to print a GDI+ screen as a rescaled fit-to-page. I will go back to google but I have not yet found any c++ code to do this.
|
|
|
|
|
|
Member 10853121 wrote: I need to avoid pixilation, the print should retain the curved lines and curves in the font. If you scale/zoom, then you will have pixelation. You could throw in a smoothing-effect, but that would simply blur them pixels.
If you don't want pixelation, draw the image again. Adjust coordinates to match the desired size.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|
|
Hi friends,
I am working on a biomedical application. I need to import a 3D model
of heart and displaying it after rotation. I use C# and the model is
stored in a 3ds file (I have an obj file,too). I don't need high
performance, engines. I just need the simplest engine for rotating and
displaying this model.
I was wondering if you could help me.
I am looking forward to hearing from you,
|
|
|
|
|
Please don't cross post. You have posted this in the C# forum as well.
|
|
|
|
|
|
Greetings!
I have a camera attached on my windows-pc (win7) and view the camera output in a window from the camera software (RsCap_1.11.exe).
Now I try to capture this window with BitBlt and GetDIBits, however I get a black screen only.
This method works with the full desktop or other windows.
Any hints how I have to access the video window?
|
|
|
|
|
|
iirc -- you want SetDIBitsToDevice and not BitBlt. You are using a Device Independent Bitmap and those do not automatically translate to Device Dependent Bitmaps.
|
|
|
|
|
Hi,
I am vb.net Developer and I am new in Directshow and C++.
Issue is:
I need to change a video file(change in bytes of file with hashing or ....)to be playable only with my own software.As if it was copied by someone not playable.
so I need to write player for turn back file to original format in playing time,as I know I must do it via direct show and Async File source Filter please Help me and tell me the solution.
Best Regards
|
|
|
|
|
I am trying to use OpenGL to display the result of my rendering engine but I get a blank screen with no display. Below is my main c++ file with OpenGL calls and the file with the rendering engine. Please what am I doing wrongly
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <GL/glew.h>
#include <GL/glut.h>
#include "common.h"
#include "raytracer.h"
#include "scene.h"
#include "surface.h"
#include "cilk.h"
#include "cilkview.h"
#include <cstdio>
#include <cassert>
#include <vector>
#define SCRWIDTH 800
#define SCRHEIGHT 600
GLuint texture = 0;
Raytracer::Surface* surface = 0;
Pixel* buffer = 0;
Raytracer::Engine* tracer = 0;
void start(){
surface = new Raytracer::Surface( SCRWIDTH, SCRHEIGHT );
buffer = surface->GetBuffer();
surface->Clear( 0 );
surface->InitCharset();
surface->Print( "timings:", 2, 2, 0xffffffff );
tracer = new Raytracer::Engine();
tracer->GetScene()->InitScene();
tracer->SetTarget( surface->GetBuffer(), SCRWIDTH, SCRHEIGHT );
int tpos = 60;
FILE *outFile;
outFile = fopen("RayTracing.out","a");
if (!outFile){
printf("Cannot open output file");
exit(1);
}
fprintf (outFile, "Tracing Depth : %d\n", TRACEDEPTH);
while (1)
{
int fstart = GetTickCount();
tracer->InitRender();
while (!tracer->Render()) glutSwapBuffers();
int ftime = GetTickCount() - fstart;
char t[] = "00:00.000";
t[6] = (ftime / 100) % 10 + '0';
t[7] = (ftime / 10) % 10 + '0';
t[8] = (ftime % 10) + '0';
int secs = (ftime / 1000) % 60;
int mins = (ftime / 60000) % 100;
t[3] = ((secs / 10) % 10) + '0';
t[4] = (secs % 10) + '0';
t[1] = (mins % 10) + '0';
t[0] = ((mins / 10) % 10) + '0';
float par_time = ftime / 1000.f;
fprintf (outFile, "%.3f\n", par_time);
fflush (stdout);
surface->Print( t, tpos, 2, 0xffffffff );
tpos += 100;
}
}
void render(void) {
start();
glClear(GL_COLOR_BUFFER_BIT);
glRasterPos2i(0, 0);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, texture);
glDrawPixels(SCRWIDTH, SCRHEIGHT, GL_RGBA, GL_UNSIGNED_BYTE, 0);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
glutSwapBuffers();
glutPostRedisplay();
}
void reshape(int x, int y) {
glViewport(0, 0, x, y);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0, 1.0, 0.0, 1.0, 0.0, 1.0);
}
void appInit(int w, int h) {
glGenBuffersARB(1, &texture);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, texture);
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, w * h * sizeof(GLubyte) * 4, 0, GL_STREAM_DRAW_ARB);
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0);
}
void idle() { glutPostRedisplay(); }
void cleanup(){
glDeleteBuffersARB(1, &texture);
}
int main(int argc, char **argv) {
atexit(cleanup);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
glutInitWindowPosition(100, 100);
glutInitWindowSize(SCRWIDTH, SCRHEIGHT);
glutCreateWindow("Cilk Plus raytracer");
glewInit();
appInit(SCRWIDTH, SCRHEIGHT);
glutDisplayFunc(render);
glutIdleFunc(idle);
glutReshapeFunc(reshape);
glutMainLoop();
return 0;
}
raytrace.cpp
#include "raytracer.h"
#include "scene.h"
#include "common.h"
#include "windows.h"
#include "winbase.h"
#include "cilk.h"
namespace Raytracer {
Ray::Ray( vector3& a_Origin, vector3& a_Dir ) :
m_Origin( a_Origin ),
m_Direction( a_Dir )
{
}
Engine::Engine()
{
m_Scene = new Scene();
}
Engine::~Engine()
{
delete m_Scene;
}
void Engine::SetTarget( Pixel* a_Dest, int a_Width, int a_Height )
{
m_Dest = a_Dest;
m_Width = a_Width;
m_Height = a_Height;
}
Primitive* Engine::Raytrace( Ray& a_Ray, Color& a_Acc, int a_Depth, float a_RIndex, float& a_Dist )
{
if (a_Depth > TRACEDEPTH) return 0;
a_Dist = 1000000.0f;
vector3 pi;
Primitive* prim = 0;
int result;
for ( int s = 0; s < m_Scene->GetNrPrimitives(); s++ )
{
Primitive* pr = m_Scene->GetPrimitive( s );
int res;
if (res = pr->Intersect( a_Ray, a_Dist ))
{
prim = pr;
result = res; }
}
if (!prim) return 0;
if (prim) {
if (prim->IsLight())
{
a_Acc =Color( 1.0f, 1.0f, 1.0f );
}
else
{
pi = a_Ray.GetOrigin() + a_Ray.GetDirection() * a_Dist;
for ( int l = 0; l < m_Scene->GetNrPrimitives(); l++ )
{
Primitive* p = m_Scene->GetPrimitive( l );
if (p->IsLight())
{
Primitive* light = p;
float shade = 1.0f;
if (light->GetType() == Primitive::SPHERE)
{
vector3 L = ((Sphere*)light)->GetCentre() - pi;
float tdist = LENGTH( L );
NORMALIZE(L);
vector3 TempVector3(pi + L * EPSILON);
Ray r = Ray( TempVector3, L );
for ( int s = 0; s < m_Scene->GetNrPrimitives(); s++ )
{
Primitive* pr = m_Scene->GetPrimitive( s );
if ((pr != light) && (pr->Intersect( r, tdist )))
{
shade = 0;
break;
}
}
}
if (shade > 0)
{
vector3 L = ((Sphere*)light)->GetCentre() - pi;
NORMALIZE( L );
vector3 N = prim->GetNormal( pi );
if (prim->GetMaterial()->GetDiffuse() > 0)
{
float dot = DOT( L, N );
if (dot > 0)
{
float diff = dot * prim->GetMaterial()->GetDiffuse() * shade;
Color ncol = diff * prim->GetMaterial()->GetColor();
if (ncol.r > 1.0f || ncol.g > 1.0f || ncol.b > 1.0f)
{
float max = 1.0f;
if (ncol.r > max) max = ncol.r;
if (ncol.g > max) max = ncol.g;
if (ncol.b > max) max = ncol.b;
ncol *= 1.0f/max;
}
a_Acc += ncol;
}
}
if (prim->GetMaterial()->GetSpecular() > 0)
{
vector3 V = a_Ray.GetDirection();
vector3 R = L - 2.0f * DOT( L, N ) * N;
float dot = DOT( V, R );
if (dot > 0)
{
float spec = powf( dot, 20 ) * prim->GetMaterial()->GetSpecular() * shade;
Color ncol = spec * light->GetMaterial()->GetColor();
if (ncol.r > 1.0f) ncol.r = 1.0f; else if (ncol.r < 0.0f) ncol.r = 0.0f;
if (ncol.g > 1.0f) ncol.g = 1.0f; else if (ncol.g < 0.0f) ncol.g = 0.0f;
if (ncol.b > 1.0f) ncol.b = 1.0f; else if (ncol.b < 0.0f) ncol.b = 0.0f;
a_Acc += ncol;
}
}
}
}
}
if (a_Acc.r > 1.0f || a_Acc.g > 1.0f || a_Acc.b > 1.0f)
{
float max = 1.0f;
if (a_Acc.r > max) max = a_Acc.r;
if (a_Acc.g > max) max = a_Acc.g;
if (a_Acc.b > max) max = a_Acc.b;
a_Acc *= 1.0f/max;
}
float refl = prim->GetMaterial()->GetReflection();
if ((refl > 0.0f) && (a_Depth < TRACEDEPTH))
{
vector3 N = prim->GetNormal( pi );
vector3 R = a_Ray.GetDirection() - 2.0f * DOT( a_Ray.GetDirection(), N ) * N;
Color rcol( 0.0f, 0.0f, 0.0f );
float dist;
vector3 TempVector3(pi + R * EPSILON);
Ray TempRay(TempVector3, R);
Raytrace( TempRay, rcol, a_Depth + 1, a_RIndex, dist );
a_Acc += refl * rcol;
}
}
}
else {
}
return prim;
}
void Engine::InitRender()
{
m_CurrLine = 20;
m_PPos = 20 * m_Width;
m_WX1 = -4, m_WX2 = 4, m_WY1 = m_SY = 3, m_WY2 = -3;
m_DX = (m_WX2 - m_WX1) / m_Width;
m_DY = (m_WY2 - m_WY1) / m_Height;
m_SY += 20 * m_DY;
m_LastRow = new Primitive*[m_Width];
memset( m_LastRow, 0, m_Width * 4 );
m_RayMissesCount = 0;
m_RayIntersectionsCount = 0;
}
void Engine::PreRender() {
m_spheres.clear();
m_planes.clear();
Sphere* tempSphere;
PlanePrim* tempPlane;
int sphereCount;
int planesCount;
Primitive* prim;
for (int i = 0; i < m_Scene->GetNrPrimitives(); i++) {
prim = m_Scene->GetPrimitive(i);
tempSphere = dynamic_cast<Sphere*> (prim);
if (dynamic_cast<Sphere*> (prim) != 0){
m_spheres.push_back(tempSphere);
}
tempPlane = dynamic_cast<PlanePrim*> (prim);
if (dynamic_cast<PlanePrim*> (prim) != 0)
m_planes.push_back(tempPlane);
}
m_sphereDataStructCpp = new SphereDataStructCpp(m_spheres.size());
for (int i = 0; i < m_spheres.size(); i++) {
tempSphere = m_spheres[i];
m_sphereDataStructCpp->centerX[i] = tempSphere->GetCentre().x;
m_sphereDataStructCpp->centerY[i] = tempSphere->GetCentre().y;
m_sphereDataStructCpp->centerZ[i] = tempSphere->GetCentre().z;
m_sphereDataStructCpp->recRadius[i] = tempSphere->GetRecRadius();
m_sphereDataStructCpp->sqRadius[i] = tempSphere->GetSqRadius();
m_sphereDataStructCpp->diffuse[i] = tempSphere->GetMaterial()->GetDiffuse();
m_sphereDataStructCpp->specular[i] = tempSphere->GetMaterial()->GetSpecular();
m_sphereDataStructCpp->reflection[i] = tempSphere->GetMaterial()->GetReflection();
m_sphereDataStructCpp->refraction[i] = tempSphere->GetMaterial()->GetRefraction();
m_sphereDataStructCpp->refrIndex[i] = tempSphere->GetMaterial()->GetRefrIndex();
m_sphereDataStructCpp->red[i] = tempSphere->GetMaterial()->GetColor().r;
m_sphereDataStructCpp->green[i] = tempSphere->GetMaterial()->GetColor().g;
m_sphereDataStructCpp->blue[i] = tempSphere->GetMaterial()->GetColor().b;
m_sphereDataStructCpp->isLight[i] = tempSphere->IsLight();
}
m_planeDataStructCpp = new PlaneDataStructCpp(m_planes.size());
for (int i = 0; i < m_planes.size(); i++) {
tempPlane = m_planes[i];
m_planeDataStructCpp->normalX[i] = tempPlane->GetNormal().x;
m_planeDataStructCpp->normalY[i] = tempPlane->GetNormal().y;
m_planeDataStructCpp->normalZ[i] = tempPlane->GetNormal().z;
m_planeDataStructCpp->d[i] = tempPlane->GetD();
m_planeDataStructCpp->diffuse[i] = tempPlane->GetMaterial()->GetDiffuse();
m_planeDataStructCpp->specular[i] = tempPlane->GetMaterial()->GetSpecular();
m_planeDataStructCpp->reflection[i] = tempPlane->GetMaterial()->GetReflection();
m_planeDataStructCpp->refraction[i] = tempPlane->GetMaterial()->GetRefraction();
m_planeDataStructCpp->refrIndex[i] = tempPlane->GetMaterial()->GetRefrIndex();
m_planeDataStructCpp->red[i] = tempPlane->GetMaterial()->GetColor().r;
m_planeDataStructCpp->green[i] = tempPlane->GetMaterial()->GetColor().g;
m_planeDataStructCpp->blue[i] = tempPlane->GetMaterial()->GetColor().b;
m_planeDataStructCpp->isLight[i] = tempPlane->IsLight();
}
m_RayMissesCount = 0;
m_RayIntersectionsCount = 0;
m_statisticsDataStructCpp = new StatisticsDataStructCpp((size_t)m_CohortPSize);
}
bool Engine::Render()
{
vector3 o( 0, 0, -5 );
int msecs = GetTickCount();
Primitive* lastprim = 0;
for ( int y = m_CurrLine; y < (m_Height - 20); y++ )
{
m_SX = m_WX1;
for ( int x = 0; x < m_Width; x++ )
{
Color acc( 0, 0, 0 );
vector3 dir = vector3( m_SX, m_SY, 0 ) - o;
NORMALIZE( dir );
Ray r( o, dir );
float dist;
Primitive* prim = Raytrace( r, acc, 1, 1.0f, dist );
int red = (int)(acc.r * 256);
int green = (int)(acc.g * 256);
int blue = (int)(acc.b * 256);
if (red > 255) red = 255;
if (green > 255) green = 255;
if (blue > 255) blue = 255;
m_Dest[m_PPos++] = (red << 16) + (green << 8) + blue;
m_SX += m_DX;
}
m_SY += m_DY;
if ((GetTickCount() - msecs) > 100)
{
m_CurrLine = y + 1;
return false;
}
}
return true;
}
};
|
|
|
|
|
I understand the need to convert RGB to gray scale for further processing.
If I am after edge detection should I convert all colors equally - 1/3 of value or should I adjust the colors so it looks natural?
Thanks for reading
Cheers
Vaclav
|
|
|
|
|
The recommended way is to convert RGB to YUV then use the Y channel for gray scale.
Y = 0.299 * R + 0.587 * G + 0.114 * B
Cheers,
Peter
Software rusts. Simon Stephenson, ca 1994. So does this signature. me, 2012
|
|
|
|
|
I have a working DirectShow graph using "still" pin on video source filter.
I have set both hardware and software triggering. So far using only the hardware trigger.
It works but I have to push the camera button twice to get the snap shot.
It takes only onle push in control panel wizard to snap a picture.
Any suggestion what is missing / wrong in my code?
I run both preview and capture via smart T filter - so I got three video rendered when it all runs.
Cheers Vaclav
|
|
|
|
|
Hello
I would like display non English text on GLUI control such as button anf listbox
in the run, the controls show empty without any text.
while the program work well if I write English text on button
|
|
|
|
|