ScarPunk Posted July 11, 2018 Share Posted July 11, 2018 Hello every one. Today i am working on raycast, and a wanted to draw key value of an entity, but unfortunately it's doesn't draw text ;( Here is a screenshot of the render: As you can see i am drawing first fps (who works) then draw the line and to finish draw keyvalue of the hit box (Fail) Here is my code: bool App::Loop() { //quit ? if (window->Closed() or window->KeyHit(Key::Escape))return false; Red->Move(); Green->Move(); Blue->Move(); world->Update(); if (window->KeyDown(Key::Right)) { camera->SetRotation(Vec3(camera->GetRotation().x, camera->GetRotation().y + 4, camera->GetRotation().z)); } //REFRESH STUFF Time::Update(); context->SetColor(0, 0, 0, 0); context->Clear(); world->Render(); //DRAW FPS context->SetBlendMode(Blend::Alpha); context->SetColor(255, 0, 0, 1); context->DrawText("FPS : " + String(Time::UPS()), 10, 20); //DRAW LINE context->SetBlendMode(Blend::Solid); context->SetColor((world->Pick(rayCastFirst, rayCastEnd, pickInfo) ? (rayCastColorOn) : (rayCastColorOff))); context->DrawLine(camera->Project(rayCastFirst).x, camera->Project(rayCastFirst).y, camera->Project(rayCastEnd).x, camera->Project(rayCastEnd).y); //set sphere to hit hitSphere->SetPosition((world->Pick(rayCastFirst, rayCastEnd, pickInfo,0,true)) ? (pickInfo.position) : (rayCastFirst) ); //if hit DRAW KEY VALUE if (world->Pick(rayCastFirst, rayCastEnd, pickInfo, 0, true)) { //fail context->SetColor(1, 1, 1, 1); context->SetBlendMode(Blend::Alpha); context->DrawText(pickInfo.entity->GetKeyValue("Color"), 20, 40); } context->Sync(true); return true; } Any reply will be appreciate ? Quote ART CODE SOUND Link to comment Share on other sites More sharing options...
SpiderPig Posted July 11, 2018 Share Posted July 11, 2018 Try printing some other text first, that will tell you if the world->pick has succeeded. And maybe the entity doesn't have keyvalue named Color? 1 Quote Link to comment Share on other sites More sharing options...
ScarPunk Posted July 11, 2018 Author Share Posted July 11, 2018 1 hour ago, SpiderPig said: Try printing some other text first, that will tell you if the world->pick has succeeded. And maybe the entity doesn't have keyvalue named Color? I put the DrawText(Keyvalue) before drawing the line, it's work but i don't know why it's doesn't works after drawing a line ?♂️ Quote ART CODE SOUND Link to comment Share on other sites More sharing options...
AggrorJorn Posted July 11, 2018 Share Posted July 11, 2018 Try setting the same color as when drawing the FPS. You currently draw with an almost black color. 1 Quote Link to comment Share on other sites More sharing options...
SpiderPig Posted July 11, 2018 Share Posted July 11, 2018 Ah I see it now, your doing a pick again but this time the sphere is in the way. Try setting the spheres pick mode to '0' I think it is... or what would be better is to do the check once. bool success = world->Pick(rayCastFirst, rayCastEnd, pickInfo, 0, true); //Now use pickInfo 1 Quote Link to comment Share on other sites More sharing options...
ScarPunk Posted July 11, 2018 Author Share Posted July 11, 2018 9 hours ago, SpiderPig said: Ah I see it now, your doing a pick again but this time the sphere is in the way. Try setting the spheres pick mode to '0' I think it is... or what would be better is to do the check once. bool success = world->Pick(rayCastFirst, rayCastEnd, pickInfo, 0, true); //Now use pickInfo 9 hours ago, AggrorJorn said: Try setting the same color as when drawing the FPS. You currently draw with an almost black color. I tried both solutions without success but i find a fix ! I need to draw the keyvalue before drawing the line. This is good but i don't know why it's work ;( bool App::Loop() { //quit ? if (window->Closed() or window->KeyHit(Key::Escape))return false; Red->Move(); Green->Move(); Blue->Move(); world->Update(); if (window->KeyDown(Key::Right)) { camera->SetRotation(Vec3(camera->GetRotation().x, camera->GetRotation().y + 4, camera->GetRotation().z)); } //REFRESH STUFF Time::Update(); context->SetColor(0, 0, 0, 0); context->Clear(); world->Render(); //DRAW FPS context->SetBlendMode(Blend::Alpha); context->SetColor(255, 0, 0, 1); context->DrawText("FPS : " + String(Time::UPS()), 10, 20); //if hit DRAW KEY VALUE if (world->Pick(rayCastFirst, rayCastEnd, pickInfo, 0, true)) { //fail //context->SetBlendMode(Blend::Alpha); context->SetColor(1, 1, 1, 1); context->DrawText(pickInfo.entity->GetKeyValue("Color"), 20, 40); } //DRAW LINE context->SetBlendMode(Blend::Solid); context->SetColor((world->Pick(rayCastFirst, rayCastEnd, pickInfo) ? (rayCastColorOn) : (rayCastColorOff))); context->DrawLine(camera->Project(rayCastFirst).x, camera->Project(rayCastFirst).y, camera->Project(rayCastEnd).x, camera->Project(rayCastEnd).y); //set sphere to hit hitSphere->SetPosition((world->Pick(rayCastFirst, rayCastEnd, pickInfo,0,true)) ? (pickInfo.position) : (rayCastFirst) ); context->Sync(true); return true; } Quote ART CODE SOUND Link to comment Share on other sites More sharing options...
SpiderPig Posted July 12, 2018 Share Posted July 12, 2018 Glad you got it working. Your code at the moment is very inefficient. You should structure it like this; ... world->Render(); //DRAW FPS context->SetBlendMode(Blend::Alpha); context->SetColor(1, 0, 0, 1); //Use values 0.0 to 1.0 context->DrawText("FPS : " + String(Time::UPS()), 10, 20); PickInfo pickInfo; bool success = world->Pick(rayCastFirst, rayCastEnd, pickInfo); if(success == true) { //DRAW LINE Vec3 firstPos = camera->Project(rayCastFirst); Vec3 lastPos = camera->Project(rayCastEnd); context->DrawLine(firstPos.x, firstPos.y, lastPos.x, lastPos.y); //DRAW KEY VALUE context->SetColor(1, 1, 1, 1); context->DrawText(pickInfo.entity->GetKeyValue("Color"), 20, 40); } //set sphere to hit hitSphere->SetPosition((success == true) ? (pickInfo.position) : (rayCastFirst)); context->SetBlendMode(Blend::Solid); context->Sync(true); ... 2 Quote Link to comment Share on other sites More sharing options...
ScarPunk Posted July 12, 2018 Author Share Posted July 12, 2018 6 hours ago, SpiderPig said: Glad you got it working. Your code at the moment is very inefficient. You should structure it like this; ... world->Render(); //DRAW FPS context->SetBlendMode(Blend::Alpha); context->SetColor(1, 0, 0, 1); //Use values 0.0 to 1.0 context->DrawText("FPS : " + String(Time::UPS()), 10, 20); PickInfo pickInfo; bool success = world->Pick(rayCastFirst, rayCastEnd, pickInfo); if(success == true) { //DRAW LINE Vec3 firstPos = camera->Project(rayCastFirst); Vec3 lastPos = camera->Project(rayCastEnd); context->DrawLine(firstPos.x, firstPos.y, lastPos.x, lastPos.y); //DRAW KEY VALUE context->SetColor(1, 1, 1, 1); context->DrawText(pickInfo.entity->GetKeyValue("Color"), 20, 40); } //set sphere to hit hitSphere->SetPosition((success == true) ? (pickInfo.position) : (rayCastFirst)); context->SetBlendMode(Blend::Solid); context->Sync(true); ... It works thanks SpiderPig 1 Quote ART CODE SOUND Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.